2005-05-06 Paul Jakma <paul@dishone.st>

	* (general) extern and static'ification of functions in code and
	  header.
	  Cleanup any definitions with unspecified arguments.
	  Add casts for callback assignments where the callback is defined,
	  typically, as passing void *, but the function being assigned has
	  some other pointer type defined as its argument, as gcc complains
	  about casts from void * to X* via function arguments.
	  Fix some old K&R style function argument definitions.
	  Add noreturn gcc attribute to some functions, as appropriate.
	  Add unused gcc attribute to some functions (eg ones meant to help
	  while debugging)
	  Add guard defines to headers which were missing them.
	* command.c: (install_node) add const qualifier, still doesnt shut
	  up the warning though, because of the double pointer.
	  (cmp_node) ditto
	* keychain.c: (key_str2time) Add GET_LONG_RANGE() macro, derived
	  fromn vty.h ones to fix some of the (long) < 0 warnings.
	* thread.c: (various) use thread_empty
	  (cpu_record_hash_key) should cast to uintptr_t, a stdint.h type
	* vty.h: Add VTY_GET_IPV4_ADDRESS and VTY_GET_IPV4_PREFIX so they
	  removed from ospfd/ospf_vty.h
	* zebra.h: Move definition of ZEBRA_PORT to here, to remove
	  dependence of lib on zebra/zserv.h
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 38f9cf6..f514532 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,29 @@
+2005-05-06 Paul Jakma <paul@dishone.st>
+
+	* (general) extern and static'ification of functions in code and
+	  header.
+	  Cleanup any definitions with unspecified arguments.
+	  Add casts for callback assignments where the callback is defined,
+	  typically, as passing void *, but the function being assigned has
+	  some other pointer type defined as its argument, as gcc complains 
+	  about casts from void * to X* via function arguments.
+	  Fix some old K&R style function argument definitions.
+	  Add noreturn gcc attribute to some functions, as appropriate.
+	  Add unused gcc attribute to some functions (eg ones meant to help
+	  while debugging)
+	  Add guard defines to headers which were missing them.
+	* command.c: (install_node) add const qualifier, still doesnt shut
+	  up the warning though, because of the double pointer.
+	  (cmp_node) ditto
+	* keychain.c: (key_str2time) Add GET_LONG_RANGE() macro, derived 
+	  fromn vty.h ones to fix some of the (long) < 0 warnings.
+	* thread.c: (various) use thread_empty
+	  (cpu_record_hash_key) should cast to uintptr_t, a stdint.h type
+	* vty.h: Add VTY_GET_IPV4_ADDRESS and VTY_GET_IPV4_PREFIX so they
+	  removed from ospfd/ospf_vty.h
+	* zebra.h: Move definition of ZEBRA_PORT to here, to remove
+	  dependence of lib on zebra/zserv.h
+
 2005-05-06 Hasso Tepper <hasso at quagga.net>
 
 	* sockunion.c: Fix warning message.
diff --git a/lib/buffer.h b/lib/buffer.h
index 249354c..6c3dc76 100644
--- a/lib/buffer.h
+++ b/lib/buffer.h
@@ -27,14 +27,14 @@
 /* Create a new buffer.  Memory will be allocated in chunks of the given
    size.  If the argument is 0, the library will supply a reasonable
    default size suitable for buffering socket I/O. */
-struct buffer *buffer_new (size_t);
+extern struct buffer *buffer_new (size_t);
 
 /* Free all data in the buffer. */
-void buffer_reset (struct buffer *);
+extern void buffer_reset (struct buffer *);
 
 /* This function first calls buffer_reset to release all buffered data.
    Then it frees the struct buffer itself. */
-void buffer_free (struct buffer *);
+extern void buffer_free (struct buffer *);
 
 /* Add the given data to the end of the buffer. */
 extern void buffer_put (struct buffer *, const void *, size_t);
diff --git a/lib/checksum.c b/lib/checksum.c
index 6a29cba..8c0ea52 100644
--- a/lib/checksum.c
+++ b/lib/checksum.c
@@ -9,9 +9,7 @@
 #include <zebra.h>
 
 int				/* return checksum in low-order 16 bits */
-in_cksum(ptr, nbytes)
-register u_short	*ptr;
-register int		nbytes;
+in_cksum(u_short *ptr, int nbytes)
 {
 	register long		sum;		/* assumes long == 32 bits */
 	u_short			oddbyte;
diff --git a/lib/command.c b/lib/command.c
index 9b5f75f..83b8a95 100644
--- a/lib/command.c
+++ b/lib/command.c
@@ -1,5 +1,5 @@
 /*
-   $Id: command.c,v 1.47 2005/04/25 16:26:42 paul Exp $
+   $Id: command.c,v 1.48 2005/05/06 21:25:49 paul Exp $
  
    Command interpreter routine for virtual terminal [aka TeletYpe]
    Copyright (C) 1997, 98, 99 Kunihiro Ishiguro
@@ -193,8 +193,8 @@
 static int
 cmp_node (const void *p, const void *q)
 {
-  struct cmd_element *a = *(struct cmd_element **)p;
-  struct cmd_element *b = *(struct cmd_element **)q;
+  const struct cmd_element *a = *(struct cmd_element **)p;
+  const struct cmd_element *b = *(struct cmd_element **)q;
 
   return strcmp (a->string, b->string);
 }
@@ -202,8 +202,8 @@
 static int
 cmp_desc (const void *p, const void *q)
 {
-  struct desc *a = *(struct desc **)p;
-  struct desc *b = *(struct desc **)q;
+  const struct desc *a = *(struct desc **)p;
+  const struct desc *b = *(struct desc **)q;
 
   return strcmp (a->cmd, b->cmd);
 }
diff --git a/lib/command.h b/lib/command.h
index 6fd42fa..5328888 100644
--- a/lib/command.h
+++ b/lib/command.h
@@ -318,27 +318,27 @@
 #endif /* HAVE_IPV6 */
 
 /* Prototypes. */
-void install_node (struct cmd_node *, int (*) (struct vty *));
-void install_default (enum node_type);
-void install_element (enum node_type, struct cmd_element *);
-void sort_node ();
+extern void install_node (struct cmd_node *, int (*) (struct vty *));
+extern void install_default (enum node_type);
+extern void install_element (enum node_type, struct cmd_element *);
+extern void sort_node (void);
 
 /* Concatenates argv[shift] through argv[argc-1] into a single NUL-terminated
    string with a space between each element (allocated using
    XMALLOC(MTYPE_TMP)).  Returns NULL if shift >= argc. */
-char *argv_concat (const char **argv, int argc, int shift);
+extern char *argv_concat (const char **argv, int argc, int shift);
 
-vector cmd_make_strvec (const char *);
-void cmd_free_strvec (vector);
-vector cmd_describe_command ();
-char **cmd_complete_command ();
-const char *cmd_prompt (enum node_type);
-int config_from_file (struct vty *, FILE *);
-enum node_type node_parent (enum node_type);
-int cmd_execute_command (vector, struct vty *, struct cmd_element **, int);
-int cmd_execute_command_strict (vector, struct vty *, struct cmd_element **);
-void config_replace_string (struct cmd_element *, char *, ...);
-void cmd_init (int);
+extern vector cmd_make_strvec (const char *);
+extern void cmd_free_strvec (vector);
+extern vector cmd_describe_command (vector, struct vty *, int *status);
+extern char **cmd_complete_command (vector, struct vty *, int *status);
+extern const char *cmd_prompt (enum node_type);
+extern int config_from_file (struct vty *, FILE *);
+extern enum node_type node_parent (enum node_type);
+extern int cmd_execute_command (vector, struct vty *, struct cmd_element **, int);
+extern int cmd_execute_command_strict (vector, struct vty *, struct cmd_element **);
+extern void config_replace_string (struct cmd_element *, char *, ...);
+extern void cmd_init (int);
 
 /* Export typical functions. */
 extern struct cmd_element config_end_cmd;
@@ -346,9 +346,9 @@
 extern struct cmd_element config_quit_cmd;
 extern struct cmd_element config_help_cmd;
 extern struct cmd_element config_list_cmd;
-char *host_config_file ();
-void host_config_set (char *);
+extern char *host_config_file (void);
+extern void host_config_set (char *);
 
-void print_version (const char *);
-
+extern void print_version (const char *);
+  
 #endif /* _ZEBRA_COMMAND_H */
diff --git a/lib/distribute.c b/lib/distribute.c
index 48eb040..3d61621 100644
--- a/lib/distribute.c
+++ b/lib/distribute.c
@@ -35,8 +35,8 @@
 void (*distribute_add_hook) (struct distribute *);
 void (*distribute_delete_hook) (struct distribute *);
 
-struct distribute *
-distribute_new ()
+static struct distribute *
+distribute_new (void)
 {
   struct distribute *new;
 
@@ -47,7 +47,7 @@
 }
 
 /* Free distribute object. */
-void
+static void
 distribute_free (struct distribute *dist)
 {
   if (dist->ifname)
@@ -93,7 +93,7 @@
   distribute_delete_hook = func;
 }
 
-void *
+static void *
 distribute_hash_alloc (struct distribute *arg)
 {
   struct distribute *dist;
@@ -107,7 +107,7 @@
 }
 
 /* Make new distribute list and push into hash. */
-struct distribute *
+static struct distribute *
 distribute_get (const char *ifname)
 {
   struct distribute key;
@@ -115,10 +115,10 @@
   /* temporary reference */
   key.ifname = (char *)ifname;
   
-  return hash_get (disthash, &key, distribute_hash_alloc);
+  return hash_get (disthash, &key, (void * (*) (void *))distribute_hash_alloc);
 }
 
-unsigned int
+static unsigned int
 distribute_hash_make (struct distribute *dist)
 {
   unsigned int i, key;
@@ -133,7 +133,7 @@
 
 /* If two distribute-list have same value then return 1 else return
    0. This function is used by hash package. */
-int
+static int
 distribute_cmp (struct distribute *dist1, struct distribute *dist2)
 {
   if (dist1->ifname && dist2->ifname)
@@ -145,7 +145,7 @@
 }
 
 /* Set access-list name to the distribute list. */
-struct distribute *
+static struct distribute *
 distribute_list_set (const char *ifname, enum distribute_type type, 
                      const char *alist_name)
 {
@@ -174,7 +174,7 @@
 
 /* Unset distribute-list.  If matched distribute-list exist then
    return 1. */
-int
+static int
 distribute_list_unset (const char *ifname, enum distribute_type type, 
 		       const char *alist_name)
 {
@@ -223,7 +223,7 @@
 }
 
 /* Set access-list name to the distribute list. */
-struct distribute *
+static struct distribute *
 distribute_list_prefix_set (const char *ifname, enum distribute_type type,
 			    const char *plist_name)
 {
@@ -252,7 +252,7 @@
 
 /* Unset distribute-list.  If matched distribute-list exist then
    return 1. */
-int
+static int
 distribute_list_prefix_unset (const char *ifname, enum distribute_type type,
 			      const char *plist_name)
 {
@@ -768,7 +768,8 @@
 void
 distribute_list_init (int node)
 {
-  disthash = hash_create (distribute_hash_make, distribute_cmp);
+  disthash = hash_create ((unsigned int (*) (void *)) distribute_hash_make,
+                          (int (*) (void *, void *)) distribute_cmp);
 
   if(node==RIP_NODE) {
     install_element (RIP_NODE, &distribute_list_all_cmd);
diff --git a/lib/distribute.h b/lib/distribute.h
index 77bb875..a1bec03 100644
--- a/lib/distribute.h
+++ b/lib/distribute.h
@@ -43,15 +43,15 @@
 };
 
 /* Prototypes for distribute-list. */
-void distribute_list_init (int);
-void distribute_list_reset (void);
-void distribute_list_add_hook (void (*) (struct distribute *));
-void distribute_list_delete_hook (void (*) (struct distribute *));
-struct distribute *distribute_lookup (const char *);
-int config_write_distribute (struct vty *);
-int config_show_distribute (struct vty *);
+extern void distribute_list_init (int);
+extern void distribute_list_reset (void);
+extern void distribute_list_add_hook (void (*) (struct distribute *));
+extern void distribute_list_delete_hook (void (*) (struct distribute *));
+extern struct distribute *distribute_lookup (const char *);
+extern int config_write_distribute (struct vty *);
+extern int config_show_distribute (struct vty *);
 
-enum filter_type distribute_apply_in (struct interface *, struct prefix *);
-enum filter_type distribute_apply_out (struct interface *, struct prefix *);
+extern enum filter_type distribute_apply_in (struct interface *, struct prefix *);
+extern enum filter_type distribute_apply_out (struct interface *, struct prefix *);
 
 #endif /* _ZEBRA_DISTRIBUTE_H */
diff --git a/lib/filter.c b/lib/filter.c
index 0dd7a77..55bcdf4 100644
--- a/lib/filter.c
+++ b/lib/filter.c
@@ -84,10 +84,10 @@
   struct access_list_list str;
 
   /* Hook function which is executed when new access_list is added. */
-  void (*add_hook) ();
+  void (*add_hook) (struct access_list *);
 
   /* Hook function which is executed when access_list is deleted. */
-  void (*delete_hook) ();
+  void (*delete_hook) (struct access_list *);
 };
 
 /* Static structure for IPv4 access_list's master. */
@@ -110,7 +110,7 @@
 };
 #endif /* HAVE_IPV6 */
 
-struct access_master *
+static struct access_master *
 access_master_get (afi_t afi)
 {
   if (afi == AFI_IP)
@@ -123,14 +123,14 @@
 }
 
 /* Allocate new filter structure. */
-struct filter *
-filter_new ()
+static struct filter *
+filter_new (void)
 {
   return (struct filter *) XCALLOC (MTYPE_ACCESS_FILTER,
 				    sizeof (struct filter));
 }
 
-void
+static void
 filter_free (struct filter *filter)
 {
   XFREE (MTYPE_ACCESS_FILTER, filter);
@@ -209,22 +209,22 @@
 }
 
 /* Allocate new access list structure. */
-struct access_list *
-access_list_new ()
+static struct access_list *
+access_list_new (void)
 {
   return (struct access_list *) XCALLOC (MTYPE_ACCESS_LIST,
 					 sizeof (struct access_list));
 }
 
 /* Free allocated access_list. */
-void
+static void
 access_list_free (struct access_list *access)
 {
   XFREE (MTYPE_ACCESS_LIST, access);
 }
 
 /* Delete access_list from access_master and free it. */
-void
+static void
 access_list_delete (struct access_list *access)
 {
   struct filter *filter;
@@ -266,7 +266,7 @@
 
 /* Insert new access list to list of access_list.  Each acceess_list
    is sorted by the name. */
-struct access_list *
+static struct access_list *
 access_list_insert (afi_t afi, const char *name)
 {
   unsigned int i;
@@ -383,7 +383,7 @@
 
 /* Get access list from list of access_list.  If there isn't matched
    access_list create new one and return it. */
-struct access_list *
+static struct access_list *
 access_list_get (afi_t afi, const char *name)
 {
   struct access_list *access;
@@ -444,7 +444,7 @@
 }
 
 /* Add new filter to the end of specified access_list. */
-void
+static void
 access_list_filter_add (struct access_list *access, struct filter *filter)
 {
   filter->next = NULL;
@@ -473,7 +473,7 @@
 
 /* Delete filter from specified access_list.  If there is hook
    function execute it. */
-void
+static void
 access_list_filter_delete (struct access_list *access, struct filter *filter)
 {
   struct access_master *master;
@@ -513,7 +513,7 @@
   host                 A single host address
 */
 
-struct filter *
+static struct filter *
 filter_lookup_cisco (struct access_list *access, struct filter *mnew)
 {
   struct filter *mfilter;
@@ -547,7 +547,7 @@
   return NULL;
 }
 
-struct filter *
+static struct filter *
 filter_lookup_zebra (struct access_list *access, struct filter *mnew)
 {
   struct filter *mfilter;
@@ -568,7 +568,7 @@
   return NULL;
 }
 
-int
+static int
 vty_access_list_remark_unset (struct vty *vty, afi_t afi, const char *name)
 {
   struct access_list *access;
@@ -593,7 +593,7 @@
   return CMD_SUCCESS;
 }
 
-int
+static int
 filter_set_cisco (struct vty *vty, const char *name_str, const char *type_str,
 		  const char *addr_str, const char *addr_mask_str,
 		  const char *mask_str, const char *mask_mask_str,
@@ -1152,7 +1152,7 @@
 			   "255.255.255.255", 1, 0);
 }
 
-int
+static int
 filter_set_zebra (struct vty *vty, const char *name_str, const char *type_str,
 		  afi_t afi, const char *prefix_str, int exact, int set)
 {
@@ -1567,7 +1567,7 @@
 void config_write_access_cisco (struct vty *, struct filter *);
 
 /* show access-list command. */
-int
+static int
 filter_show (struct vty *vty, const char *name, afi_t afi)
 {
   struct access_list *access;
@@ -1782,7 +1782,7 @@
   vty_out (vty, "%s", VTY_NEWLINE);
 }
 
-int
+static int
 config_write_access (struct vty *vty, afi_t afi)
 {
   struct access_list *access;
@@ -1858,14 +1858,14 @@
   1
 };
 
-int
+static int
 config_write_access_ipv4 (struct vty *vty)
 {
   return config_write_access (vty, AFI_IP);
 }
 
-void
-access_list_reset_ipv4 ()
+static void
+access_list_reset_ipv4 (void)
 {
   struct access_list *access;
   struct access_list *next;
@@ -1894,8 +1894,8 @@
 }
 
 /* Install vty related command. */
-void
-access_list_init_ipv4 ()
+static void
+access_list_init_ipv4 (void)
 {
   install_node (&access_node, config_write_access_ipv4);
 
@@ -1954,14 +1954,14 @@
   1
 };
 
-int
+static int
 config_write_access_ipv6 (struct vty *vty)
 {
   return config_write_access (vty, AFI_IP6);
 }
 
-void
-access_list_reset_ipv6 ()
+static void
+access_list_reset_ipv6 (void)
 {
   struct access_list *access;
   struct access_list *next;
@@ -1989,8 +1989,8 @@
   assert (master->str.tail == NULL);
 }
 
-void
-access_list_init_ipv6 ()
+static void
+access_list_init_ipv6 (void)
 {
   install_node (&access_ipv6_node, config_write_access_ipv6);
 
diff --git a/lib/filter.h b/lib/filter.h
index a33e7bf..37535cb 100644
--- a/lib/filter.h
+++ b/lib/filter.h
@@ -57,11 +57,11 @@
 };
 
 /* Prototypes for access-list. */
-void access_list_init (void);
-void access_list_reset (void);
-void access_list_add_hook (void (*func)(struct access_list *));
-void access_list_delete_hook (void (*func)(struct access_list *));
-struct access_list *access_list_lookup (afi_t, const char *);
-enum filter_type access_list_apply (struct access_list *, void *);
+extern void access_list_init (void);
+extern void access_list_reset (void);
+extern void access_list_add_hook (void (*func)(struct access_list *));
+extern void access_list_delete_hook (void (*func)(struct access_list *));
+extern struct access_list *access_list_lookup (afi_t, const char *);
+extern enum filter_type access_list_apply (struct access_list *, void *);
 
 #endif /* _ZEBRA_FILTER_H */
diff --git a/lib/getopt.h b/lib/getopt.h
index fb30719..c4519b7 100644
--- a/lib/getopt.h
+++ b/lib/getopt.h
@@ -105,7 +105,7 @@
    errors, only prototype getopt for the GNU C library.  */
 extern int getopt (int argc, char *const *argv, const char *shortopts);
 #else /* not __GNU_LIBRARY__ */
-extern int getopt ();
+extern int getopt (void);
 #endif /* __GNU_LIBRARY__ */
 extern int getopt_long (int argc, char *const *argv, const char *shortopts,
 		        const struct option *longopts, int *longind);
diff --git a/lib/hash.c b/lib/hash.c
index 04549ad..76bf802 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -26,8 +26,8 @@
 
 /* Allocate a new hash.  */
 struct hash *
-hash_create_size (unsigned int size, 
-		  unsigned int (*hash_key) (), int (*hash_cmp) ())
+hash_create_size (unsigned int size, unsigned int (*hash_key) (void *),
+                                     int (*hash_cmp) (void *, void *))
 {
   struct hash *hash;
 
@@ -45,7 +45,8 @@
 
 /* Allocate a new hash with default hash size.  */
 struct hash *
-hash_create (unsigned int (*hash_key) (), int (*hash_cmp) ())
+hash_create (unsigned int (*hash_key) (void *), 
+             int (*hash_cmp) (void *, void *))
 {
   return hash_create_size (HASHTABSIZE, hash_key, hash_cmp);
 }
@@ -63,7 +64,7 @@
    corresponding hash backet and alloc_func is specified, create new
    hash backet.  */
 void *
-hash_get (struct hash *hash, void *data, void * (*alloc_func) ())
+hash_get (struct hash *hash, void *data, void * (*alloc_func) (void *))
 {
   unsigned int key;
   unsigned int index;
diff --git a/lib/hash.h b/lib/hash.h
index 715e53b..a6e3d59 100644
--- a/lib/hash.h
+++ b/lib/hash.h
@@ -45,27 +45,29 @@
   unsigned int size;
 
   /* Key make function. */
-  unsigned int (*hash_key) ();
+  unsigned int (*hash_key) (void *);
 
   /* Data compare function. */
-  int (*hash_cmp) ();
+  int (*hash_cmp) (void *, void *);
 
   /* Backet alloc. */
   unsigned long count;
 };
 
-struct hash *hash_create (unsigned int (*) (), int (*) ());
-struct hash *hash_create_size (unsigned int, unsigned int (*) (), int (*) ());
+extern struct hash *hash_create (unsigned int (*) (void *), 
+                          int (*) (void *, void *));
+extern struct hash *hash_create_size (unsigned int, unsigned int (*) (void *), 
+                                             int (*) (void *, void *));
 
-void *hash_get (struct hash *, void *, void * (*) ());
-void *hash_alloc_intern (void *);
-void *hash_lookup (struct hash *, void *);
-void *hash_release (struct hash *, void *);
+extern void *hash_get (struct hash *, void *, void * (*) (void *));
+extern void *hash_alloc_intern (void *);
+extern void *hash_lookup (struct hash *, void *);
+extern void *hash_release (struct hash *, void *);
 
-void hash_iterate (struct hash *, 
+extern void hash_iterate (struct hash *, 
 		   void (*) (struct hash_backet *, void *), void *);
 
-void hash_clean (struct hash *, void (*) (void *));
-void hash_free (struct hash *);
+extern void hash_clean (struct hash *, void (*) (void *));
+extern void hash_free (struct hash *);
 
 #endif /* _ZEBRA_HASH_H */
diff --git a/lib/if.c b/lib/if.c
index 35fe9ca..a57da35 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -191,13 +191,13 @@
   return NULL;
 }
 
-char *
+const char *
 ifindex2ifname (unsigned int index)
 {
   struct interface *ifp;
 
   return ((ifp = if_lookup_by_index(index)) != NULL) ?
-  	 ifp->name : (char *)"unknown";
+  	 ifp->name : "unknown";
 }
 
 unsigned int
@@ -434,7 +434,7 @@
 }
 
 /* For debugging */
-void
+static void
 if_dump (struct interface *ifp)
 {
   struct listnode *node;
@@ -587,7 +587,7 @@
 
 /* Allocate connected structure. */
 struct connected *
-connected_new ()
+connected_new (void)
 {
   struct connected *new = XMALLOC (MTYPE_CONNECTED, sizeof (struct connected));
   memset (new, 0, sizeof (struct connected));
@@ -611,7 +611,7 @@
 }
 
 /* Print if_addr structure. */
-void
+static void __attribute__ ((unused))
 connected_log (struct connected *connected, char *str)
 {
   struct prefix *p;
@@ -637,7 +637,7 @@
 }
 
 /* If two connected address has same prefix return 1. */
-int
+static int
 connected_same_prefix (struct prefix *p1, struct prefix *p2)
 {
   if (p1->family == p2->family)
@@ -767,13 +767,16 @@
 }
 #endif
 
+#if 0 /* this route_table of struct connected's is unused
+       * however, it would be good to use a route_table rather than
+       * a list..
+       */
 /* Interface looking up by interface's address. */
-
 /* Interface's IPv4 address reverse lookup table. */
 struct route_table *ifaddr_ipv4_table;
 /* struct route_table *ifaddr_ipv6_table; */
 
-void
+static void
 ifaddr_ipv4_add (struct in_addr *ifaddr, struct interface *ifp)
 {
   struct route_node *rn;
@@ -794,7 +797,7 @@
   rn->info = ifp;
 }
 
-void
+static void
 ifaddr_ipv4_delete (struct in_addr *ifaddr, struct interface *ifp)
 {
   struct route_node *rn;
@@ -817,7 +820,7 @@
 }
 
 /* Lookup interface by interface's IP address or interface index. */
-struct interface *
+static struct interface *
 ifaddr_ipv4_lookup (struct in_addr *addr, unsigned int ifindex)
 {
   struct prefix_ipv4 p;
@@ -841,13 +844,16 @@
   else
     return if_lookup_by_index(ifindex);
 }
+#endif /* ifaddr_ipv4_table */
 
 /* Initialize interface list. */
 void
-if_init ()
+if_init (void)
 {
   iflist = list_new ();
+#if 0
   ifaddr_ipv4_table = route_table_init ();
+#endif /* ifaddr_ipv4_table */
 
   if (iflist) {
     iflist->cmp = (int (*)(void *, void *))if_cmp_func;
diff --git a/lib/if.h b/lib/if.h
index 6946865..8126ea9 100644
--- a/lib/if.h
+++ b/lib/if.h
@@ -211,16 +211,16 @@
 #endif /* IFF_VIRTUAL */
 
 /* Prototypes. */
-int if_cmp_func (struct interface *, struct interface *);
-struct interface *if_create (const char *name, int namelen);
-struct interface *if_lookup_by_index (unsigned int);
-struct interface *if_lookup_exact_address (struct in_addr);
-struct interface *if_lookup_address (struct in_addr);
+extern int if_cmp_func (struct interface *, struct interface *);
+extern struct interface *if_create (const char *name, int namelen);
+extern struct interface *if_lookup_by_index (unsigned int);
+extern struct interface *if_lookup_exact_address (struct in_addr);
+extern struct interface *if_lookup_address (struct in_addr);
 
 /* These 2 functions are to be used when the ifname argument is terminated
    by a '\0' character: */
-struct interface *if_lookup_by_name (const char *ifname);
-struct interface *if_get_by_name (const char *ifname);
+extern struct interface *if_lookup_by_name (const char *ifname);
+extern struct interface *if_get_by_name (const char *ifname);
 
 /* For these 2 functions, the namelen argument should be the precise length
    of the ifname string (not counting any optional trailing '\0' character).
@@ -239,22 +239,22 @@
    deletes it from the interface list and frees the structure. */
 extern void if_delete (struct interface *);
 
-int if_is_up (struct interface *);
-int if_is_running (struct interface *);
-int if_is_operative (struct interface *);
-int if_is_loopback (struct interface *);
-int if_is_broadcast (struct interface *);
-int if_is_pointopoint (struct interface *);
-int if_is_multicast (struct interface *);
-void if_add_hook (int, int (*)(struct interface *));
-void if_init ();
-void if_dump_all ();
+extern int if_is_up (struct interface *);
+extern int if_is_running (struct interface *);
+extern int if_is_operative (struct interface *);
+extern int if_is_loopback (struct interface *);
+extern int if_is_broadcast (struct interface *);
+extern int if_is_pointopoint (struct interface *);
+extern int if_is_multicast (struct interface *);
+extern void if_add_hook (int, int (*)(struct interface *));
+extern void if_init (void);
+extern void if_dump_all (void);
 extern const char *if_flag_dump(unsigned long);
 
 /* Please use ifindex2ifname instead of if_indextoname where possible;
    ifindex2ifname uses internal interface info, whereas if_indextoname must
    make a system call. */
-extern char *ifindex2ifname (unsigned int);
+extern const char *ifindex2ifname (unsigned int);
 
 /* Please use ifname2ifindex instead of if_nametoindex where possible;
    ifname2ifindex uses internal interface info, whereas if_nametoindex must
@@ -262,22 +262,22 @@
 extern unsigned int ifname2ifindex(const char *ifname);
 
 /* Connected address functions. */
-struct connected *connected_new ();
-void connected_free (struct connected *);
-void connected_add (struct interface *, struct connected *);
-struct connected  *connected_add_by_prefix (struct interface *,
+extern struct connected *connected_new (void);
+extern void connected_free (struct connected *);
+extern void connected_add (struct interface *, struct connected *);
+extern struct connected  *connected_add_by_prefix (struct interface *,
                                             struct prefix *,
                                             struct prefix *);
-struct connected  *connected_delete_by_prefix (struct interface *, 
+extern struct connected  *connected_delete_by_prefix (struct interface *, 
                                                struct prefix *);
-struct connected  *connected_lookup_address (struct interface *, 
+extern struct connected  *connected_lookup_address (struct interface *, 
                                              struct in_addr);
 
 #ifndef HAVE_IF_NAMETOINDEX
-unsigned int if_nametoindex (const char *);
+extern unsigned int if_nametoindex (const char *);
 #endif
 #ifndef HAVE_IF_INDEXTONAME
-char *if_indextoname (unsigned int, char *);
+extern char *if_indextoname (unsigned int, char *);
 #endif
 
 /* Exported variables. */
diff --git a/lib/if_rmap.c b/lib/if_rmap.c
index 3f95af3..6730e94 100644
--- a/lib/if_rmap.c
+++ b/lib/if_rmap.c
@@ -30,11 +30,11 @@
 struct hash *ifrmaphash;
 
 /* Hook functions. */
-void (*if_rmap_add_hook) (struct if_rmap *) = NULL;
-void (*if_rmap_delete_hook) (struct if_rmap *) = NULL;
+static void (*if_rmap_add_hook) (struct if_rmap *) = NULL;
+static void (*if_rmap_delete_hook) (struct if_rmap *) = NULL;
 
-struct if_rmap *
-if_rmap_new ()
+static struct if_rmap *
+if_rmap_new (void)
 {
   struct if_rmap *new;
 
@@ -43,7 +43,7 @@
   return new;
 }
 
-void
+static void
 if_rmap_free (struct if_rmap *if_rmap)
 {
   if (if_rmap->ifname)
@@ -83,18 +83,19 @@
   if_rmap_delete_hook = func;
 }
 
-void *
-if_rmap_hash_alloc (struct if_rmap *arg)
+static void *
+if_rmap_hash_alloc (void *arg)
 {
+  struct if_rmap *ifarg = arg;
   struct if_rmap *if_rmap;
 
   if_rmap = if_rmap_new ();
-  if_rmap->ifname = strdup (arg->ifname);
+  if_rmap->ifname = strdup (ifarg->ifname);
 
   return if_rmap;
 }
 
-struct if_rmap *
+static struct if_rmap *
 if_rmap_get (const char *ifname)
 {
   struct if_rmap key;
@@ -105,9 +106,10 @@
   return (struct if_rmap *) hash_get (ifrmaphash, &key, if_rmap_hash_alloc);
 }
 
-unsigned int
-if_rmap_hash_make (struct if_rmap *if_rmap)
+static unsigned int
+if_rmap_hash_make (void *data)
 {
+  struct if_rmap *if_rmap = data;
   unsigned int i, key;
 
   key = 0;
@@ -117,15 +119,17 @@
   return key;
 }
 
-int
-if_rmap_hash_cmp (struct if_rmap *if_rmap1, struct if_rmap *if_rmap2)
+static int
+if_rmap_hash_cmp (void *arg1, void* arg2)
 {
+  struct if_rmap *if_rmap1 = arg1;
+  struct if_rmap *if_rmap2 = arg2;
   if (strcmp (if_rmap1->ifname, if_rmap2->ifname) == 0)
     return 1;
   return 0;
 }
 
-struct if_rmap *
+static struct if_rmap *
 if_rmap_set (const char *ifname, enum if_rmap_type type, 
              const char *routemap_name)
 {
@@ -152,7 +156,7 @@
   return if_rmap;
 }
 
-int
+static int
 if_rmap_unset (const char *ifname, enum if_rmap_type type, 
                const char *routemap_name)
 {
diff --git a/lib/if_rmap.h b/lib/if_rmap.h
index 540d68f..e6c2966 100644
--- a/lib/if_rmap.h
+++ b/lib/if_rmap.h
@@ -37,11 +37,11 @@
   char *routemap[IF_RMAP_MAX];
 };
 
-void if_rmap_init (int);
-void if_rmap_reset (void);
-void if_rmap_hook_add (void (*) (struct if_rmap *));
-void if_rmap_hook_delete (void (*) (struct if_rmap *));
-struct if_rmap *if_rmap_lookup (const char *);
-int config_write_if_rmap (struct vty *);
+extern void if_rmap_init (int);
+extern void if_rmap_reset (void);
+extern void if_rmap_hook_add (void (*) (struct if_rmap *));
+extern void if_rmap_hook_delete (void (*) (struct if_rmap *));
+extern struct if_rmap *if_rmap_lookup (const char *);
+extern int config_write_if_rmap (struct vty *);
 
 #endif /* _ZEBRA_IF_RMAP_H */
diff --git a/lib/jhash.h b/lib/jhash.h
index 86a721c..44dd1b5 100644
--- a/lib/jhash.h
+++ b/lib/jhash.h
@@ -24,12 +24,12 @@
  * of bytes.  No alignment or length assumptions are made about
  * the input key.
  */
-u_int32_t jhash(void *key, u_int32_t length, u_int32_t initval);
+extern u_int32_t jhash(void *key, u_int32_t length, u_int32_t initval);
 
 /* A special optimized version that handles 1 or more of u_int32_ts.
  * The length parameter here is the number of u_int32_ts in the key.
  */
-u_int32_t jhash2(u_int32_t *k, u_int32_t length, u_int32_t initval);
+extern u_int32_t jhash2(u_int32_t *k, u_int32_t length, u_int32_t initval);
 
 /* A special ultra-optimized versions that knows they are hashing exactly
  * 3, 2 or 1 word(s).
@@ -37,8 +37,8 @@
  * NOTE: In partilar the "c += length; __jhash_mix(a,b,c);" normally
  *       done at the end is not done here.
  */
-u_int32_t jhash_3words(u_int32_t a, u_int32_t b, u_int32_t c, u_int32_t initval);
-u_int32_t jhash_2words(u_int32_t a, u_int32_t b, u_int32_t initval);
-u_int32_t jhash_1word(u_int32_t a, u_int32_t initval);
+extern u_int32_t jhash_3words(u_int32_t a, u_int32_t b, u_int32_t c, u_int32_t initval);
+extern u_int32_t jhash_2words(u_int32_t a, u_int32_t b, u_int32_t initval);
+extern u_int32_t jhash_1word(u_int32_t a, u_int32_t initval);
 
 #endif /* _QUAGGA_JHASH_H */
diff --git a/lib/keychain.c b/lib/keychain.c
index 2b5b068..10928b1 100644
--- a/lib/keychain.c
+++ b/lib/keychain.c
@@ -28,8 +28,8 @@
 /* Master list of key chain. */
 struct list *keychain_list;
 
-struct keychain *
-keychain_new ()
+static struct keychain *
+keychain_new (void)
 {
   struct keychain *new;
   new = XMALLOC (MTYPE_KEYCHAIN, sizeof (struct keychain));
@@ -37,14 +37,14 @@
   return new;
 }
 
-void
+static void
 keychain_free (struct keychain *keychain)
 {
   XFREE (MTYPE_KEYCHAIN, keychain);
 }
 
-struct key *
-key_new ()
+static struct key *
+key_new (void)
 {
   struct key *new;
   new = XMALLOC (MTYPE_KEY, sizeof (struct key));
@@ -52,7 +52,7 @@
   return new;
 }
 
-void
+static void
 key_free (struct key *key)
 {
   XFREE (MTYPE_KEY, key);
@@ -75,9 +75,12 @@
   return NULL;
 }
 
-int
-key_cmp_func (const struct key *k1, const struct key *k2)
+static int
+key_cmp_func (void *arg1, void *arg2)
 {
+  const struct key *k1 = arg1;
+  const struct key *k2 = arg2;
+  
   if (k1->index > k2->index)
     return 1;
   if (k1->index < k2->index)
@@ -85,7 +88,7 @@
   return 0;
 }
 
-void
+static void
 key_delete_func (struct key *key)
 {
   if (key->string)
@@ -93,7 +96,7 @@
   key_free (key);
 }
 
-struct keychain *
+static struct keychain *
 keychain_get (const char *name)
 {
   struct keychain *keychain;
@@ -113,7 +116,7 @@
   return keychain;
 }
 
-void
+static void
 keychain_delete (struct keychain *keychain)
 {
   if (keychain->name)
@@ -124,7 +127,7 @@
   keychain_free (keychain);
 }
 
-struct key *
+static struct key *
 key_lookup (const struct keychain *keychain, u_int32_t index)
 {
   struct listnode *node;
@@ -203,7 +206,7 @@
   return NULL;
 }
 
-struct key *
+static struct key *
 key_get (const struct keychain *keychain, u_int32_t index)
 {
   struct key *key;
@@ -220,7 +223,7 @@
   return key;
 }
 
-void
+static void
 key_delete (struct keychain *keychain, struct key *key)
 {
   listnode_delete (keychain->key, key);
@@ -356,7 +359,7 @@
 
 /* Convert HH:MM:SS MON DAY YEAR to time_t value.  -1 is returned when
    given string is malformed. */
-time_t 
+static time_t 
 key_str2time (const char *time_str, const char *day_str, const char *month_str,
 	      const char *year_str)
 {
@@ -366,7 +369,6 @@
   time_t time;
   unsigned int sec, min, hour;
   unsigned int day, month, year;
-  char *endptr = NULL;
 
   const char *month_name[] = 
   {
@@ -385,6 +387,18 @@
     NULL
   };
 
+#define GET_LONG_RANGE(V,STR,MIN,MAX) \
+{ \
+  unsigned long tmpl; \
+  char *endptr = NULL; \
+  tmpl = strtoul ((STR), &endptr, 10); \
+  if (*endptr != '\0' || tmpl == ULONG_MAX) \
+    return -1; \
+  if ( tmpl < (MIN) || tmpl > (MAX)) \
+    return -1; \
+  (V) = tmpl; \
+}
+      
   /* Check hour field of time_str. */
   colon = strchr (time_str, ':');
   if (colon == NULL)
@@ -392,9 +406,7 @@
   *colon = '\0';
 
   /* Hour must be between 0 and 23. */
-  hour = strtoul (time_str, &endptr, 10);
-  if (hour == ULONG_MAX || *endptr != '\0' || hour < 0 || hour > 23)
-    return -1;
+  GET_LONG_RANGE (hour, time_str, 0, 23);
 
   /* Check min field of time_str. */
   time_str = colon + 1;
@@ -404,9 +416,7 @@
   *colon = '\0';
 
   /* Min must be between 0 and 59. */
-  min = strtoul (time_str, &endptr, 10);
-  if (min == ULONG_MAX || *endptr != '\0' || min < 0 || min > 59)
-    return -1;
+  GET_LONG_RANGE (min, time_str, 0, 59);
 
   /* Check sec field of time_str. */
   time_str = colon + 1;
@@ -414,14 +424,10 @@
     return -1;
   
   /* Sec must be between 0 and 59. */
-  sec = strtoul (time_str, &endptr, 10);
-  if (sec == ULONG_MAX || *endptr != '\0' || sec < 0 || sec > 59)
-    return -1;
+  GET_LONG_RANGE (sec, time_str, 0, 59);
   
   /* Check day_str.  Day must be <1-31>. */
-  day = strtoul (day_str, &endptr, 10);
-  if (day == ULONG_MAX || *endptr != '\0' || day < 0 || day > 31)
-    return -1;
+  GET_LONG_RANGE (day, day_str, 1, 31);
 
   /* Check month_str.  Month must match month_name. */
   month = 0;
@@ -436,9 +442,7 @@
     return -1;
 
   /* Check year_str.  Year must be <1993-2035>. */
-  year = strtoul (year_str, &endptr, 10);
-  if (year == ULONG_MAX || *endptr != '\0' || year < 1993 || year > 2035)
-    return -1;
+  GET_LONG_RANGE (year, year_str, 1993, 2035);
   
   memset (&tm, 0, sizeof (struct tm));
   tm.tm_sec = sec;
@@ -451,9 +455,10 @@
   time = mktime (&tm);
   
   return time;
+#undef GET_LONG_RANGE
 }
 
-int
+static int
 key_lifetime_set (struct vty *vty, struct key_range *krange,
 		  const char *stime_str, const char *sday_str,
 		  const char *smonth_str, const char *syear_str,
@@ -489,7 +494,7 @@
   return CMD_SUCCESS;
 }
 
-int
+static int
 key_lifetime_duration_set (struct vty *vty, struct key_range *krange,
 			   const char *stime_str, const char *sday_str,
 			   const char *smonth_str, const char *syear_str,
@@ -513,7 +518,7 @@
   return CMD_SUCCESS;
 }
 
-int
+static int
 key_lifetime_infinite_set (struct vty *vty, struct key_range *krange,
 			   const char *stime_str, const char *sday_str,
 			   const char *smonth_str, const char *syear_str)
@@ -863,7 +868,7 @@
   1
 };
 
-int
+static int
 keychain_strftime (char *buf, int bufsiz, time_t *time)
 {
   struct tm *tm;
@@ -876,7 +881,7 @@
   return len;
 }
 
-int
+static int
 keychain_config_write (struct vty *vty)
 {
   struct keychain *keychain;
diff --git a/lib/keychain.h b/lib/keychain.h
index e98c403..f962864 100644
--- a/lib/keychain.h
+++ b/lib/keychain.h
@@ -47,10 +47,10 @@
   struct key_range accept;
 };
 
-void keychain_init ();
-struct keychain *keychain_lookup (const char *);
-struct key *key_lookup_for_accept (const struct keychain *, u_int32_t);
-struct key *key_match_for_accept (const struct keychain *, const char *);
-struct key *key_lookup_for_send (const struct keychain *);
+extern void keychain_init (void);
+extern struct keychain *keychain_lookup (const char *);
+extern struct key *key_lookup_for_accept (const struct keychain *, u_int32_t);
+extern struct key *key_match_for_accept (const struct keychain *, const char *);
+extern struct key *key_lookup_for_send (const struct keychain *);
 
 #endif /* _ZEBRA_KEYCHAIN_H */
diff --git a/lib/linklist.c b/lib/linklist.c
index 4c47153..71c4db8 100644
--- a/lib/linklist.c
+++ b/lib/linklist.c
@@ -26,7 +26,7 @@
 
 /* Allocate new list. */
 struct list *
-list_new ()
+list_new (void)
 {
   struct list *new;
 
@@ -44,7 +44,7 @@
 
 /* Allocate new listnode.  Internal use only. */
 static struct listnode *
-listnode_new ()
+listnode_new (void)
 {
   struct listnode *node;
 
diff --git a/lib/linklist.h b/lib/linklist.h
index 80b21f6..cc6867c 100644
--- a/lib/linklist.h
+++ b/lib/linklist.h
@@ -62,26 +62,26 @@
 #define listgetdata(X) (assert((X)->data != NULL), (X)->data)
 
 /* Prototypes. */
-struct list *list_new(); /* encouraged: set list.del callback on new lists */
-void list_free (struct list *);
+extern struct list *list_new(void); /* encouraged: set list.del callback on new lists */
+extern void list_free (struct list *);
 
-void listnode_add (struct list *, void *);
-void listnode_add_sort (struct list *, void *);
-void listnode_add_after (struct list *, struct listnode *, void *);
-void listnode_delete (struct list *, void *);
-struct listnode *listnode_lookup (struct list *, void *);
-void *listnode_head (struct list *);
+extern void listnode_add (struct list *, void *);
+extern void listnode_add_sort (struct list *, void *);
+extern void listnode_add_after (struct list *, struct listnode *, void *);
+extern void listnode_delete (struct list *, void *);
+extern struct listnode *listnode_lookup (struct list *, void *);
+extern void *listnode_head (struct list *);
 
-void list_delete (struct list *);
-void list_delete_all_node (struct list *);
+extern void list_delete (struct list *);
+extern void list_delete_all_node (struct list *);
 
 /* For ospfd and ospf6d. */
-void list_delete_node (struct list *, struct listnode *);
+extern void list_delete_node (struct list *, struct listnode *);
 
 /* For ospf_spf.c */
-void list_add_node_prev (struct list *, struct listnode *, void *);
-void list_add_node_next (struct list *, struct listnode *, void *);
-void list_add_list (struct list *, struct list *);
+extern void list_add_node_prev (struct list *, struct listnode *, void *);
+extern void list_add_node_next (struct list *, struct listnode *, void *);
+extern void list_add_list (struct list *, struct list *);
 
 /* List iteration macro. 
  * Usage: for (ALL_LIST_ELEMENTS (...) { ... }
diff --git a/lib/log.h b/lib/log.h
index 46c4f11..0f058a8 100644
--- a/lib/log.h
+++ b/lib/log.h
@@ -1,5 +1,5 @@
 /*
- * $Id: log.h,v 1.17 2005/01/18 22:18:59 ajs Exp $
+ * $Id: log.h,v 1.18 2005/05/06 21:25:49 paul Exp $
  *
  * Zebra logging funcions.
  * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro
@@ -96,11 +96,11 @@
 extern struct zlog *zlog_default;
 
 /* Open zlog function */
-struct zlog *openzlog (const char *progname, zlog_proto_t protocol,
-		       int syslog_options, int syslog_facility);
+extern struct zlog *openzlog (const char *progname, zlog_proto_t protocol,
+		              int syslog_options, int syslog_facility);
 
 /* Close zlog function. */
-void closezlog (struct zlog *zl);
+extern void closezlog (struct zlog *zl);
 
 /* GCC have printf type attribute check.  */
 #ifdef __GNUC__
@@ -110,41 +110,41 @@
 #endif /* __GNUC__ */
 
 /* Generic function for zlog. */
-void zlog (struct zlog *zl, int priority, const char *format, ...) PRINTF_ATTRIBUTE(3, 4);
+extern void zlog (struct zlog *zl, int priority, const char *format, ...) PRINTF_ATTRIBUTE(3, 4);
 
 /* Handy zlog functions. */
-void zlog_err (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
-void zlog_warn (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
-void zlog_info (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
-void zlog_notice (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
-void zlog_debug (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
+extern void zlog_err (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
+extern void zlog_warn (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
+extern void zlog_info (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
+extern void zlog_notice (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
+extern void zlog_debug (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
 
 /* For bgpd's peer oriented log. */
-void plog_err (struct zlog *, const char *format, ...);
-void plog_warn (struct zlog *, const char *format, ...);
-void plog_info (struct zlog *, const char *format, ...);
-void plog_notice (struct zlog *, const char *format, ...);
-void plog_debug (struct zlog *, const char *format, ...);
+extern void plog_err (struct zlog *, const char *format, ...);
+extern void plog_warn (struct zlog *, const char *format, ...);
+extern void plog_info (struct zlog *, const char *format, ...);
+extern void plog_notice (struct zlog *, const char *format, ...);
+extern void plog_debug (struct zlog *, const char *format, ...);
 
 /* Set logging level for the given destination.  If the log_level
    argument is ZLOG_DISABLED, then the destination is disabled.
    This function should not be used for file logging (use zlog_set_file
    or zlog_reset_file instead). */
-void zlog_set_level (struct zlog *zl, zlog_dest_t, int log_level);
+extern void zlog_set_level (struct zlog *zl, zlog_dest_t, int log_level);
 
 /* Set logging to the given filename at the specified level. */
-int zlog_set_file (struct zlog *zl, const char *filename, int log_level);
+extern int zlog_set_file (struct zlog *zl, const char *filename, int log_level);
 /* Disable file logging. */
-int zlog_reset_file (struct zlog *zl);
+extern int zlog_reset_file (struct zlog *zl);
 
 /* Rotate log. */
-int zlog_rotate (struct zlog *);
+extern int zlog_rotate (struct zlog *);
 
 /* For hackey massage lookup and check */
 #define LOOKUP(x, y) mes_lookup(x, x ## _max, y)
 
-const char *lookup (struct message *, int);
-const char *mes_lookup (struct message *meslist, int max, int index);
+extern const char *lookup (struct message *, int);
+extern const char *mes_lookup (struct message *meslist, int max, int index);
 
 extern const char *zlog_priority[];
 extern const char *zlog_proto_names[];
diff --git a/lib/md5.c b/lib/md5.c
index 2068c46..c6b7ca5 100644
--- a/lib/md5.c
+++ b/lib/md5.c
@@ -69,8 +69,7 @@
 /* Initialize structure containing state of computation.
    (RFC 1321, 3.3: Step 3)  */
 void
-md5_init_ctx (ctx)
-     struct md5_ctx *ctx;
+md5_init_ctx (struct md5_ctx *ctx)
 {
   ctx->A = 0x67452301;
   ctx->B = 0xefcdab89;
@@ -87,9 +86,7 @@
    IMPORTANT: On some systems it is required that RESBUF is correctly
    aligned for a 32 bits value.  */
 void *
-md5_read_ctx (ctx, resbuf)
-     const struct md5_ctx *ctx;
-     void *resbuf;
+md5_read_ctx (const struct md5_ctx *ctx, void *resbuf)
 {
   ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
   ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
@@ -105,9 +102,7 @@
    IMPORTANT: On some systems it is required that RESBUF is correctly
    aligned for a 32 bits value.  */
 void *
-md5_finish_ctx (ctx, resbuf)
-     struct md5_ctx *ctx;
-     void *resbuf;
+md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
 {
   /* Take yet unprocessed bytes into account.  */
   md5_uint32 bytes = ctx->buflen;
@@ -136,9 +131,7 @@
    resulting message digest number will be written into the 16 bytes
    beginning at RESBLOCK.  */
 int
-md5_stream (stream, resblock)
-     FILE *stream;
-     void *resblock;
+md5_stream (FILE *stream, void *resblock)
 {
   /* Important: BLOCKSIZE must be a multiple of 64.  */
 #define BLOCKSIZE 4096
@@ -193,10 +186,7 @@
    output yields to the wanted ASCII representation of the message
    digest.  */
 void *
-md5_buffer (buffer, len, resblock)
-     const char *buffer;
-     size_t len;
-     void *resblock;
+md5_buffer (const char *buffer, size_t len, void *resblock)
 {
   struct md5_ctx ctx;
 
@@ -212,10 +202,7 @@
 
 
 void
-md5_process_bytes (buffer, len, ctx)
-     const void *buffer;
-     size_t len;
-     struct md5_ctx *ctx;
+md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
 {
   /* When we already have some bits in our internal buffer concatenate
      both inputs first.  */
@@ -270,10 +257,7 @@
    It is assumed that LEN % 64 == 0.  */
 
 void
-md5_process_block (buffer, len, ctx)
-     const void *buffer;
-     size_t len;
-     struct md5_ctx *ctx;
+md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
 {
   md5_uint32 correct_words[16];
   const md5_uint32 *words = buffer;
diff --git a/lib/memory.c b/lib/memory.c
index adf23b1..8ddf3f4 100644
--- a/lib/memory.c
+++ b/lib/memory.c
@@ -40,7 +40,7 @@
 };
 
 /* Fatal memory allocation error occured. */
-static void
+static void __attribute__ ((noreturn))
 zerror (const char *fname, int type, size_t size)
 {
   zlog_err ("%s : can't allocate memory for `%s' size %d: %s\n", 
diff --git a/lib/memory.h b/lib/memory.h
index 3ec89a9..ef20b8c 100644
--- a/lib/memory.h
+++ b/lib/memory.h
@@ -58,38 +58,25 @@
 #endif /* MEMORY_LOG */
 
 /* Prototypes of memory function. */
-void *zmalloc (int type, size_t size);
-void *zcalloc (int type, size_t size);
-void *zrealloc (int type, void *ptr, size_t size);
-void  zfree (int type, void *ptr);
-char *zstrdup (int type, const char *str);
+extern void *zmalloc (int type, size_t size);
+extern void *zcalloc (int type, size_t size);
+extern void *zrealloc (int type, void *ptr, size_t size);
+extern void  zfree (int type, void *ptr);
+extern char *zstrdup (int type, const char *str);
 
-void *mtype_zmalloc (const char *file,
-		     int line,
-		     int type,
-		     size_t size);
+extern void *mtype_zmalloc (const char *file, int line, int type, size_t size);
 
-void *mtype_zcalloc (const char *file,
-		     int line,
-		     int type,
-		     size_t num,
-		     size_t size);
+extern void *mtype_zcalloc (const char *file, int line, int type, 
+                            size_t num, size_t size);
 
-void *mtype_zrealloc (const char *file,
-		     int line,
-		     int type, 
-		     void *ptr,
-		     size_t size);
+extern void *mtype_zrealloc (const char *file, int line, int type, void *ptr,
+		             size_t size);
 
-void mtype_zfree (const char *file,
-		  int line,
-		  int type,
-		  void *ptr);
+extern void mtype_zfree (const char *file, int line, int type,
+		         void *ptr);
 
-char *mtype_zstrdup (const char *file,
-		     int line,
-		     int type,
-		     const char *str);
-void memory_init (void);
+extern char *mtype_zstrdup (const char *file, int line, int type,
+		            const char *str);
+extern void memory_init (void);
 
 #endif /* _ZEBRA_MEMORY_H */
diff --git a/lib/network.h b/lib/network.h
index 9333ef8..4d9c228 100644
--- a/lib/network.h
+++ b/lib/network.h
@@ -26,8 +26,8 @@
 /* Both readn and writen are deprecated and will be removed.  They are not
    suitable for use with non-blocking file descriptors.
  */
-int readn (int, u_char *, int);
-int writen (int, const u_char *, int);
+extern int readn (int, u_char *, int);
+extern int writen (int, const u_char *, int);
 
 /* Set the file descriptor to use non-blocking I/O.  Returns 0 for success,
    -1 on error. */
diff --git a/lib/plist.c b/lib/plist.c
index 5e2edd2..97d254f 100644
--- a/lib/plist.c
+++ b/lib/plist.c
@@ -72,10 +72,10 @@
   struct prefix_list *recent;
 
   /* Hook function which is executed when new prefix_list is added. */
-  void (*add_hook) ();
+  void (*add_hook) (struct prefix_list *);
 
   /* Hook function which is executed when prefix_list is deleted. */
-  void (*delete_hook) ();
+  void (*delete_hook) (struct prefix_list *);
 };
 
 /* Static structure of IPv4 prefix_list's master. */
@@ -150,7 +150,7 @@
 }
 
 static struct prefix_list *
-prefix_list_new ()
+prefix_list_new (void)
 {
   struct prefix_list *new;
 
@@ -165,7 +165,7 @@
 }
 
 static struct prefix_list_entry *
-prefix_list_entry_new ()
+prefix_list_entry_new (void)
 {
   struct prefix_list_entry *new;
 
@@ -326,11 +326,11 @@
 
   if (plist->name)
     XFREE (MTYPE_PREFIX_LIST_STR, plist->name);
-
+  
   prefix_list_free (plist);
-
+  
   if (master->delete_hook)
-    (*master->delete_hook) ();
+    (*master->delete_hook) (NULL);
 }
 
 static struct prefix_list_entry *
@@ -586,7 +586,7 @@
   return PREFIX_DENY;
 }
 
-void
+static void __attribute__ ((unused))
 prefix_list_print (struct prefix_list *plist)
 {
   struct prefix_list_entry *pentry;
@@ -2578,7 +2578,7 @@
 }
 
 static void
-prefix_list_reset_orf ()
+prefix_list_reset_orf (void)
 {
   struct prefix_list *plist;
   struct prefix_list *next;
@@ -2625,7 +2625,7 @@
 }
 
 static void
-prefix_list_reset_ipv4 ()
+prefix_list_reset_ipv4 (void)
 {
   struct prefix_list *plist;
   struct prefix_list *next;
@@ -2657,7 +2657,7 @@
 }
 
 static void
-prefix_list_init_ipv4 ()
+prefix_list_init_ipv4 (void)
 {
   install_node (&prefix_node, config_write_prefix_ipv4);
 
@@ -2734,7 +2734,7 @@
 }
 
 static void
-prefix_list_reset_ipv6 ()
+prefix_list_reset_ipv6 (void)
 {
   struct prefix_list *plist;
   struct prefix_list *next;
@@ -2766,7 +2766,7 @@
 }
 
 static void
-prefix_list_init_ipv6 ()
+prefix_list_init_ipv6 (void)
 {
   install_node (&prefix_ipv6_node, config_write_prefix_ipv6);
 
diff --git a/lib/plist.h b/lib/plist.h
index 01ac987..fb3168a 100644
--- a/lib/plist.h
+++ b/lib/plist.h
@@ -20,6 +20,9 @@
  * Boston, MA 02111-1307, USA.
  */
 
+#ifndef _QUAGGA_PLIST_H
+#define _QUAGGA_PLIST_H
+
 #define AFI_ORF_PREFIX 65535
 
 enum prefix_list_type 
@@ -62,17 +65,19 @@
 };
 
 /* Prototypes. */
-void prefix_list_init (void);
-void prefix_list_reset (void);
-void prefix_list_add_hook (void (*func) (struct prefix_list *));
-void prefix_list_delete_hook (void (*func) (struct prefix_list *));
+extern void prefix_list_init (void);
+extern void prefix_list_reset (void);
+extern void prefix_list_add_hook (void (*func) (struct prefix_list *));
+extern void prefix_list_delete_hook (void (*func) (struct prefix_list *));
 
-struct prefix_list *prefix_list_lookup (afi_t, const char *);
-enum prefix_list_type prefix_list_apply (struct prefix_list *, void *);
+extern struct prefix_list *prefix_list_lookup (afi_t, const char *);
+extern enum prefix_list_type prefix_list_apply (struct prefix_list *, void *);
 
-struct stream *
-prefix_bgp_orf_entry (struct stream *, struct prefix_list *,
-                      u_char, u_char, u_char);
-int prefix_bgp_orf_set (char *, afi_t, struct orf_prefix *, int, int);
-void prefix_bgp_orf_remove_all (char *);
-int prefix_bgp_show_prefix_list (struct vty *, afi_t, char *);
+extern struct stream * prefix_bgp_orf_entry (struct stream *,
+                                             struct prefix_list *,
+                                             u_char, u_char, u_char);
+extern int prefix_bgp_orf_set (char *, afi_t, struct orf_prefix *, int, int);
+extern void prefix_bgp_orf_remove_all (char *);
+extern int prefix_bgp_show_prefix_list (struct vty *, afi_t, char *);
+
+#endif /* _QUAGGA_PLIST_H */
diff --git a/lib/pqueue.c b/lib/pqueue.c
index 870f8a7..2bbafe7 100644
--- a/lib/pqueue.c
+++ b/lib/pqueue.c
@@ -106,7 +106,7 @@
 }
 
 struct pqueue *
-pqueue_create ()
+pqueue_create (void)
 {
   struct pqueue *queue;
 
diff --git a/lib/pqueue.h b/lib/pqueue.h
index d19c46d..1f3201b 100644
--- a/lib/pqueue.h
+++ b/lib/pqueue.h
@@ -33,12 +33,12 @@
 
 #define PQUEUE_INIT_ARRAYSIZE  32
 
-struct pqueue *pqueue_create ();
-void pqueue_delete (struct pqueue *queue);
+extern struct pqueue *pqueue_create (void);
+extern void pqueue_delete (struct pqueue *queue);
 
-void pqueue_enqueue (void *data, struct pqueue *queue);
-void *pqueue_dequeue (struct pqueue *queue);
+extern void pqueue_enqueue (void *data, struct pqueue *queue);
+extern void *pqueue_dequeue (struct pqueue *queue);
 
-void trickle_down (int index, struct pqueue *queue);
+extern void trickle_down (int index, struct pqueue *queue);
 
 #endif /* _ZEBRA_PQUEUE_H */
diff --git a/lib/prefix.c b/lib/prefix.c
index 2e594aa..b4347dd 100644
--- a/lib/prefix.c
+++ b/lib/prefix.c
@@ -72,8 +72,8 @@
   int shift;
 
   /* Set both prefix's head pointer. */
-  u_char *np = (u_char *)&n->u.prefix;
-  u_char *pp = (u_char *)&p->u.prefix;
+  const u_char *np = (const u_char *)&n->u.prefix;
+  const u_char *pp = (const u_char *)&p->u.prefix;
 
   /* If n's prefix is longer than p's one return 0. */
   if (n->prefixlen > p->prefixlen)
@@ -160,8 +160,8 @@
   int shift;
 
   /* Set both prefix's head pointer. */
-  u_char *pp1 = (u_char *)&p1->u.prefix;
-  u_char *pp2 = (u_char *)&p2->u.prefix;
+  const u_char *pp1 = (const u_char *)&p1->u.prefix;
+  const u_char *pp2 = (const u_char *)&p2->u.prefix;
 
   if (p1->family != p2->family || p1->prefixlen != p2->prefixlen)
     return 1;
@@ -344,7 +344,7 @@
 
 /* Allocate a new ip version 6 route */
 struct prefix_ipv6 *
-prefix_ipv6_new ()
+prefix_ipv6_new (void)
 {
   struct prefix_ipv6 *p;
 
diff --git a/lib/prefix.h b/lib/prefix.h
index 506d644..7afe7a1 100644
--- a/lib/prefix.h
+++ b/lib/prefix.h
@@ -23,6 +23,8 @@
 #ifndef _ZEBRA_PREFIX_H
 #define _ZEBRA_PREFIX_H
 
+#include "sockunion.h"
+
 /*
  * A struct prefix contains an address family, a prefix length, and an
  * address.  This can represent either a 'network prefix' as defined
@@ -125,58 +127,59 @@
 #define PREFIX_FAMILY(p)  ((p)->family)
 
 /* Prototypes. */
-int afi2family (int);
-int family2afi (int);
+extern int afi2family (int);
+extern int family2afi (int);
 
-struct prefix *prefix_new ();
-void prefix_free (struct prefix *);
-const char *prefix_family_str (const struct prefix *);
-int prefix_blen (const struct prefix *);
-int str2prefix (const char *, struct prefix *);
-int prefix2str (const struct prefix *, char *, int);
-int prefix_match (const struct prefix *, const struct prefix *);
-int prefix_same (const struct prefix *, const struct prefix *);
-int prefix_cmp (const struct prefix *, const struct prefix *);
-void prefix_copy (struct prefix *dest, const struct prefix *src);
-void apply_mask (struct prefix *);
+extern struct prefix *prefix_new (void);
+extern void prefix_free (struct prefix *);
+extern const char *prefix_family_str (const struct prefix *);
+extern int prefix_blen (const struct prefix *);
+extern int str2prefix (const char *, struct prefix *);
+extern int prefix2str (const struct prefix *, char *, int);
+extern int prefix_match (const struct prefix *, const struct prefix *);
+extern int prefix_same (const struct prefix *, const struct prefix *);
+extern int prefix_cmp (const struct prefix *, const struct prefix *);
+extern void prefix_copy (struct prefix *dest, const struct prefix *src);
+extern void apply_mask (struct prefix *);
 
-struct prefix *sockunion2prefix ();
-struct prefix *sockunion2hostprefix ();
+extern struct prefix *sockunion2prefix (const union sockunion *dest,
+                                        const union sockunion *mask);
+extern struct prefix *sockunion2hostprefix (const union sockunion *);
 
-struct prefix_ipv4 *prefix_ipv4_new ();
-void prefix_ipv4_free (struct prefix_ipv4 *);
-int str2prefix_ipv4 (const char *, struct prefix_ipv4 *);
-void apply_mask_ipv4 (struct prefix_ipv4 *);
+extern struct prefix_ipv4 *prefix_ipv4_new (void);
+extern void prefix_ipv4_free (struct prefix_ipv4 *);
+extern int str2prefix_ipv4 (const char *, struct prefix_ipv4 *);
+extern void apply_mask_ipv4 (struct prefix_ipv4 *);
 
-int prefix_ipv4_any (const struct prefix_ipv4 *);
-void apply_classful_mask_ipv4 (struct prefix_ipv4 *);
+extern int prefix_ipv4_any (const struct prefix_ipv4 *);
+extern void apply_classful_mask_ipv4 (struct prefix_ipv4 *);
 
-u_char ip_masklen (struct in_addr);
-void masklen2ip (int, struct in_addr *);
+extern u_char ip_masklen (struct in_addr);
+extern void masklen2ip (int, struct in_addr *);
 /* returns the network portion of the host address */
-in_addr_t ipv4_network_addr (in_addr_t hostaddr, int masklen);
+extern in_addr_t ipv4_network_addr (in_addr_t hostaddr, int masklen);
 /* given the address of a host on a network and the network mask length,
  * calculate the broadcast address for that network;
  * special treatment for /31: returns the address of the other host
  * on the network by flipping the host bit */
-in_addr_t ipv4_broadcast_addr (in_addr_t hostaddr, int masklen);
+extern in_addr_t ipv4_broadcast_addr (in_addr_t hostaddr, int masklen);
 
-int netmask_str2prefix_str (const char *, const char *, char *);
+extern int netmask_str2prefix_str (const char *, const char *, char *);
 
 #ifdef HAVE_IPV6
-struct prefix_ipv6 *prefix_ipv6_new ();
-void prefix_ipv6_free (struct prefix_ipv6 *);
-int str2prefix_ipv6 (const char *, struct prefix_ipv6 *);
-void apply_mask_ipv6 (struct prefix_ipv6 *);
+extern struct prefix_ipv6 *prefix_ipv6_new (void);
+extern void prefix_ipv6_free (struct prefix_ipv6 *);
+extern int str2prefix_ipv6 (const char *, struct prefix_ipv6 *);
+extern void apply_mask_ipv6 (struct prefix_ipv6 *);
 
-int ip6_masklen (struct in6_addr);
-void masklen2ip6 (int, struct in6_addr *);
+extern int ip6_masklen (struct in6_addr);
+extern void masklen2ip6 (int, struct in6_addr *);
 
-void str2in6_addr (const char *, struct in6_addr *);
-const char *inet6_ntoa (struct in6_addr);
+extern void str2in6_addr (const char *, struct in6_addr *);
+extern const char *inet6_ntoa (struct in6_addr);
 
 #endif /* HAVE_IPV6 */
 
-int all_digit (const char *);
+extern int all_digit (const char *);
 
 #endif /* _ZEBRA_PREFIX_H */
diff --git a/lib/privs.h b/lib/privs.h
index 76e8af2..7050756 100644
--- a/lib/privs.h
+++ b/lib/privs.h
@@ -82,10 +82,10 @@
 };
 
   /* initialise zebra privileges */
-void zprivs_init (struct zebra_privs_t *zprivs);
+extern void zprivs_init (struct zebra_privs_t *zprivs);
   /* drop all and terminate privileges */ 
-void zprivs_terminate (void);
+extern void zprivs_terminate (void);
   /* query for runtime uid's and gid's, eg vty needs this */
-void zprivs_get_ids(struct zprivs_ids_t *);
+extern void zprivs_get_ids(struct zprivs_ids_t *);
 
 #endif /* _ZEBRA_PRIVS_H */
diff --git a/lib/routemap.c b/lib/routemap.c
index cd1abbc..c52b050 100644
--- a/lib/routemap.c
+++ b/lib/routemap.c
@@ -159,7 +159,7 @@
 
 /* Lookup route map.  If there isn't route map create one and return
    it. */
-struct route_map *
+static struct route_map *
 route_map_get (const char *name)
 {
   struct route_map *map;
@@ -171,7 +171,7 @@
 }
 
 /* Return route map's type string. */
-const static char *
+static const char *
 route_map_type_str (enum route_map_type type)
 {
   switch (type)
@@ -188,7 +188,7 @@
     }
 }
 
-int
+static int
 route_map_empty (struct route_map *map)
 {
   if (map->head == NULL && map->tail == NULL)
@@ -245,7 +245,7 @@
     }
 }
 
-int
+static int
 vty_show_route_map (struct vty *vty, const char *name)
 {
   struct route_map *map;
@@ -271,8 +271,8 @@
 
 /* New route map allocation. Please note route map's name must be
    specified. */
-struct route_map_index *
-route_map_index_new ()
+static struct route_map_index *
+route_map_index_new (void)
 {
   struct route_map_index *new;
 
@@ -319,7 +319,7 @@
 }
 
 /* Lookup index from route map. */
-struct route_map_index *
+static struct route_map_index *
 route_map_index_lookup (struct route_map *map, enum route_map_type type,
 			int pref)
 {
@@ -333,7 +333,7 @@
 }
 
 /* Add new index to route map. */
-struct route_map_index *
+static struct route_map_index *
 route_map_index_add (struct route_map *map, enum route_map_type type,
 		     int pref)
 {
@@ -385,7 +385,7 @@
 }
 
 /* Get route map index. */
-struct route_map_index *
+static struct route_map_index *
 route_map_index_get (struct route_map *map, enum route_map_type type, 
 		     int pref)
 {
@@ -404,8 +404,8 @@
 }
 
 /* New route map rule */
-struct route_map_rule *
-route_map_rule_new ()
+static struct route_map_rule *
+route_map_rule_new (void)
 {
   struct route_map_rule *new;
 
@@ -428,7 +428,7 @@
 }
 
 /* Lookup rule command from match list. */
-struct route_map_rule_cmd *
+static struct route_map_rule_cmd *
 route_map_lookup_match (const char *name)
 {
   unsigned int i;
@@ -442,7 +442,7 @@
 }
 
 /* Lookup rule command from set list. */
-struct route_map_rule_cmd *
+static struct route_map_rule_cmd *
 route_map_lookup_set (const char *name)
 {
   unsigned int i;
@@ -493,7 +493,7 @@
 }
 
 /* strcmp wrapper function which don't crush even argument is NULL. */
-int
+static int
 rulecmp (const char *dst, const char *src)
 {
   if (dst == NULL)
@@ -731,7 +731,7 @@
    We need to make sure our route-map processing matches the above
 */
 
-route_map_result_t
+static route_map_result_t
 route_map_apply_match (struct route_map_rule_list *match_list,
                        struct prefix *prefix, route_map_object_t type,
                        void *object)
@@ -875,7 +875,7 @@
 }
 
 void
-route_map_init ()
+route_map_init (void)
 {
   /* Make vector for match and set. */
   route_match_vec = vector_init (1);
@@ -1230,7 +1230,7 @@
 }
 
 /* Configuration write function. */
-int
+static int
 route_map_config_write (struct vty *vty)
 {
   struct route_map *map;
@@ -1286,7 +1286,7 @@
 
 /* Initialization of route map vector. */
 void
-route_map_init_vty ()
+route_map_init_vty (void)
 {
   /* Install route map top node. */
   install_node (&rmap_node, route_map_config_write);
diff --git a/lib/routemap.h b/lib/routemap.h
index 072526a..c9cf441 100644
--- a/lib/routemap.h
+++ b/lib/routemap.h
@@ -150,52 +150,46 @@
 };
 
 /* Prototypes. */
-void route_map_init ();
-void route_map_init_vty ();
+extern void route_map_init (void);
+extern void route_map_init_vty (void);
 
 /* Add match statement to route map. */
-int
-route_map_add_match (struct route_map_index *index,
-		     const char *match_name,
-		     const char *match_arg);
+extern int route_map_add_match (struct route_map_index *index,
+		                const char *match_name,
+		                const char *match_arg);
 
 /* Delete specified route match rule. */
-int
-route_map_delete_match (struct route_map_index *index,
-			const char *match_name,
-			const char *match_arg);
+extern int route_map_delete_match (struct route_map_index *index,
+			           const char *match_name,
+			           const char *match_arg);
 
 /* Add route-map set statement to the route map. */
-int
-route_map_add_set (struct route_map_index *index, 
-		   const char *set_name,
-		   const char *set_arg);
+extern int route_map_add_set (struct route_map_index *index, 
+		              const char *set_name,
+		              const char *set_arg);
 
 /* Delete route map set rule. */
-int
-route_map_delete_set (struct route_map_index *index, const char *set_name,
-		      const char *set_arg);
+extern int route_map_delete_set (struct route_map_index *index,
+                                 const char *set_name,
+                                 const char *set_arg);
 
 /* Install rule command to the match list. */
-void
-route_map_install_match (struct route_map_rule_cmd *cmd);
+extern void route_map_install_match (struct route_map_rule_cmd *cmd);
 
 /* Install rule command to the set list. */
-void
-route_map_install_set (struct route_map_rule_cmd *cmd);
+extern void route_map_install_set (struct route_map_rule_cmd *cmd);
 
 /* Lookup route map by name. */
-struct route_map *
-route_map_lookup_by_name (const char *name);
+extern struct route_map * route_map_lookup_by_name (const char *name);
 
 /* Apply route map to the object. */
-route_map_result_t
-route_map_apply (struct route_map *map, struct prefix *, 
-		 route_map_object_t object_type, void *object);
+extern route_map_result_t route_map_apply (struct route_map *map,
+                                           struct prefix *,
+                                           route_map_object_t object_type,
+                                           void *object);
 
-void route_map_add_hook (void (*func) (const char *));
-void route_map_delete_hook (void (*func) (const char *));
-void route_map_event_hook (void (*func) (route_map_event_t, const char *));
-
+extern void route_map_add_hook (void (*func) (const char *));
+extern void route_map_delete_hook (void (*func) (const char *));
+extern void route_map_event_hook (void (*func) (route_map_event_t, const char *));
 
 #endif /* _ZEBRA_ROUTEMAP_H */
diff --git a/lib/sigevent.c b/lib/sigevent.c
index 08141af..30e9a3d 100644
--- a/lib/sigevent.c
+++ b/lib/sigevent.c
@@ -185,7 +185,7 @@
 
 #endif /* SA_SIGINFO */
 
-static void
+static void __attribute__ ((noreturn))
 exit_handler(int signo
 #ifdef SA_SIGINFO
 	     , siginfo_t *siginfo, void *context
@@ -200,7 +200,7 @@
   _exit(128+signo);
 }
 
-static void
+static void __attribute__ ((noreturn))
 core_handler(int signo
 #ifdef SA_SIGINFO
 	     , siginfo_t *siginfo, void *context
diff --git a/lib/sigevent.h b/lib/sigevent.h
index 20012af..62b944a 100644
--- a/lib/sigevent.h
+++ b/lib/sigevent.h
@@ -44,10 +44,10 @@
  * - array of quagga_signal_t's describing signals to handle
  *   and handlers to use for each signal
  */
-void signal_init (struct thread_master *m, int sigc, 
+extern void signal_init (struct thread_master *m, int sigc, 
                          struct quagga_signal_t *signals);
 
 /* check whether there are signals to handle, process any found */
-int quagga_sigevent_process (void);
+extern int quagga_sigevent_process (void);
 
 #endif /* _QUAGGA_SIGNAL_H */
diff --git a/lib/smux.h b/lib/smux.h
index dd44a31..a4f1718 100644
--- a/lib/smux.h
+++ b/lib/smux.h
@@ -144,16 +144,17 @@
     (u_char *) &snmp_in_addr_val \
   )
 
-void smux_init (struct thread_master *tm);
-void smux_start (void);
-void smux_register_mib(const char *, struct variable *, size_t, int, oid [], size_t);
-int smux_header_generic (struct variable *, oid [], size_t *, int, size_t *, 
-    WriteMethod **);
-int smux_trap (oid *, size_t, oid *, size_t, struct trap_object *, size_t, unsigned int, u_char);
-
-int oid_compare (oid *, int, oid *, int);
-void oid2in_addr (oid [], int, struct in_addr *);
-void *oid_copy (void *, void *, size_t);
-void oid_copy_addr (oid [], struct in_addr *, int);
+extern void smux_init (struct thread_master *tm);
+extern void smux_start (void);
+extern void smux_register_mib(const char *, struct variable *, 
+                              size_t, int, oid [], size_t);
+extern int smux_header_generic (struct variable *, oid [], size_t *, 
+                                int, size_t *, WriteMethod **);
+extern int smux_trap (oid *, size_t, oid *, size_t, struct trap_object *, 
+                      size_t, unsigned int, u_char);
+extern int oid_compare (oid *, int, oid *, int);
+extern void oid2in_addr (oid [], int, struct in_addr *);
+extern void *oid_copy (void *, void *, size_t);
+extern void oid_copy_addr (oid [], struct in_addr *, int);
 
 #endif /* _ZEBRA_SNMP_H */
diff --git a/lib/sockopt.h b/lib/sockopt.h
index df199c1..d88bfa6 100644
--- a/lib/sockopt.h
+++ b/lib/sockopt.h
@@ -22,15 +22,15 @@
 #ifndef _ZEBRA_SOCKOPT_H
 #define _ZEBRA_SOCKOPT_H
 
-int setsockopt_so_recvbuf (int sock, int size);
+extern int setsockopt_so_recvbuf (int sock, int size);
 
 #ifdef HAVE_IPV6
-int setsockopt_ipv6_pktinfo (int, int);
-int setsockopt_ipv6_checksum (int, int);
-int setsockopt_ipv6_multicast_hops (int, int);
-int setsockopt_ipv6_unicast_hops (int, int);
-int setsockopt_ipv6_hoplimit (int, int);
-int setsockopt_ipv6_multicast_loop (int, int);
+extern int setsockopt_ipv6_pktinfo (int, int);
+extern int setsockopt_ipv6_checksum (int, int);
+extern int setsockopt_ipv6_multicast_hops (int, int);
+extern int setsockopt_ipv6_unicast_hops (int, int);
+extern int setsockopt_ipv6_hoplimit (int, int);
+extern int setsockopt_ipv6_multicast_loop (int, int);
 #endif /* HAVE_IPV6 */
 
 /*
@@ -78,20 +78,19 @@
   (((af) == AF_INET) : SOPT_SIZE_CMSG_IFINDEX_IPV4() \
                     ? SOPT_SIZE_CMSG_PKTINFO_IPV6())
 
-int setsockopt_multicast_ipv4(int sock, 
-			     int optname, 
-			     struct in_addr if_addr,
-			     unsigned int mcast_addr,
-			     unsigned int ifindex);
+extern int setsockopt_multicast_ipv4(int sock, int optname, 
+			             struct in_addr if_addr,
+                                     unsigned int mcast_addr,
+			             unsigned int ifindex);
 
 /* Ask for, and get, ifindex, by whatever method is supported. */
-int setsockopt_ifindex (int, int, int);
-int getsockopt_ifindex (int, struct msghdr *);
+extern int setsockopt_ifindex (int, int, int);
+extern int getsockopt_ifindex (int, struct msghdr *);
 
 /* swab the fields in iph between the host order and system order expected 
  * for IP_HDRINCL.
  */
-void sockopt_iphdrincl_swab_htosys (struct ip *iph);
-void sockopt_iphdrincl_swab_systoh (struct ip *iph);
+extern void sockopt_iphdrincl_swab_htosys (struct ip *iph);
+extern void sockopt_iphdrincl_swab_systoh (struct ip *iph);
 
 #endif /*_ZEBRA_SOCKOPT_H */
diff --git a/lib/sockunion.c b/lib/sockunion.c
index 8a1fd9d..a636c64 100644
--- a/lib/sockunion.c
+++ b/lib/sockunion.c
@@ -273,7 +273,7 @@
 }
 
 /* Return sizeof union sockunion.  */
-int
+static int
 sockunion_sizeof (union sockunion *su)
 {
   int ret;
@@ -294,7 +294,7 @@
 }
 
 /* return sockunion structure : this function should be revised. */
-char *
+static char *
 sockunion_log (union sockunion *su)
 {
   static char buf[SU_ADDRSTRLEN];
@@ -662,7 +662,7 @@
 }
 
 /* Print sockunion structure */
-void
+static void __attribute__ ((unused))
 sockunion_print (union sockunion *su)
 {
   if (su == NULL)
@@ -701,7 +701,7 @@
 }
 
 #ifdef HAVE_IPV6
-int
+static int
 in6addr_cmp (struct in6_addr *addr1, struct in6_addr *addr2)
 {
   unsigned int i;
diff --git a/lib/sockunion.h b/lib/sockunion.h
index 738df06..96b9a0d 100644
--- a/lib/sockunion.h
+++ b/lib/sockunion.h
@@ -87,42 +87,42 @@
 #define sockunion_family(X)  (X)->sa.sa_family
 
 /* Prototypes. */
-int str2sockunion (const char *, union sockunion *);
-const char *sockunion2str (union sockunion *, char *, size_t);
-int sockunion_cmp (union sockunion *, union sockunion *);
-int sockunion_same (union sockunion *, union sockunion *);
+extern int str2sockunion (const char *, union sockunion *);
+extern const char *sockunion2str (union sockunion *, char *, size_t);
+extern int sockunion_cmp (union sockunion *, union sockunion *);
+extern int sockunion_same (union sockunion *, union sockunion *);
 
-char *sockunion_su2str (union sockunion *su);
-union sockunion *sockunion_str2su (const char *str);
-struct in_addr sockunion_get_in_addr (union sockunion *su);
-int sockunion_accept (int sock, union sockunion *);
-int sockunion_stream_socket (union sockunion *);
-int sockopt_reuseaddr (int);
-int sockopt_reuseport (int);
-int sockunion_bind (int sock, union sockunion *, unsigned short, union sockunion *);
-int sockopt_ttl (int family, int sock, int ttl);
-int sockunion_socket (union sockunion *su);
-const char *inet_sutop (union sockunion *su, char *str);
-enum connect_result
-sockunion_connect (int fd, union sockunion *su, unsigned short port, unsigned int);
-union sockunion *sockunion_getsockname (int);
-union sockunion *sockunion_getpeername (int);
-union sockunion *sockunion_dup (union sockunion *);
-void sockunion_free (union sockunion *);
+extern char *sockunion_su2str (union sockunion *su);
+extern union sockunion *sockunion_str2su (const char *str);
+extern struct in_addr sockunion_get_in_addr (union sockunion *su);
+extern int sockunion_accept (int sock, union sockunion *);
+extern int sockunion_stream_socket (union sockunion *);
+extern int sockopt_reuseaddr (int);
+extern int sockopt_reuseport (int);
+extern int sockunion_bind (int sock, union sockunion *, 
+                           unsigned short, union sockunion *);
+extern int sockopt_ttl (int family, int sock, int ttl);
+extern int sockunion_socket (union sockunion *su);
+extern const char *inet_sutop (union sockunion *su, char *str);
+extern enum connect_result sockunion_connect (int fd, union sockunion *su, 
+                                              unsigned short port,
+                                              unsigned int);
+extern union sockunion *sockunion_getsockname (int);
+extern union sockunion *sockunion_getpeername (int);
+extern union sockunion *sockunion_dup (union sockunion *);
+extern void sockunion_free (union sockunion *);
 
 #ifndef HAVE_INET_NTOP
-const char *
-inet_ntop (int family, const void *addrptr, char *strptr, size_t len);
+extern const char * inet_ntop (int family, const void *addrptr, 
+                               char *strptr, size_t len);
 #endif /* HAVE_INET_NTOP */
 
 #ifndef HAVE_INET_PTON
-int
-inet_pton (int family, const char *strptr, void *addrptr);
+extern int inet_pton (int family, const char *strptr, void *addrptr);
 #endif /* HAVE_INET_PTON */
 
 #ifndef HAVE_INET_ATON
-int
-inet_aton (const char *cp, struct in_addr *inaddr);
+extern int inet_aton (const char *cp, struct in_addr *inaddr);
 #endif
 
 #endif /* _ZEBRA_SOCKUNION_H */
diff --git a/lib/str.h b/lib/str.h
index c001656..145863d 100644
--- a/lib/str.h
+++ b/lib/str.h
@@ -1,12 +1,12 @@
 /*
- * $Id: str.h,v 1.2 2005/04/02 16:01:05 ajs Exp $
+ * $Id: str.h,v 1.3 2005/05/06 21:25:49 paul Exp $
  */
 
 #ifndef _ZEBRA_STR_H
 #define _ZEBRA_STR_H
 
 #ifndef HAVE_SNPRINTF
-int snprintf(char *, size_t, const char *, ...);
+extern int snprintf(char *, size_t, const char *, ...);
 #endif
 
 #ifndef HAVE_VSNPRINTF
@@ -14,15 +14,16 @@
 #endif
 
 #ifndef HAVE_STRLCPY
-size_t strlcpy(char *, const char *, size_t);
+extern size_t strlcpy(char *, const char *, size_t);
 #endif
 
 #ifndef HAVE_STRLCAT
-size_t strlcat(char *, const char *, size_t);
+extern size_t strlcat(char *, const char *, size_t);
 #endif
 
 #ifndef HAVE_STRNLEN
 extern size_t strnlen(const char *s, size_t maxlen);
 #endif
 
-#endif
+#endif /* _ZEBRA_STR_H */
+
diff --git a/lib/stream.h b/lib/stream.h
index 7565fac..4753f82 100644
--- a/lib/stream.h
+++ b/lib/stream.h
@@ -128,50 +128,51 @@
 #define STREAM_REMAIN(S) STREAM_WRITEABLE((S))
 
 /* Stream prototypes. */
-struct stream *stream_new (size_t);
-void stream_free (struct stream *);
-struct stream * stream_copy (struct stream *new, struct stream *src);
-struct stream *stream_dup (struct stream *);
+extern struct stream *stream_new (size_t);
+extern void stream_free (struct stream *);
+extern struct stream * stream_copy (struct stream *new, struct stream *src);
+extern struct stream *stream_dup (struct stream *);
 
-size_t stream_get_getp (struct stream *);
-size_t stream_get_endp (struct stream *);
-size_t stream_get_size (struct stream *);
-u_char *stream_get_data (struct stream *);
+extern size_t stream_get_getp (struct stream *);
+extern size_t stream_get_endp (struct stream *);
+extern size_t stream_get_size (struct stream *);
+extern u_char *stream_get_data (struct stream *);
 
-void stream_set_getp (struct stream *, size_t);
-void stream_forward_getp (struct stream *, size_t);
-void stream_forward_endp (struct stream *, size_t);
+extern void stream_set_getp (struct stream *, size_t);
+extern void stream_forward_getp (struct stream *, size_t);
+extern void stream_forward_endp (struct stream *, size_t);
 
-void stream_put (struct stream *, void *, size_t); /* NULL source zeroes */
-int stream_putc (struct stream *, u_char);
-int stream_putc_at (struct stream *, size_t, u_char);
-int stream_putw (struct stream *, u_int16_t);
-int stream_putw_at (struct stream *, size_t, u_int16_t);
-int stream_putl (struct stream *, u_int32_t);
-int stream_putl_at (struct stream *, size_t, u_int32_t);
-int stream_put_ipv4 (struct stream *, u_int32_t);
-int stream_put_in_addr (struct stream *, struct in_addr *);
-int stream_put_prefix (struct stream *, struct prefix *);
+/* steam_put: NULL source zeroes out size_t bytes of stream */
+extern void stream_put (struct stream *, void *, size_t);
+extern int stream_putc (struct stream *, u_char);
+extern int stream_putc_at (struct stream *, size_t, u_char);
+extern int stream_putw (struct stream *, u_int16_t);
+extern int stream_putw_at (struct stream *, size_t, u_int16_t);
+extern int stream_putl (struct stream *, u_int32_t);
+extern int stream_putl_at (struct stream *, size_t, u_int32_t);
+extern int stream_put_ipv4 (struct stream *, u_int32_t);
+extern int stream_put_in_addr (struct stream *, struct in_addr *);
+extern int stream_put_prefix (struct stream *, struct prefix *);
 
-void stream_get (void *, struct stream *, size_t);
-u_char stream_getc (struct stream *);
-u_char stream_getc_from (struct stream *, size_t);
-u_int16_t stream_getw (struct stream *);
-u_int16_t stream_getw_from (struct stream *, size_t);
-u_int32_t stream_getl (struct stream *);
-u_int32_t stream_getl_from (struct stream *, size_t);
-u_int32_t stream_get_ipv4 (struct stream *);
+extern void stream_get (void *, struct stream *, size_t);
+extern u_char stream_getc (struct stream *);
+extern u_char stream_getc_from (struct stream *, size_t);
+extern u_int16_t stream_getw (struct stream *);
+extern u_int16_t stream_getw_from (struct stream *, size_t);
+extern u_int32_t stream_getl (struct stream *);
+extern u_int32_t stream_getl_from (struct stream *, size_t);
+extern u_int32_t stream_get_ipv4 (struct stream *);
 
 #undef stream_read
 #undef stream_write
 
 /* Deprecated: assumes blocking I/O.  Will be removed. 
    Use stream_read_try instead.  */
-int stream_read (struct stream *, int, size_t);
+extern int stream_read (struct stream *, int, size_t);
 
 /* Deprecated: all file descriptors should already be non-blocking.
    Will be removed.  Use stream_read_try instead. */
-int stream_read_unblock (struct stream *, int, size_t);
+extern int stream_read_unblock (struct stream *, int, size_t);
 
 /* Read up to size bytes into the stream.
    Return code:
@@ -184,24 +185,26 @@
 extern ssize_t stream_read_try(struct stream *s, int fd, size_t size);
 
 extern ssize_t stream_recvmsg (struct stream *s, int fd, struct msghdr *,
-                    int flags, size_t size);
-extern ssize_t stream_recvfrom (struct stream *s, int fd, size_t len, int flags,
-                     struct sockaddr *from, socklen_t *fromlen);
-size_t stream_write (struct stream *, u_char *, size_t);
+                               int flags, size_t size);
+extern ssize_t stream_recvfrom (struct stream *s, int fd, size_t len, 
+                                int flags, struct sockaddr *from, 
+                                socklen_t *fromlen);
+extern size_t stream_write (struct stream *, u_char *, size_t);
 
-void stream_reset (struct stream *); /* reset the stream. See Note above */
-int stream_flush (struct stream *, int);
-int stream_empty (struct stream *); /* is the stream empty? */
+/* reset the stream. See Note above */
+extern void stream_reset (struct stream *);
+extern int stream_flush (struct stream *, int);
+extern int stream_empty (struct stream *); /* is the stream empty? */
 
 /* deprecated */
-u_char *stream_pnt (struct stream *);
+extern u_char *stream_pnt (struct stream *);
 
 /* Stream fifo. */
-struct stream_fifo *stream_fifo_new (void);
-void stream_fifo_push (struct stream_fifo *fifo, struct stream *s);
-struct stream *stream_fifo_pop (struct stream_fifo *fifo);
-struct stream *stream_fifo_head (struct stream_fifo *fifo);
-void stream_fifo_clean (struct stream_fifo *fifo);
-void stream_fifo_free (struct stream_fifo *fifo);
+extern struct stream_fifo *stream_fifo_new (void);
+extern void stream_fifo_push (struct stream_fifo *fifo, struct stream *s);
+extern struct stream *stream_fifo_pop (struct stream_fifo *fifo);
+extern struct stream *stream_fifo_head (struct stream_fifo *fifo);
+extern void stream_fifo_clean (struct stream_fifo *fifo);
+extern void stream_fifo_free (struct stream_fifo *fifo);
 
 #endif /* _ZEBRA_STREAM_H */
diff --git a/lib/table.c b/lib/table.c
index 281dfb6..2ade71b 100644
--- a/lib/table.c
+++ b/lib/table.c
@@ -46,8 +46,8 @@
 }
 
 /* Allocate new route node. */
-struct route_node *
-route_node_new ()
+static struct route_node *
+route_node_new (void)
 {
   struct route_node *node;
   node = XCALLOC (MTYPE_ROUTE_NODE, sizeof (struct route_node));
@@ -55,7 +55,7 @@
 }
 
 /* Allocate new route node with prefix set. */
-struct route_node *
+static struct route_node *
 route_node_set (struct route_table *table, struct prefix *prefix)
 {
   struct route_node *node;
@@ -69,7 +69,7 @@
 }
 
 /* Free route node. */
-void
+static void
 route_node_free (struct route_node *node)
 {
   XFREE (MTYPE_ROUTE_NODE, node);
@@ -220,7 +220,7 @@
 }
 
 /* Dump routing table. */
-void
+static void __attribute__ ((unused))
 route_dump_node (struct route_table *t)
 {
   struct route_node *node;
diff --git a/lib/table.h b/lib/table.h
index 6f09099..45ec606 100644
--- a/lib/table.h
+++ b/lib/table.h
@@ -53,21 +53,25 @@
 };
 
 /* Prototypes. */
-struct route_table *route_table_init (void);
-void route_table_finish (struct route_table *);
-void route_unlock_node (struct route_node *node);
-void route_node_delete (struct route_node *node);
-struct route_node *route_top (struct route_table *);
-struct route_node *route_next (struct route_node *);
-struct route_node *route_next_until (struct route_node *, struct route_node *);
-struct route_node *route_node_get (struct route_table *, struct prefix *);
-struct route_node *route_node_lookup (struct route_table *, struct prefix *);
-struct route_node *route_lock_node (struct route_node *node);
-struct route_node *route_node_match (struct route_table *, struct prefix *);
-struct route_node *route_node_match_ipv4 (struct route_table *,
+extern struct route_table *route_table_init (void);
+extern void route_table_finish (struct route_table *);
+extern void route_unlock_node (struct route_node *node);
+extern void route_node_delete (struct route_node *node);
+extern struct route_node *route_top (struct route_table *);
+extern struct route_node *route_next (struct route_node *);
+extern struct route_node *route_next_until (struct route_node *,
+                                            struct route_node *);
+extern struct route_node *route_node_get (struct route_table *,
+                                          struct prefix *);
+extern struct route_node *route_node_lookup (struct route_table *,
+                                             struct prefix *);
+extern struct route_node *route_lock_node (struct route_node *node);
+extern struct route_node *route_node_match (struct route_table *, 
+                                            struct prefix *);
+extern struct route_node *route_node_match_ipv4 (struct route_table *,
 					  struct in_addr *);
 #ifdef HAVE_IPV6
-struct route_node *route_node_match_ipv6 (struct route_table *,
+extern struct route_node *route_node_match_ipv6 (struct route_table *,
 					  struct in6_addr *);
 #endif /* HAVE_IPV6 */
 
diff --git a/lib/thread.c b/lib/thread.c
index 2e1dd24..a18db25 100644
--- a/lib/thread.c
+++ b/lib/thread.c
@@ -88,7 +88,7 @@
 static unsigned int
 cpu_record_hash_key (struct cpu_thread_history *a)
 {
-  return (unsigned int) a->func;
+  return (uintptr_t) a->func;
 }
 
 static int 
@@ -98,7 +98,7 @@
   return a->func == b->func;
 }
 
-static void*  
+static void *
 cpu_record_hash_alloc (struct cpu_thread_history *a)
 {
   struct cpu_thread_history *new;
@@ -252,7 +252,7 @@
 }
 
 /* Debug print for thread_master. */
-void
+static void  __attribute__ ((unused))
 thread_master_debug (struct thread_master *m)
 {
   printf ("-----------\n");
@@ -277,8 +277,9 @@
 thread_master_create ()
 {
   if (cpu_record == NULL) 
-    cpu_record = hash_create_size (1011, cpu_record_hash_key, 
-                                   cpu_record_hash_cmp);
+    cpu_record 
+      = hash_create_size (1011, (unsigned int (*) (void *))cpu_record_hash_key, 
+                          (int (*) (void *, void *))cpu_record_hash_cmp);
     
   return (struct thread_master *) XCALLOC (MTYPE_THREAD_MASTER,
 					   sizeof (struct thread_master));
@@ -375,22 +376,22 @@
   XFREE (MTYPE_THREAD_MASTER, m);
 }
 
+/* Thread list is empty or not.  */
+static inline int
+thread_empty (struct thread_list *list)
+{
+  return  list->head ? 0 : 1;
+}
+
 /* Delete top of the list and return it. */
 static struct thread *
 thread_trim_head (struct thread_list *list)
 {
-  if (list->head)
+  if (!thread_empty (list))
     return thread_list_delete (list, list->head);
   return NULL;
 }
 
-/* Thread list is empty or not.  */
-int
-thread_empty (struct thread_list *list)
-{
-  return  list->head ? 0 : 1;
-}
-
 /* Return remain time in second. */
 unsigned long
 thread_timer_remain_second (struct thread *thread)
@@ -437,7 +438,7 @@
 {
   struct thread *thread;
 
-  if (m->unuse.head)
+  if (!thread_empty (&m->unuse))
     {
       thread = thread_trim_head (&m->unuse);
       if (thread->funcname)
@@ -687,7 +688,7 @@
 static struct timeval *
 thread_timer_wait (struct thread_list *tlist, struct timeval *timer_val)
 {
-  if (tlist->head)
+  if (!thread_empty (tlist))
     {
       *timer_val = timeval_subtract (tlist->head->u.sands, recent_time);
       return timer_val;
@@ -695,7 +696,7 @@
   return NULL;
 }
 
-struct thread *
+static struct thread *
 thread_run (struct thread_master *m, struct thread *thread,
 	    struct thread *fetch)
 {
@@ -879,7 +880,8 @@
   
   tmp.func = thread->func;
   tmp.funcname = thread->funcname;
-  cpu = hash_get(cpu_record, &tmp, cpu_record_hash_alloc);
+  cpu = hash_get (cpu_record, &tmp, 
+                  (void * (*) (void *))cpu_record_hash_alloc);
 
   GETRUSAGE (&thread->ru);
 
diff --git a/lib/thread.h b/lib/thread.h
index 0d84cfc..4a3bbbe 100644
--- a/lib/thread.h
+++ b/lib/thread.h
@@ -158,32 +158,38 @@
 #define thread_add_background(m,f,a,v) funcname_thread_add_background(m,f,a,v,#f)
 
 /* Prototypes. */
-struct thread_master *thread_master_create ();
-struct thread *funcname_thread_add_read (struct thread_master *, 
-				int (*)(struct thread *), void *, int, const char*);
-struct thread *funcname_thread_add_write (struct thread_master *,
-				 int (*)(struct thread *), void *, int, const char*);
-struct thread *funcname_thread_add_timer (struct thread_master *,
-				 int (*)(struct thread *), void *, long, const char*);
-struct thread *funcname_thread_add_timer_msec (struct thread_master *,
-				 int (*)(struct thread *), void *, long, const char*);
-struct thread *funcname_thread_add_event (struct thread_master *,
-				 int (*)(struct thread *), void *, int, const char*);
-struct thread *funcname_thread_add_background (struct thread_master *,
-				               int (*func)(struct thread *),
+extern struct thread_master *thread_master_create (void);
+extern void thread_master_free (struct thread_master *);
+
+extern struct thread *funcname_thread_add_read (struct thread_master *, 
+				                int (*)(struct thread *),
+				                void *, int, const char*);
+extern struct thread *funcname_thread_add_write (struct thread_master *,
+				                 int (*)(struct thread *),
+				                 void *, int, const char*);
+extern struct thread *funcname_thread_add_timer (struct thread_master *,
+				                 int (*)(struct thread *),
+				                 void *, long, const char*);
+extern struct thread *funcname_thread_add_timer_msec (struct thread_master *,
+				                      int (*)(struct thread *),
+				                      void *, long, const char*);
+extern struct thread *funcname_thread_add_event (struct thread_master *,
+				                 int (*)(struct thread *),
+				                 void *, int, const char*);
+extern struct thread *funcname_thread_add_background (struct thread_master *,
+                                               int (*func)(struct thread *),
 				               void *arg,
 				               long milliseconds_to_delay,
 					       const char *funcname);
-
-void thread_cancel (struct thread *);
-void thread_cancel_event (struct thread_master *, void *);
-
-struct thread *thread_fetch (struct thread_master *, struct thread *);
-struct thread *funcname_thread_execute (struct thread_master *,
-			       int (*)(struct thread *), void *, int, const char *);
-void thread_call (struct thread *);
-unsigned long thread_timer_remain_second (struct thread *);
-int thread_should_yield (struct thread *);
+extern struct thread *funcname_thread_execute (struct thread_master *,
+                                               int (*)(struct thread *),
+                                               void *, int, const char *);
+extern void thread_cancel (struct thread *);
+extern void thread_cancel_event (struct thread_master *, void *);
+extern struct thread *thread_fetch (struct thread_master *, struct thread *);
+extern void thread_call (struct thread *);
+extern unsigned long thread_timer_remain_second (struct thread *);
+extern int thread_should_yield (struct thread *);
 
 extern struct cmd_element show_thread_cpu_cmd;
 
diff --git a/lib/vector.h b/lib/vector.h
index deaf6a8..6b27fd9 100644
--- a/lib/vector.h
+++ b/lib/vector.h
@@ -45,19 +45,19 @@
 #define vector_active(V) ((V)->active)
 
 /* Prototypes. */
-vector vector_init (unsigned int size);
-void vector_ensure (vector v, unsigned int num);
-int vector_empty_slot (vector v);
-int vector_set (vector v, void *val);
-int vector_set_index (vector v, unsigned int i, void *val);
-void vector_unset (vector v, unsigned int i);
-unsigned int vector_count (vector v);
-void vector_only_wrapper_free (vector v);
-void vector_only_index_free (void *index);
-void vector_free (vector v);
-vector vector_copy (vector v);
+extern vector vector_init (unsigned int size);
+extern void vector_ensure (vector v, unsigned int num);
+extern int vector_empty_slot (vector v);
+extern int vector_set (vector v, void *val);
+extern int vector_set_index (vector v, unsigned int i, void *val);
+extern void vector_unset (vector v, unsigned int i);
+extern unsigned int vector_count (vector v);
+extern void vector_only_wrapper_free (vector v);
+extern void vector_only_index_free (void *index);
+extern void vector_free (vector v);
+extern vector vector_copy (vector v);
 
-void *vector_lookup (vector, unsigned int);
-void *vector_lookup_ensure (vector, unsigned int);
+extern void *vector_lookup (vector, unsigned int);
+extern void *vector_lookup_ensure (vector, unsigned int);
 
 #endif /* _ZEBRA_VECTOR_H */
diff --git a/lib/vty.h b/lib/vty.h
index 6faa7d8..7289b7e 100644
--- a/lib/vty.h
+++ b/lib/vty.h
@@ -174,26 +174,49 @@
 #define VTY_GET_INTEGER(NAME,V,STR) \
   VTY_GET_INTEGER_RANGE(NAME,V,STR,0U,UINT32_MAX)
 
+#define VTY_GET_IPV4_ADDRESS(NAME,V,STR)                                      \
+{                                                                             \
+  int retv;                                                                   \
+  retv = inet_aton ((STR), &(V));                                             \
+  if (!retv)                                                                  \
+    {                                                                         \
+      vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE);              \
+      return CMD_WARNING;                                                     \
+    }                                                                         \
+}
+
+#define VTY_GET_IPV4_PREFIX(NAME,V,STR)                                       \
+{                                                                             \
+  int retv;                                                                   \
+  retv = str2prefix_ipv4 ((STR), &(V));                                       \
+  if (retv <= 0)                                                              \
+    {                                                                         \
+      vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE);              \
+      return CMD_WARNING;                                                     \
+    }                                                                         \
+}
+
 /* Exported variables */
 extern char integrate_default[];
 
 /* Prototypes. */
-void vty_init (struct thread_master *);
-void vty_init_vtysh (void);
-void vty_reset (void);
-struct vty *vty_new (void);
-int vty_out (struct vty *, const char *, ...) PRINTF_ATTRIBUTE(2, 3);
-void vty_read_config (char *, char *);
-void vty_time_print (struct vty *, int);
-void vty_serv_sock (const char *, unsigned short, const char *);
-void vty_close (struct vty *);
-char *vty_get_cwd (void);
-void vty_log (const char *level, const char *proto, const char *fmt, va_list);
-int vty_config_lock (struct vty *);
-int vty_config_unlock (struct vty *);
-int vty_shell (struct vty *);
-int vty_shell_serv (struct vty *);
-void vty_hello (struct vty *);
+extern void vty_init (struct thread_master *);
+extern void vty_init_vtysh (void);
+extern void vty_reset (void);
+extern struct vty *vty_new (void);
+extern int vty_out (struct vty *, const char *, ...) PRINTF_ATTRIBUTE(2, 3);
+extern void vty_read_config (char *, char *);
+extern void vty_time_print (struct vty *, int);
+extern void vty_serv_sock (const char *, unsigned short, const char *);
+extern void vty_close (struct vty *);
+extern char *vty_get_cwd (void);
+extern void vty_log (const char *level, const char *proto, 
+                     const char *fmt, va_list);
+extern int vty_config_lock (struct vty *);
+extern int vty_config_unlock (struct vty *);
+extern int vty_shell (struct vty *);
+extern int vty_shell_serv (struct vty *);
+extern void vty_hello (struct vty *);
 
 /* Send a fixed-size message to all vty terminal monitors; this should be
    an async-signal-safe function. */
diff --git a/lib/workqueue.h b/lib/workqueue.h
index 5b4e82e..257667e 100644
--- a/lib/workqueue.h
+++ b/lib/workqueue.h
@@ -54,13 +54,13 @@
   /* specification for this work queue */
   struct {
     /* work function to process items with */
-    wq_item_status (*workfunc) ();
+    wq_item_status (*workfunc) (void *);
 
     /* error handling function, optional */
     void (*errorfunc) (struct work_queue *, struct work_queue_item *);
     
     /* callback to delete user specific item data */
-    void (*del_item_data) ();
+    void (*del_item_data) (void *);
     
     /* max number of retries to make for item that errors */
     unsigned int max_retries;	
@@ -81,11 +81,12 @@
 };
 
 /* User API */
-struct work_queue *work_queue_new (struct thread_master *, const char *);
-void work_queue_free (struct work_queue *);
-void work_queue_add (struct work_queue *, void *);
+extern struct work_queue *work_queue_new (struct thread_master *,
+                                          const char *);
+extern void work_queue_free (struct work_queue *);
+extern void work_queue_add (struct work_queue *, void *);
 
 /* Helpers, exported for thread.c and command.c */
-int work_queue_run (struct thread *);
+extern int work_queue_run (struct thread *);
 extern struct cmd_element show_work_queues_cmd;
 #endif /* _QUAGGA_WORK_QUEUE_H */
diff --git a/lib/zclient.c b/lib/zclient.c
index cd99b84..d0c4c3b 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -32,9 +32,6 @@
 #include "zclient.h"
 #include "memory.h"
 #include "table.h"
-
-#include "zebra/rib.h"
-#include "zebra/zserv.h"
 
 /* Zebra client events. */
 enum event {ZCLIENT_SCHEDULE, ZCLIENT_READ, ZCLIENT_CONNECT};
diff --git a/lib/zclient.h b/lib/zclient.h
index aa9f75c..910db0d 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -108,38 +108,38 @@
 };
 
 /* Prototypes of zebra client service functions. */
-struct zclient *zclient_new (void);
-void zclient_init (struct zclient *, int);
-int zclient_start (struct zclient *);
-void zclient_stop (struct zclient *);
-void zclient_reset (struct zclient *);
+extern struct zclient *zclient_new (void);
+extern void zclient_init (struct zclient *, int);
+extern int zclient_start (struct zclient *);
+extern void zclient_stop (struct zclient *);
+extern void zclient_reset (struct zclient *);
 
 /* Get TCP socket connection to zebra daemon at loopback address. */
-int zclient_socket (void);
+extern int zclient_socket (void);
 
 /* Get unix stream socket connection to zebra daemon at given path. */
-int zclient_socket_un (const char *);
+extern int zclient_socket_un (const char *);
 
 /* Send redistribute command to zebra daemon. Do not update zclient state. */
-int zebra_redistribute_send (int command, struct zclient *, int type);
+extern int zebra_redistribute_send (int command, struct zclient *, int type);
 
 /* If state has changed, update state and call zebra_redistribute_send. */
-void zclient_redistribute (int command, struct zclient *, int type);
+extern void zclient_redistribute (int command, struct zclient *, int type);
 
 /* If state has changed, update state and send the command to zebra. */
-void zclient_redistribute_default (int command, struct zclient *);
+extern void zclient_redistribute_default (int command, struct zclient *);
 
 /* Send the message in zclient->obuf to the zebra daemon (or enqueue it).
    Returns 0 for success or -1 on an I/O error. */
 extern int zclient_send_message(struct zclient *);
 
-struct interface *zebra_interface_add_read (struct stream *);
-struct interface *zebra_interface_state_read (struct stream *s);
-struct connected *zebra_interface_address_read (int, struct stream *);
-void zebra_interface_if_set_value (struct stream *, struct interface *);
-void zebra_router_id_update_read (struct stream *s, struct prefix *rid);
-int zapi_ipv4_route (u_char, struct zclient *, struct prefix_ipv4 *, 
-                     struct zapi_ipv4 *);
+extern struct interface *zebra_interface_add_read (struct stream *);
+extern struct interface *zebra_interface_state_read (struct stream *s);
+extern struct connected *zebra_interface_address_read (int, struct stream *);
+extern void zebra_interface_if_set_value (struct stream *, struct interface *);
+extern void zebra_router_id_update_read (struct stream *s, struct prefix *rid);
+extern int zapi_ipv4_route (u_char, struct zclient *, struct prefix_ipv4 *, 
+                            struct zapi_ipv4 *);
 
 #ifdef HAVE_IPV6
 /* IPv6 prefix add and delete function prototype. */
@@ -163,7 +163,7 @@
   u_int32_t metric;
 };
 
-int zapi_ipv6_route (u_char cmd, struct zclient *zclient, 
+extern int zapi_ipv6_route (u_char cmd, struct zclient *zclient, 
                      struct prefix_ipv6 *p, struct zapi_ipv6 *api);
 #endif /* HAVE_IPV6 */
 
diff --git a/lib/zebra.h b/lib/zebra.h
index 3a93b7a..b4ab335 100644
--- a/lib/zebra.h
+++ b/lib/zebra.h
@@ -345,6 +345,9 @@
 #define IN6_ARE_ADDR_EQUAL IN6_IS_ADDR_EQUAL
 #endif /* IN6_ARE_ADDR_EQUAL */
 
+/* default zebra TCP port for zclient */
+#define ZEBRA_PORT			2600
+
 /* Zebra message types. */
 #define ZEBRA_INTERFACE_ADD                1
 #define ZEBRA_INTERFACE_DELETE             2