Merge branch 'volatile/fix_warnings'

Thanks to Donald Sharp and Greg Troxel for providing feedback!

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
diff --git a/babeld/Makefile.am b/babeld/Makefile.am
index 13922d0..d34e180 100644
--- a/babeld/Makefile.am
+++ b/babeld/Makefile.am
@@ -4,7 +4,7 @@
 DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\"
 INSTALL_SDATA=@INSTALL@ -m 600
 
-AM_CFLAGS = $(PICFLAGS)
+AM_CFLAGS = $(PICFLAGS) $(WERROR)
 AM_LDFLAGS = $(PILDFLAGS)
 
 noinst_LIBRARIES = libbabel.a
diff --git a/babeld/babeld.c b/babeld/babeld.c
index 1ae3f04..eaa91b7 100644
--- a/babeld/babeld.c
+++ b/babeld/babeld.c
@@ -328,8 +328,8 @@
         /* if there is no timeout, we must wait. */
         if(timeval_compare(&tv, &babel_now) > 0) {
             timeval_minus(&tv, &tv, &babel_now);
-            debugf(BABEL_DEBUG_TIMEOUT, "babel main loop : timeout: %ld msecs",
-                   tv.tv_sec * 1000 + tv.tv_usec / 1000);
+            debugf(BABEL_DEBUG_TIMEOUT, "babel main loop : timeout: %lld msecs",
+                   tv.tv_sec * 1000LL + tv.tv_usec / 1000LL);
             /* it happens often to have less than 1 ms, it's bad. */
             timeval_add_msec(&tv, &tv, 300);
             babel_set_timer(&tv);
diff --git a/bgpd/Makefile.am b/bgpd/Makefile.am
index 42f1f48..92fa10c 100644
--- a/bgpd/Makefile.am
+++ b/bgpd/Makefile.am
@@ -4,7 +4,7 @@
 DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\"
 INSTALL_SDATA=@INSTALL@ -m 600
 
-AM_CFLAGS = $(PICFLAGS)
+AM_CFLAGS = $(PICFLAGS) $(WERROR)
 AM_LDFLAGS = $(PILDFLAGS)
 
 noinst_LIBRARIES = libbgp.a
diff --git a/bgpd/bgp_aspath.c b/bgpd/bgp_aspath.c
index cfa9bc1..0aec3ef 100644
--- a/bgpd/bgp_aspath.c
+++ b/bgpd/bgp_aspath.c
@@ -1378,7 +1378,7 @@
 aspath_add_asns (struct aspath *aspath, as_t asno, u_char type, unsigned num)
 {
   struct assegment *assegment = aspath->segments;
-  int i;
+  unsigned i;
 
   if (assegment && assegment->type == type)
     {
@@ -1913,7 +1913,7 @@
 
   as = (struct aspath *) backet->data;
 
-  vty_out (vty, "[%p:%u] (%ld) ", backet, backet->key, as->refcnt);
+  vty_out (vty, "[%p:%u] (%ld) ", (void *)backet, backet->key, as->refcnt);
   vty_out (vty, "%s%s", as->str, VTY_NEWLINE);
 }
 
diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c
index be316da..5c832ed 100644
--- a/bgpd/bgp_attr.c
+++ b/bgpd/bgp_attr.c
@@ -72,7 +72,6 @@
   /* bgp_attr_flags_diagnose() relies on this bit being last in this list */
   { BGP_ATTR_FLAG_EXTLEN,   "Extended Length" },
 };
-static const size_t attr_flag_str_max = array_size(attr_flag_str);
 
 static struct hash *cluster_hash;
 
diff --git a/bgpd/bgp_damp.c b/bgpd/bgp_damp.c
index dd6c759..05c30ff 100644
--- a/bgpd/bgp_damp.c
+++ b/bgpd/bgp_damp.c
@@ -529,15 +529,15 @@
 	   && bgp_damp_cfg.reuse_limit == DEFAULT_REUSE
 	   && bgp_damp_cfg.suppress_value == DEFAULT_SUPPRESS
 	   && bgp_damp_cfg.max_suppress_time == bgp_damp_cfg.half_life*4)
-    vty_out (vty, " bgp dampening %ld%s",
-	     bgp_damp_cfg.half_life/60,
+    vty_out (vty, " bgp dampening %lld%s",
+	     bgp_damp_cfg.half_life/60LL,
 	     VTY_NEWLINE);
   else
-    vty_out (vty, " bgp dampening %ld %d %d %ld%s",
-	     bgp_damp_cfg.half_life/60,
+    vty_out (vty, " bgp dampening %lld %d %d %lld%s",
+	     bgp_damp_cfg.half_life/60LL,
 	     bgp_damp_cfg.reuse_limit,
 	     bgp_damp_cfg.suppress_value,
-	     bgp_damp_cfg.max_suppress_time/60,
+	     bgp_damp_cfg.max_suppress_time/60LL,
 	     VTY_NEWLINE);
 }
 
diff --git a/bgpd/bgp_ecommunity.c b/bgpd/bgp_ecommunity.c
index 482e76b..04957d4 100644
--- a/bgpd/bgp_ecommunity.c
+++ b/bgpd/bgp_ecommunity.c
@@ -281,10 +281,10 @@
 /* Extended Communities token enum. */
 enum ecommunity_token
 {
+  ecommunity_token_unknown = 0,
   ecommunity_token_rt,
   ecommunity_token_soo,
   ecommunity_token_val,
-  ecommunity_token_unknown
 };
 
 /* Get next Extended Communities token from the string. */
@@ -511,7 +511,7 @@
 ecommunity_str2com (const char *str, int type, int keyword_included)
 {
   struct ecommunity *ecom = NULL;
-  enum ecommunity_token token;
+  enum ecommunity_token token = ecommunity_token_unknown;
   struct ecommunity_val eval;
   int keyword = 0;
 
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index f84a72d..34cb7c0 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -1666,9 +1666,10 @@
   bm->process_main_queue->spec.max_retries = 0;
   bm->process_main_queue->spec.hold = 50;
   
-  memcpy (bm->process_rsclient_queue, bm->process_main_queue,
-          sizeof (struct work_queue *));
   bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
+  bm->process_rsclient_queue->spec.del_item_data = &bgp_processq_del;
+  bm->process_rsclient_queue->spec.max_retries = 0;
+  bm->process_rsclient_queue->spec.hold = 50;
 }
 
 void
@@ -7905,19 +7906,13 @@
 
 DEFUN (show_bgp_view_afi_safi_community_all,
        show_bgp_view_afi_safi_community_all_cmd,
-#ifdef HAVE_IPV6
        "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community",
-#else
-       "show bgp view WORD ipv4 (unicast|multicast) community",
-#endif
        SHOW_STR
        BGP_STR
        "BGP view\n"
        "View name\n"
        "Address family\n"
-#ifdef HAVE_IPV6
        "Address family\n"
-#endif
        "Address Family modifier\n"
        "Address Family modifier\n"
        "Display routes matching the communities\n")
@@ -7934,31 +7929,20 @@
       return CMD_WARNING;
     }
 
-#ifdef HAVE_IPV6
   afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
   safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
-#else
-  afi = AFI_IP;
-  safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
-#endif
   return bgp_show (vty, bgp, afi, safi, bgp_show_type_community_all, NULL);
 }
 
 DEFUN (show_bgp_view_afi_safi_community,
        show_bgp_view_afi_safi_community_cmd,
-#ifdef HAVE_IPV6
        "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
-#else
-       "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
-#endif
        SHOW_STR
        BGP_STR
        "BGP view\n"
        "View name\n"
        "Address family\n"
-#ifdef HAVE_IPV6
        "Address family\n"
-#endif
        "Address family modifier\n"
        "Address family modifier\n"
        "Display routes matching the communities\n"
@@ -7970,32 +7954,20 @@
   int afi;
   int safi;
 
-#ifdef HAVE_IPV6
   afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
   safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   return bgp_show_community (vty, argv[0], argc-3, &argv[3], 0, afi, safi);
-#else
-  afi = AFI_IP;
-  safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
-  return bgp_show_community (vty, argv[0], argc-2, &argv[2], 0, afi, safi);
-#endif
 }
 
 ALIAS (show_bgp_view_afi_safi_community,
        show_bgp_view_afi_safi_community2_cmd,
-#ifdef HAVE_IPV6
        "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
-#else
-       "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
-#endif
        SHOW_STR
        BGP_STR
        "BGP view\n"
        "View name\n"
        "Address family\n"
-#ifdef HAVE_IPV6
        "Address family\n"
-#endif
        "Address family modifier\n"
        "Address family modifier\n"
        "Display routes matching the communities\n"
@@ -8010,19 +7982,13 @@
 
 ALIAS (show_bgp_view_afi_safi_community,
        show_bgp_view_afi_safi_community3_cmd,
-#ifdef HAVE_IPV6
        "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
-#else
-       "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
-#endif
        SHOW_STR
        BGP_STR
        "BGP view\n"
        "View name\n"
        "Address family\n"
-#ifdef HAVE_IPV6
        "Address family\n"
-#endif
        "Address family modifier\n"
        "Address family modifier\n"
        "Display routes matching the communities\n"
@@ -8041,19 +8007,13 @@
 
 ALIAS (show_bgp_view_afi_safi_community,
        show_bgp_view_afi_safi_community4_cmd,
-#ifdef HAVE_IPV6
        "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
-#else
-       "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
-#endif
        SHOW_STR
        BGP_STR
        "BGP view\n"
        "View name\n"
        "Address family\n"
-#ifdef HAVE_IPV6
        "Address family\n"
-#endif
        "Address family modifier\n"
        "Address family modifier\n"
        "Display routes matching the communities\n"
@@ -10199,19 +10159,13 @@
 
 DEFUN (show_bgp_view_afi_safi_neighbor_adv_recd_routes,
        show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd,
-#ifdef HAVE_IPV6
        "show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
-#else
-       "show bgp view WORD ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)",
-#endif
        SHOW_STR
        BGP_STR
        "BGP view\n"
        "View name\n"
        "Address family\n"
-#ifdef HAVE_IPV6
        "Address family\n"
-#endif
        "Address family modifier\n"
        "Address family modifier\n"
        "Detailed information on TCP and BGP neighbor connections\n"
@@ -10225,24 +10179,14 @@
   int in;
   struct peer *peer;
 
-#ifdef HAVE_IPV6
-    peer = peer_lookup_in_view (vty, argv[0], argv[3]);
-#else
-    peer = peer_lookup_in_view (vty, argv[0], argv[2]);
-#endif
+  peer = peer_lookup_in_view (vty, argv[0], argv[3]);
 
   if (! peer)
     return CMD_WARNING;
 
-#ifdef HAVE_IPV6
   afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
   safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
   in = (strncmp (argv[4], "r", 1) == 0) ? 1 : 0;
-#else
-  afi = AFI_IP;
-  safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
-  in = (strncmp (argv[3], "r", 1) == 0) ? 1 : 0;
-#endif
 
   return peer_adj_routes (vty, peer, afi, safi, in);
 }
diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c
index 857781f..416a3e5 100644
--- a/bgpd/bgp_routemap.c
+++ b/bgpd/bgp_routemap.c
@@ -131,8 +131,8 @@
       void *object)
 {
   union sockunion *su;
-  union sockunion su_def = { .sa.sa_family = AF_INET,
-			     .sin.sin_addr.s_addr = INADDR_ANY };
+  union sockunion su_def = { .sin = { .sin_family = AF_INET,
+                                      .sin_addr.s_addr = INADDR_ANY } };
   struct peer_group *group;
   struct peer *peer;
   struct listnode *node, *nnode;
@@ -826,12 +826,12 @@
   r = (long) rand();
 #endif
 
-  switch (*(unsigned *) rule)
+  switch (*(long *) rule)
   {
     case 0: break;
     case RAND_MAX: return RMAP_MATCH;
     default:
-      if (r < *(unsigned *) rule)
+      if (r < *(long *) rule)
         {
           return RMAP_MATCH;
         }
@@ -843,7 +843,7 @@
 static void *
 route_match_probability_compile (const char *arg)
 {
-  unsigned *lobule;
+  long *lobule;
   unsigned  perc;
 
 #if _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
@@ -853,7 +853,7 @@
 #endif
 
   perc    = atoi (arg);
-  lobule  = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (unsigned));
+  lobule  = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (long));
 
   switch (perc)
     {
@@ -3163,7 +3163,7 @@
        "Transform BGP AS_PATH attribute\n"
        "Prepend to the as-path\n"
        "Use the peer's AS-number\n"
-       "Number of times to insert");
+       "Number of times to insert")
 
 DEFUN (no_set_aspath_prepend,
        no_set_aspath_prepend_cmd,
diff --git a/bgpd/bgp_snmp.c b/bgpd/bgp_snmp.c
index 79aaa03..0f4aeec 100644
--- a/bgpd/bgp_snmp.c
+++ b/bgpd/bgp_snmp.c
@@ -337,38 +337,42 @@
   return NULL;
 }
 
+/* 1.3.6.1.2.1.15.3.1.x  = 10 */
+#define PEERTAB_NAMELEN 10
+
 static struct peer *
 bgpPeerTable_lookup (struct variable *v, oid name[], size_t *length, 
 		     struct in_addr *addr, int exact)
 {
   struct peer *peer = NULL;
+  size_t namelen = v ? v->namelen : PEERTAB_NAMELEN;
   int len;
 
   if (exact)
     {
       /* Check the length. */
-      if (*length - v->namelen != sizeof (struct in_addr))
+      if (*length - namelen != sizeof (struct in_addr))
 	return NULL;
 
-      oid2in_addr (name + v->namelen, IN_ADDR_SIZE, addr);
+      oid2in_addr (name + namelen, IN_ADDR_SIZE, addr);
 
       peer = peer_lookup_addr_ipv4 (addr);
       return peer;
     }
   else
     {
-      len = *length - v->namelen;
+      len = *length - namelen;
       if (len > 4) len = 4;
       
-      oid2in_addr (name + v->namelen, len, addr);
+      oid2in_addr (name + namelen, len, addr);
       
       peer = bgp_peer_lookup_next (addr);
 
       if (peer == NULL)
 	return NULL;
 
-      oid_copy_addr (name + v->namelen, addr, sizeof (struct in_addr));
-      *length = sizeof (struct in_addr) + v->namelen;
+      oid_copy_addr (name + namelen, addr, sizeof (struct in_addr));
+      *length = sizeof (struct in_addr) + namelen;
 
       return peer;
     }
@@ -379,14 +383,12 @@
 static int
 write_bgpPeerTable (int action, u_char *var_val,
 		    u_char var_val_type, size_t var_val_len,
-		    u_char *statP, oid *name, size_t length,
-		    struct variable *v)
+		    u_char *statP, oid *name, size_t length)
 {
   struct in_addr addr;
   struct peer *peer;
   long intval;
-  size_t bigsize = SNMP_MAX_LEN;
-  
+
   if (var_val_type != ASN_INTEGER) 
     {
       return SNMP_ERR_WRONGTYPE;
@@ -396,21 +398,21 @@
       return SNMP_ERR_WRONGLENGTH;
     }
 
-  if (! asn_parse_int(var_val, &bigsize, &var_val_type,
-                      &intval, sizeof(long)))
-    {
-      return SNMP_ERR_WRONGENCODING;
-    }
+  intval = *(long *)var_val;
 
   memset (&addr, 0, sizeof (struct in_addr));
 
-  peer = bgpPeerTable_lookup (v, name, &length, &addr, 1);
+  peer = bgpPeerTable_lookup (NULL, name, &length, &addr, 1);
   if (! peer)
     return SNMP_ERR_NOSUCHNAME;
 
-  printf ("val: %ld\n", intval);
+  if (action != SNMP_MSG_INTERNAL_SET_COMMIT)
+    return SNMP_ERR_NOERROR;
 
-  switch (v->magic)
+  zlog_info ("%s: SNMP write .%ld = %ld",
+             peer->host, (long)name[PEERTAB_NAMELEN - 1], intval);
+
+  switch (name[PEERTAB_NAMELEN - 1])
     {
     case BGPPEERADMINSTATUS:
 #define BGP_PeerAdmin_stop  1
diff --git a/bgpd/bgp_table.h b/bgpd/bgp_table.h
index 04a1d37..209a18c 100644
--- a/bgpd/bgp_table.h
+++ b/bgpd/bgp_table.h
@@ -55,7 +55,7 @@
    * @see bgp_node_to_rnode
    * @see bgp_node_from_rnode
    */
-  ROUTE_NODE_FIELDS;
+  ROUTE_NODE_FIELDS
 
   struct bgp_adj_out *adj_out;
 
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index e6a3660..00d766d 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -8235,7 +8235,7 @@
   struct community *com;
 
   com = (struct community *) backet->data;
-  vty_out (vty, "[%p] (%ld) %s%s", backet, com->refcnt,
+  vty_out (vty, "[%p] (%ld) %s%s", (void *)backet, com->refcnt,
 	   community_str (com), VTY_NEWLINE);
 }
 
diff --git a/buildtest.sh b/buildtest.sh
index 3bc25f2..3dd8ed8 100755
--- a/buildtest.sh
+++ b/buildtest.sh
@@ -4,7 +4,7 @@
 # builds some git commit of Quagga in some different configurations
 # usage: buildtest.sh [commit [configurations...]]
 
-basecfg="--prefix=/usr --enable-user=quagga --enable-group=quagga --enable-vty-group=quagga --enable-configfile-mask=0660 --enable-logfile-mask=0640 --enable-vtysh --sysconfdir=/etc/quagga --enable-exampledir=/etc/quagga/samples --localstatedir=/var/run/quagga --libdir=/usr/lib64/quagga --enable-rtadv --disable-static --enable-isisd --enable-multipath=0 --enable-babeld --enable-pimd"
+basecfg="--prefix=/usr --enable-user=quagga --enable-group=quagga --enable-vty-group=quagga --enable-configfile-mask=0660 --enable-logfile-mask=0640 --enable-vtysh --sysconfdir=/etc/quagga --enable-exampledir=/etc/quagga/samples --localstatedir=/var/run/quagga --libdir=/usr/lib64/quagga --enable-rtadv --disable-static --enable-isisd --enable-multipath=0 --enable-babeld --enable-pimd --enable-werror"
 
 configs_base="gcc|$basecfg"
 
diff --git a/configure.ac b/configure.ac
index 2c72cff..a82470c 100755
--- a/configure.ac
+++ b/configure.ac
@@ -86,20 +86,7 @@
 fi
 AM_CONDITIONAL([HAVE_LATEX], [test "x$HAVE_LATEX" = "xtrue"])
 
-dnl ------------------------------------------------------------------
-dnl Intel compiler check. Although Intel tries really hard to make icc
-dnl look like gcc, there are some differences. It's very verbose with
-dnl -Wall and it doesn't support the individual -W options.
-dnl ------------------------------------------------------------------
-if test "x${GCC}" = "xyes" ; then
-  COMPILER="GCC"
-  AC_MSG_CHECKING([whether we are using the Intel compiler])
-  AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
-      [AC_MSG_RESULT([no])],
-      [COMPILER="ICC"
-       AC_MSG_RESULT([yes])]
-  )
-else
+if test "x${GCC}" != "xyes" ; then
   AC_MSG_CHECKING([whether we are using SunPro compiler])
   AC_EGREP_CPP([^__SUNPRO_C.*0x5(7|8|9)], ["__SUNPRO_C" __SUNPRO_C],
       [AC_MSG_RESULT([no])],
@@ -115,47 +102,84 @@
 dnl (Wall is gcc specific... have to make sure
 dnl  gcc is being used before setting it)
 dnl
-dnl Intel icc 8.0 also sets __GNUC__, 
-dnl but doesn't support all these fancy -W options.
-dnl Intel compiler warnings we ignore:
-dnl 279: controlling expression is constant.
-dnl 869: parameter "xxx" was never referenced - to avoid massive warnings
-dnl      about "self", "vty", "argc" and "argv" never referenced in DEFUN
-dnl      macro.
-dnl 981: operands are evaluated in unspecified order.
-dnl
 dnl Sun Studio 10 / SunPro 5.7 is also supported,
 dnl so lets set some sane CFLAGS for it.
 dnl ---------------------------------------------
 
+AC_USE_SYSTEM_EXTENSIONS()
+AC_DEFUN([AC_C_FLAG], [{
+	AC_LANG_PUSH(C)
+	ac_c_flag_save="$CFLAGS"
+	CFLAGS="$CFLAGS $1"
+	AC_MSG_CHECKING([[whether $CC supports $1]])
+	AC_COMPILE_IFELSE(
+		[AC_LANG_PROGRAM([[]])],
+		[
+			AC_MSG_RESULT([yes])
+			m4_if([$3], [], [], [
+				CFLAGS="$ac_c_flag_save"
+				$3
+			])
+		], [
+			CFLAGS="$ac_c_flag_save"
+			AC_MSG_RESULT([no])
+			$2
+		])
+	AC_LANG_POP(C)
+	}])
+
 AC_MSG_CHECKING([whether to set a default CFLAGS])
 if test "x${cflags_specified}" = "x" ; then
   case ${COMPILER} in
-    "ICC")
-        CFLAGS="-Os -g -Wall"
-        AC_MSG_RESULT([Intel default])
-        ;;
-    "GCC")
-  	CFLAGS="-Os -fno-omit-frame-pointer -g -std=gnu99 -Wall"
-  	CFLAGS="${CFLAGS} -Wsign-compare -Wpointer-arith"
-  	CFLAGS="${CFLAGS} -Wbad-function-cast -Wwrite-strings"
-  	CFLAGS="${CFLAGS} -Wmissing-prototypes -Wmissing-declarations"
-  	CFLAGS="${CFLAGS} -Wchar-subscripts -Wcast-qual"
-  	# TODO: conditionally addd -Wpacked if handled
-  	AC_MSG_RESULT([gcc default])
-  	;;
     "SUNPRO")
-  	CFLAGS="-xO4 -v -g -xspace -xcode=pic32 -xstrconst -xc99"
-  	AC_MSG_RESULT([SunPro default])
-  	;;
+        CFLAGS="-xO4 -v -g -xspace -xcode=pic32 -xstrconst -xc99"
+        AC_MSG_RESULT([SunPro default])
+        ;;
     *)
-        AC_MSG_RESULT([unknown compiler])
+        AC_MSG_RESULT([autodetecting])
+
+        AC_C_FLAG([-diag-error 10006])
+        AC_C_FLAG([-std=gnu99])
+        AC_C_FLAG([-g])
+        AC_C_FLAG([-Os], [
+          AC_C_FLAG([-O2])
+        ])
+        AC_C_FLAG([-fno-omit-frame-pointer])
+        AC_C_FLAG([-Wall])
+        AC_C_FLAG([-Wextra])
+        AC_C_FLAG([-Wmissing-prototypes])
+        AC_C_FLAG([-Wmissing-declarations])
+        AC_C_FLAG([-Wpointer-arith])
+        AC_C_FLAG([-Wbad-function-cast])
+        AC_C_FLAG([-Wwrite-strings])
+        if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
+          AC_C_FLAG([-Wcast-qual])
+          AC_C_FLAG([-Wstrict-prototypes])
+          AC_C_FLAG([-Wmissing-noreturn])
+          AC_C_FLAG([-Wmissing-format-attribute])
+          AC_C_FLAG([-Wunreachable-code])
+          AC_C_FLAG([-Wpacked])
+          AC_C_FLAG([-Wpadded])
+        else
+          AC_C_FLAG([-Wno-unused-result])
+        fi
+        AC_C_FLAG([-Wno-unused-parameter])
+        AC_C_FLAG([-Wno-missing-field-initializers])
+        # ICC emits a broken warning for const char *x = a ? "b" : "c";
+        # for some reason the string consts get 'promoted' to char *,
+        # triggering a const to non-const conversion warning.
+        AC_C_FLAG([-diag-disable 3179])
         ;;
   esac
 else
   AC_MSG_RESULT([CFLAGS supplied by user])
 fi
 
+if test x"${enable_werror}" = x"yes" ; then
+  WERROR="-Werror"
+fi
+AC_SUBST(WERROR)
+
 dnl --------------
 dnl Check programs
 dnl --------------
@@ -277,13 +301,8 @@
   AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
 AC_ARG_ENABLE(fpm,
   AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
-
-if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
-  CFLAGS="${CFLAGS} -W -Wcast-qual -Wstrict-prototypes"
-  CFLAGS="${CFLAGS} -Wmissing-declarations -Wmissing-noreturn"
-  CFLAGS="${CFLAGS} -Wmissing-format-attribute -Wunreachable-code"
-  CFLAGS="${CFLAGS} -Wpacked -Wpadded"
-fi
+AC_ARG_ENABLE(werror,
+  AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
 
 if test x"${enable_gcc_rdynamic}" != x"no" ; then
   if test x"${enable_gcc_rdynamic}" = x"yes" -o x"$COMPILER" = x"GCC"; then
@@ -422,7 +441,6 @@
 AC_TYPE_UID_T
 AC_TYPE_MODE_T
 AC_TYPE_SIZE_T
-AC_TYPE_SIGNAL
 AC_STRUCT_TM
 
 dnl -------------------------
diff --git a/isisd/Makefile.am b/isisd/Makefile.am
index dba681b..4e67b22 100644
--- a/isisd/Makefile.am
+++ b/isisd/Makefile.am
@@ -6,7 +6,7 @@
 INSTALL_SDATA=@INSTALL@ -m 600
 LIBS = @LIBS@ 
 
-AM_CFLAGS = $(PICFLAGS)
+AM_CFLAGS = $(PICFLAGS) $(WERROR)
 AM_LDFLAGS = $(PILDFLAGS)
 
 noinst_LIBRARIES = libisis.a
diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c
index 414885f..a352436 100644
--- a/isisd/isis_adjacency.c
+++ b/isisd/isis_adjacency.c
@@ -396,7 +396,8 @@
       vty_out (vty, "%-13s", adj_state2string (adj->adj_state));
       now = time (NULL);
       if (adj->last_upd)
-	vty_out (vty, "%-9lu", adj->last_upd + adj->hold_time - now);
+        vty_out (vty, "%-9llu",
+                 (unsigned long long)adj->last_upd + adj->hold_time - now);
       else
 	vty_out (vty, "-        ");
       vty_out (vty, "%-10s", snpa_print (adj->snpa));
diff --git a/isisd/isis_bpf.c b/isisd/isis_bpf.c
index 4d5b165..f6176ef 100644
--- a/isisd/isis_bpf.c
+++ b/isisd/isis_bpf.c
@@ -301,13 +301,14 @@
 isis_send_pdu_bcast (struct isis_circuit *circuit, int level)
 {
   struct ether_header *eth;
-  int written, buflen;
+  ssize_t written;
+  size_t buflen;
 
   buflen = stream_get_endp (circuit->snd_stream) + LLC_LEN + ETHER_HDR_LEN;
   if (buflen > sizeof (sock_buff))
     {
-      zlog_warn ("isis_send_pdu_bcast: sock_buff size %lu is less than "
-		 "output pdu size %d on circuit %s",
+      zlog_warn ("isis_send_pdu_bcast: sock_buff size %zu is less than "
+		 "output pdu size %zu on circuit %s",
 		 sizeof (sock_buff), buflen, circuit->interface->name);
       return ISIS_WARNING;
     }
diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c
index 3d9fb47..fdff819 100644
--- a/isisd/isis_circuit.c
+++ b/isisd/isis_circuit.c
@@ -397,7 +397,7 @@
    */
   for (i = 0; i < strlen (ifp->name); i++)
     {
-      if (isdigit(ifp->name[i]))
+      if (isdigit((unsigned char)ifp->name[i]))
         {
           if (start < 0)
             {
@@ -1342,7 +1342,6 @@
 {
   struct interface *ifp;
   struct isis_area *area;
-  struct listnode *node;
   struct isis_circuit *circuit;
 
   ifp = (struct interface *) vty->index;
diff --git a/isisd/isis_circuit.h b/isisd/isis_circuit.h
index 7ed481d..d86fee0 100644
--- a/isisd/isis_circuit.h
+++ b/isisd/isis_circuit.h
@@ -23,6 +23,8 @@
 #ifndef ISIS_CIRCUIT_H
 #define ISIS_CIRCUIT_H
 
+#include "vty.h"
+
 #define CIRCUIT_MAX 255
 
 struct password
diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c
index f2a7923..88593de 100644
--- a/isisd/isis_lsp.c
+++ b/isisd/isis_lsp.c
@@ -379,7 +379,7 @@
   /* Compute autentication value */
   hmac_md5 (STREAM_DATA (lsp->pdu), stream_get_endp(lsp->pdu),
             (unsigned char *) &passwd->passwd, passwd->len,
-            (caddr_t) &hmac_md5_hash);
+            (unsigned char *) &hmac_md5_hash);
   /* Copy the hash into the stream */
   memcpy (STREAM_DATA (lsp->pdu) + lsp->auth_tlv_offset + 3,
           hmac_md5_hash, ISIS_AUTH_MD5_SIZE);
@@ -950,7 +950,7 @@
       memcpy (in6.s6_addr, ipv6_reach->prefix,
 	      PSIZE (ipv6_reach->prefix_len));
       inet_ntop (AF_INET6, &in6, (char *)buff, BUFSIZ);
-      if ((ipv6_reach->control_info &&
+      if ((ipv6_reach->control_info &
 	   CTRL_INFO_DISTRIBUTION) == DISTRIBUTION_INTERNAL)
 	vty_out (vty, "  Metric      : %-8d IPv6-Internal : %s/%d%s",
 		 ntohl (ipv6_reach->metric),
@@ -2396,7 +2396,7 @@
 top_lsp_refresh (struct thread *thread)
 {
   struct isis_lsp *lsp;
-  u_int16_t rem_lifetime, refresh_time;
+  u_int16_t rem_lifetime;
 
   lsp = THREAD_ARG (thread);
   assert (lsp);
@@ -2420,7 +2420,7 @@
   rem_lifetime = lsp_rem_lifetime (lsp->area, IS_LEVEL_1);
   lsp->lsp_header->rem_lifetime = htons (rem_lifetime);
 
-  refresh_time = lsp_refresh_time (lsp, rem_lifetime);
+  /* refresh_time = lsp_refresh_time (lsp, rem_lifetime); */
   THREAD_TIMER_ON (master, lsp->t_lsp_top_ref, top_lsp_refresh, lsp,
 		   lsp->area->lsp_refresh[0]);
 
diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c
index 166dd7c..02b50bf 100644
--- a/isisd/isis_pdu.c
+++ b/isisd/isis_pdu.c
@@ -204,7 +204,7 @@
       /* Compute the digest */
       hmac_md5 (STREAM_DATA (stream), stream_get_endp (stream),
                 (unsigned char *) &(local->passwd), local->len,
-                (caddr_t) &digest);
+                (unsigned char *) &digest);
       /* Copy back the authentication value after the check */
       memcpy (STREAM_DATA (stream) + auth_tlv_offset + 3,
               remote->passwd, ISIS_AUTH_MD5_SIZE);
@@ -1264,7 +1264,7 @@
   if (isis->debugs & DEBUG_ADJ_PACKETS)
     {
       zlog_debug ("ISIS-Adj (%s): Rcvd L%d LAN IIH from %s on %s, cirType %s, "
-		  "cirID %u, length %ld",
+		  "cirID %u, length %zd",
 		  circuit->area->area_tag,
 		  level, snpa_print (ssnpa), circuit->interface->name,
 		  circuit_t2string (circuit->is_type),
@@ -1975,89 +1975,6 @@
 }
 
 /*
- * Process ISH
- * ISO - 10589
- * Section 8.2.2 - Receiving ISH PDUs by an intermediate system
- * FIXME: sample packet dump, need to figure 0x81 - looks like NLPid
- *           0x82	0x15	0x01	0x00	0x04	0x01	0x2c	0x59
- *           0x38	0x08	0x47	0x00	0x01	0x00	0x02	0x00
- *           0x03	0x00	0x81	0x01	0xcc
- */
-static int
-process_is_hello (struct isis_circuit *circuit)
-{
-  struct isis_adjacency *adj;
-  int retval = ISIS_OK;
-  u_char neigh_len;
-  u_char *sysid;
-
-  if (isis->debugs & DEBUG_ADJ_PACKETS)
-    {
-      zlog_debug ("ISIS-Adj (%s): Rcvd ISH on %s, cirType %s, cirID %u",
-                  circuit->area->area_tag, circuit->interface->name,
-                  circuit_t2string (circuit->is_type), circuit->circuit_id);
-      if (isis->debugs & DEBUG_PACKET_DUMP)
-        zlog_dump_data (STREAM_DATA (circuit->rcv_stream),
-                        stream_get_endp (circuit->rcv_stream));
-    }
-
-  /* In this point in time we are not yet able to handle is_hellos
-   * on lan - Sorry juniper...
-   */
-  if (circuit->circ_type == CIRCUIT_T_BROADCAST)
-    return retval;
-
-  neigh_len = stream_getc (circuit->rcv_stream);
-  sysid = STREAM_PNT (circuit->rcv_stream) + neigh_len - 1 - ISIS_SYS_ID_LEN;
-  adj = circuit->u.p2p.neighbor;
-  if (!adj)
-    {
-      /* 8.2.2 */
-      adj = isis_new_adj (sysid, NULL, 0, circuit);
-      if (adj == NULL)
-	return ISIS_ERROR;
-
-      isis_adj_state_change (adj, ISIS_ADJ_INITIALIZING, NULL);
-      adj->sys_type = ISIS_SYSTYPE_UNKNOWN;
-      circuit->u.p2p.neighbor = adj;
-    }
-  /* 8.2.2 a) */
-  if ((adj->adj_state == ISIS_ADJ_UP) && memcmp (adj->sysid, sysid,
-						 ISIS_SYS_ID_LEN))
-    {
-      /* 8.2.2 a) 1) FIXME: adjStateChange(down) event */
-      /* 8.2.2 a) 2) delete the adj */
-      XFREE (MTYPE_ISIS_ADJACENCY, adj);
-      /* 8.2.2 a) 3) create a new adj */
-      adj = isis_new_adj (sysid, NULL, 0, circuit);
-      if (adj == NULL)
-	return ISIS_ERROR;
-
-      /* 8.2.2 a) 3) i */
-      isis_adj_state_change (adj, ISIS_ADJ_INITIALIZING, NULL);
-      /* 8.2.2 a) 3) ii */
-      adj->sys_type = ISIS_SYSTYPE_UNKNOWN;
-      /* 8.2.2 a) 4) quite meaningless */
-    }
-  /* 8.2.2 b) ignore on condition */
-  if ((adj->adj_state == ISIS_ADJ_INITIALIZING) &&
-      (adj->sys_type == ISIS_SYSTYPE_IS))
-    {
-      /* do nothing */
-    }
-  else
-    {
-      /* 8.2.2 c) respond with a p2p IIH */
-      send_hello (circuit, 1);
-    }
-  /* 8.2.2 d) type is IS */
-  adj->sys_type = ISIS_SYSTYPE_IS;
-  /* 8.2.2 e) FIXME: Circuit type of? */
-
-  return retval;
-}
-
-/*
  * PDU Dispatcher
  */
 
@@ -2321,7 +2238,7 @@
   struct isis_lan_hello_hdr hello_hdr;
   struct isis_p2p_hello_hdr p2p_hello_hdr;
   unsigned char hmac_md5_hash[ISIS_AUTH_MD5_SIZE];
-  unsigned long len_pointer, length, auth_tlv_offset = 0;
+  size_t len_pointer, length, auth_tlv_offset = 0;
   u_int32_t interval;
   int retval;
 
@@ -2469,7 +2386,7 @@
       hmac_md5 (STREAM_DATA (circuit->snd_stream),
                 stream_get_endp (circuit->snd_stream),
                 (unsigned char *) &circuit->passwd.passwd, circuit->passwd.len,
-                (caddr_t) &hmac_md5_hash);
+                (unsigned char *) &hmac_md5_hash);
       /* Copy the hash into the stream */
       memcpy (STREAM_DATA (circuit->snd_stream) + auth_tlv_offset + 3,
               hmac_md5_hash, ISIS_AUTH_MD5_SIZE);
@@ -2479,16 +2396,14 @@
     {
       if (circuit->circ_type == CIRCUIT_T_BROADCAST)
 	{
-	  zlog_debug ("ISIS-Adj (%s): Sent L%d LAN IIH on %s, length %ld",
+	  zlog_debug ("ISIS-Adj (%s): Sent L%d LAN IIH on %s, length %zd",
 		      circuit->area->area_tag, level, circuit->interface->name,
-		      /* FIXME: use %z when we stop supporting old compilers. */
 		      length);
 	}
       else
 	{
-	  zlog_debug ("ISIS-Adj (%s): Sent P2P IIH on %s, length %ld",
+	  zlog_debug ("ISIS-Adj (%s): Sent P2P IIH on %s, length %zd",
 		      circuit->area->area_tag, circuit->interface->name,
-		      /* FIXME: use %z when we stop supporting old compilers. */
 		      length);
 	}
       if (isis->debugs & DEBUG_PACKET_DUMP)
@@ -2656,7 +2571,7 @@
       hmac_md5 (STREAM_DATA (circuit->snd_stream),
                 stream_get_endp(circuit->snd_stream),
                 (unsigned char *) &passwd->passwd, passwd->len,
-                (caddr_t) &hmac_md5_hash);
+                (unsigned char *) &hmac_md5_hash);
       /* Copy the hash into the stream */
       memcpy (STREAM_DATA (circuit->snd_stream) + auth_tlv_offset + 3,
               hmac_md5_hash, ISIS_AUTH_MD5_SIZE);
@@ -2801,7 +2716,7 @@
 
       if (isis->debugs & DEBUG_SNP_PACKETS)
         {
-          zlog_debug ("ISIS-Snp (%s): Sent L%d CSNP on %s, length %ld",
+          zlog_debug ("ISIS-Snp (%s): Sent L%d CSNP on %s, length %zd",
                       circuit->area->area_tag, level, circuit->interface->name,
                       stream_get_endp (circuit->snd_stream));
           for (ALL_LIST_ELEMENTS_RO (list, node, lsp))
@@ -2992,7 +2907,7 @@
       hmac_md5 (STREAM_DATA (circuit->snd_stream),
                 stream_get_endp(circuit->snd_stream),
                 (unsigned char *) &passwd->passwd, passwd->len,
-                (caddr_t) &hmac_md5_hash);
+                (unsigned char *) &hmac_md5_hash);
       /* Copy the hash into the stream */
       memcpy (STREAM_DATA (circuit->snd_stream) + auth_tlv_offset + 3,
               hmac_md5_hash, ISIS_AUTH_MD5_SIZE);
@@ -3050,7 +2965,7 @@
 
       if (isis->debugs & DEBUG_SNP_PACKETS)
         {
-          zlog_debug ("ISIS-Snp (%s): Sent L%d PSNP on %s, length %ld",
+          zlog_debug ("ISIS-Snp (%s): Sent L%d PSNP on %s, length %zd",
                       circuit->area->area_tag, level,
                       circuit->interface->name,
                       stream_get_endp (circuit->snd_stream));
diff --git a/isisd/isis_pfpacket.c b/isisd/isis_pfpacket.c
index 4bc8717..d202264 100644
--- a/isisd/isis_pfpacket.c
+++ b/isisd/isis_pfpacket.c
@@ -54,8 +54,8 @@
 u_char ALL_ISS[6] = { 0x09, 0x00, 0x2B, 0x00, 0x00, 0x05 };
 u_char ALL_ESS[6] = { 0x09, 0x00, 0x2B, 0x00, 0x00, 0x04 };
 
-static char discard_buff[8192];
-static char sock_buff[8192];
+static uint8_t discard_buff[8192];
+static uint8_t sock_buff[8192];
 
 /*
  * if level is 0 we are joining p2p multicast
@@ -323,7 +323,6 @@
   /* we need to do the LLC in here because of P2P circuits, which will
    * not need it
    */
-  int written = 1;
   struct sockaddr_ll sa;
 
   stream_set_getp (circuit->snd_stream, 0);
@@ -356,7 +355,7 @@
   iov[1].iov_base = circuit->snd_stream->data;
   iov[1].iov_len = stream_get_endp (circuit->snd_stream);
 
-  written = sendmsg (circuit->fd, &msg, 0);
+  sendmsg (circuit->fd, &msg, 0);
 
   return ISIS_OK;
 }
@@ -364,7 +363,6 @@
 int
 isis_send_pdu_p2p (struct isis_circuit *circuit, int level)
 {
-  int written = 1;
   struct sockaddr_ll sa;
 
   stream_set_getp (circuit->snd_stream, 0);
@@ -381,7 +379,7 @@
 
   /* lets try correcting the protocol */
   sa.sll_protocol = htons (0x00FE);
-  written = sendto (circuit->fd, circuit->snd_stream->data,
+  sendto (circuit->fd, circuit->snd_stream->data,
 		    stream_get_endp (circuit->snd_stream), 0, 
 		    (struct sockaddr *) &sa,
 		    sizeof (struct sockaddr_ll));
diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c
index fd93efa..28525ce 100644
--- a/isisd/isis_spf.c
+++ b/isisd/isis_spf.c
@@ -1072,8 +1072,8 @@
 	    {
 	      zlog_warn ("ISIS-Spf: No lsp (%p) found from root "
                   "to L%d DR %s on %s (ID %d)",
-		  lsp, level, rawlspid_print (lsp_id), 
-		  circuit->interface->name, circuit->circuit_id);
+                  (void *)lsp, level, rawlspid_print (lsp_id),
+                  circuit->interface->name, circuit->circuit_id);
               continue;
 	    }
 	  isis_spf_process_pseudo_lsp (spftree, lsp,
@@ -1456,8 +1456,8 @@
   assert (area->is_type & level);
 
   if (isis->debugs & DEBUG_SPF_EVENTS)
-    zlog_debug ("ISIS-Spf (%s) L%d SPF schedule called, lastrun %d sec ago",
-                area->area_tag, level, diff);
+    zlog_debug ("ISIS-Spf (%s) L%d SPF schedule called, lastrun %lld sec ago",
+                area->area_tag, level, (long long)diff);
 
   if (spftree->pending)
     return ISIS_OK;
@@ -1476,8 +1476,9 @@
                      area->min_spf_interval[1] - diff);
 
   if (isis->debugs & DEBUG_SPF_EVENTS)
-    zlog_debug ("ISIS-Spf (%s) L%d SPF scheduled %d sec from now",
-                area->area_tag, level, area->min_spf_interval[level-1] - diff);
+    zlog_debug ("ISIS-Spf (%s) L%d SPF scheduled %lld sec from now",
+                area->area_tag, level,
+                (long long)(area->min_spf_interval[level-1] - diff));
 
   spftree->pending = 1;
 
diff --git a/isisd/isis_tlv.c b/isisd/isis_tlv.c
index bbfa5d8..4fca072 100644
--- a/isisd/isis_tlv.c
+++ b/isisd/isis_tlv.c
@@ -115,7 +115,6 @@
   struct ipv6_reachability *ipv6_reach;
   int prefix_octets;
 #endif /* HAVE_IPV6 */
-  u_char virtual;
   int value_len, retval = ISIS_OK;
   u_char *start = stream, *pnt = stream, *endpnt;
 
@@ -179,7 +178,7 @@
 	       * |                        Virtual Flag                           | 
 	       * +-------+-------+-------+-------+-------+-------+-------+-------+
 	       */
-	      virtual = *pnt;	/* FIXME: what is the use for this? */
+	      /* virtual = *pnt; FIXME: what is the use for this? */
 	      pnt++;
 	      value_len++;
 	      /* +-------+-------+-------+-------+-------+-------+-------+-------+
@@ -926,7 +925,6 @@
   struct prefix_ipv4 *ipv4;
   u_char value[255];
   u_char *pos = value;
-  int retval;
 
   for (ALL_LIST_ELEMENTS_RO (ip_addrs, node, ipv4))
     {
diff --git a/isisd/isis_zebra.c b/isisd/isis_zebra.c
index 2df7462..1ba0100 100644
--- a/isisd/isis_zebra.c
+++ b/isisd/isis_zebra.c
@@ -318,7 +318,7 @@
 }
 
 #ifdef HAVE_IPV6
-void
+static void
 isis_zebra_route_add_ipv6 (struct prefix *prefix,
 			   struct isis_route_info *route_info)
 {
@@ -519,8 +519,8 @@
   struct stream *stream;
   struct zapi_ipv4 api;
   struct prefix_ipv4 p;
-  unsigned long ifindex;
-  struct in_addr nexthop;
+  unsigned long ifindex __attribute__ ((unused));
+  struct in_addr nexthop __attribute__ ((unused));
 
   stream = zclient->ibuf;
   memset (&p, 0, sizeof (struct prefix_ipv4));
diff --git a/isisd/isisd.c b/isisd/isisd.c
index ce6a262..898dfd2 100644
--- a/isisd/isisd.c
+++ b/isisd/isisd.c
@@ -1297,8 +1297,8 @@
       vty_out_timestr(vty, spftree->last_run_timestamp);
       vty_out (vty, "%s", VTY_NEWLINE);
 
-      vty_out (vty, "      last run duration : %u msec%s",
-               spftree->last_run_duration, VTY_NEWLINE);
+      vty_out (vty, "      last run duration : %llu msec%s",
+               (unsigned long long)spftree->last_run_duration, VTY_NEWLINE);
 
       vty_out (vty, "      run count         : %d%s",
           spftree->runcount, VTY_NEWLINE);
@@ -1601,7 +1601,7 @@
        "Authentication\n"
        "SNP PDUs\n"
        "Send but do not check PDUs on receiving\n"
-       "Send and check PDUs on receiving\n");
+       "Send and check PDUs on receiving\n")
 
 DEFUN (area_passwd_clear,
        area_passwd_clear_cmd,
@@ -1659,7 +1659,7 @@
        "Authentication\n"
        "SNP PDUs\n"
        "Send but do not check PDUs on receiving\n"
-       "Send and check PDUs on receiving\n");
+       "Send and check PDUs on receiving\n")
 
 DEFUN (no_area_passwd,
        no_area_passwd_cmd,
@@ -1739,7 +1739,7 @@
        "Authentication\n"
        "SNP PDUs\n"
        "Send but do not check PDUs on receiving\n"
-       "Send and check PDUs on receiving\n");
+       "Send and check PDUs on receiving\n")
 
 DEFUN (domain_passwd_clear,
        domain_passwd_clear_cmd,
@@ -1797,7 +1797,7 @@
        "Authentication\n"
        "SNP PDUs\n"
        "Send but do not check PDUs on receiving\n"
-       "Send and check PDUs on receiving\n");
+       "Send and check PDUs on receiving\n")
 
 DEFUN (no_domain_passwd,
        no_domain_passwd_cmd,
diff --git a/isisd/topology/spgrid.c b/isisd/topology/spgrid.c
index 611b672..40147fb 100644
--- a/isisd/topology/spgrid.c
+++ b/isisd/topology/spgrid.c
@@ -50,8 +50,8 @@
 
 long   x,
        y,
-       y1, y2, yp,
-       dl, dx, xn, yn, count,
+       yy1, yy2, yyp,
+       dl, dx, xn, yyn, count,
        *mess;
 
 double n;
@@ -670,12 +670,12 @@
 
     for ( k = ax; k > 0; k -- )
        {
-         y1 = nrand ( Y );
+         yy1 = nrand ( Y );
          do
-            y2 = nrand ( Y );
-         while ( y2 == y1 );
-         i  = NODE ( x, y1 );
-         j  = NODE ( x, y2 );
+            yy2 = nrand ( Y );
+         while ( yy2 == yy1 );
+         i  = NODE ( x, yy1 );
+         j  = NODE ( x, yy2 );
          l = am + nrand ( al );
          print_arc (vty, topology,  i, j, l );
        }
@@ -711,13 +711,13 @@
   	  dx = xn - x;
   	  if ( ip_f )
   	    {
-  	      yp = nrand(Y-y);
-  	      yn = mess[ yp ];
-                mess[ yp ] = mess[ Y - y - 1 ];
+  	      yyp = nrand(Y-y);
+  	      yyn = mess[ yyp ];
+                mess[ yyp ] = mess[ Y - y - 1 ];
   	    }
   	  else
-               yn =  y;
-  	  j = NODE ( xn, yn );
+               yyn =  y;
+  	  j = NODE ( xn, yyn );
   	  l = im + nrand ( il );
   	  if ( in != 0 )
               l *= (long) ( in * dx );
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 5a80618..56837d8 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -1,6 +1,7 @@
 ## Process this file with automake to produce Makefile.in.
 
 AM_CPPFLAGS = -I.. -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_builddir)/lib
+AM_CFLAGS = $(WERROR)
 DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\"
 
 lib_LTLIBRARIES = libzebra.la
diff --git a/lib/buffer.c b/lib/buffer.c
index 45e2e1c..ee93101 100644
--- a/lib/buffer.c
+++ b/lib/buffer.c
@@ -148,7 +148,7 @@
 {
   struct buffer_data *d;
 
-  d = XMALLOC(MTYPE_BUFFER_DATA, offsetof(struct buffer_data, data[b->size]));
+  d = XMALLOC(MTYPE_BUFFER_DATA, offsetof(struct buffer_data, data) + b->size);
   d->cp = d->sp = 0;
   d->next = NULL;
 
@@ -322,7 +322,8 @@
 	      /* This should absolutely never occur. */
 	      zlog_err("%s: corruption detected: iov_small overflowed; "
 		       "head %p, tail %p, head->next %p",
-		       __func__, b->head, b->tail, b->head->next);
+		       __func__, (void *)b->head, (void *)b->tail,
+		       (void *)b->head->next);
 	      iov = XMALLOC(MTYPE_TMP, iov_alloc*sizeof(*iov));
 	      memcpy(iov, small_iov, sizeof(small_iov));
 	    }
diff --git a/lib/command.c b/lib/command.c
index 8317789..f20065f 100644
--- a/lib/command.c
+++ b/lib/command.c
@@ -1353,7 +1353,7 @@
   enum match_type multiple_match;
   unsigned int multiple_index;
   const char *word;
-  const char *arg;
+  const char *arg = NULL;
   struct cmd_token *word_token;
   enum match_type word_match;
 
diff --git a/lib/distribute.h b/lib/distribute.h
index 5072016..a2ffffd 100644
--- a/lib/distribute.h
+++ b/lib/distribute.h
@@ -24,6 +24,7 @@
 
 #include <zebra.h>
 #include "if.h"
+#include "filter.h"
 
 /* Disctirubte list types. */
 enum distribute_type
diff --git a/lib/keychain.c b/lib/keychain.c
index 762c462..8a2fdd2 100644
--- a/lib/keychain.c
+++ b/lib/keychain.c
@@ -381,18 +381,22 @@
     NULL
   };
 
-#define GET_LONG_RANGE(V,STR,MIN,MAX) \
+#define _GET_LONG_RANGE(V,STR,MMCOND) \
 { \
   unsigned long tmpl; \
   char *endptr = NULL; \
   tmpl = strtoul ((STR), &endptr, 10); \
   if (*endptr != '\0' || tmpl == ULONG_MAX) \
     return -1; \
-  if ( tmpl < (MIN) || tmpl > (MAX)) \
+  if (MMCOND) \
     return -1; \
   (V) = tmpl; \
 }
-      
+#define GET_LONG_RANGE(V,STR,MIN,MAX) \
+        _GET_LONG_RANGE(V,STR,tmpl < (MIN) || tmpl > (MAX))
+#define GET_LONG_RANGE0(V,STR,MAX) \
+        _GET_LONG_RANGE(V,STR,tmpl > (MAX))
+
   /* Check hour field of time_str. */
   colon = strchr (time_str, ':');
   if (colon == NULL)
@@ -400,7 +404,7 @@
   *colon = '\0';
 
   /* Hour must be between 0 and 23. */
-  GET_LONG_RANGE (hour, time_str, 0, 23);
+  GET_LONG_RANGE0 (hour, time_str, 23);
 
   /* Check min field of time_str. */
   time_str = colon + 1;
@@ -410,7 +414,7 @@
   *colon = '\0';
 
   /* Min must be between 0 and 59. */
-  GET_LONG_RANGE (min, time_str, 0, 59);
+  GET_LONG_RANGE0 (min, time_str, 59);
 
   /* Check sec field of time_str. */
   time_str = colon + 1;
@@ -418,7 +422,7 @@
     return -1;
   
   /* Sec must be between 0 and 59. */
-  GET_LONG_RANGE (sec, time_str, 0, 59);
+  GET_LONG_RANGE0 (sec, time_str, 59);
   
   /* Check day_str.  Day must be <1-31>. */
   GET_LONG_RANGE (day, day_str, 1, 31);
diff --git a/lib/smux.h b/lib/smux.h
index 72b4eaf..dc91cac 100644
--- a/lib/smux.h
+++ b/lib/smux.h
@@ -25,6 +25,8 @@
 #include <net-snmp/agent/net-snmp-agent-includes.h>
 #include <net-snmp/agent/snmp_vars.h>
 
+#include "thread.h"
+
 /* Structures here are mostly compatible with UCD SNMP 4.1.1 */
 #define MATCH_FAILED     (-1)
 #define MATCH_SUCCEEDED  0
@@ -53,8 +55,8 @@
 
 /* Declare SMUX return value. */
 #define SNMP_LOCAL_VARIABLES \
-  static long snmp_int_val; \
-  static struct in_addr snmp_in_addr_val;
+  static long snmp_int_val __attribute__ ((unused)); \
+  static struct in_addr snmp_in_addr_val __attribute__ ((unused));
 
 #define SNMP_INTEGER(V) \
   ( \
@@ -106,7 +108,7 @@
 		      const struct trap_object *, size_t,
 		      u_char);
 
-extern int oid_compare (oid *, int, oid *, int);
+extern int oid_compare (const oid *, int, const oid *, int);
 extern void oid2in_addr (oid [], int, struct in_addr *);
 extern void *oid_copy (void *, const void *, size_t);
 extern void oid_copy_addr (oid [], struct in_addr *, int);
diff --git a/lib/snmp.c b/lib/snmp.c
index 79595a1..f6f9845 100644
--- a/lib/snmp.c
+++ b/lib/snmp.c
@@ -30,7 +30,7 @@
 #define min(A,B) ((A) < (B) ? (A) : (B))
 
 int
-oid_compare (oid *o1, int o1_len, oid *o2, int o2_len)
+oid_compare (const oid *o1, int o1_len, const oid *o2, int o2_len)
 {
   int i;
 
diff --git a/lib/stream.c b/lib/stream.c
index c6f20c8..e13da08 100644
--- a/lib/stream.c
+++ b/lib/stream.c
@@ -53,7 +53,7 @@
  */
 #define STREAM_WARN_OFFSETS(S) \
   zlog_warn ("&(struct stream): %p, size: %lu, getp: %lu, endp: %lu\n", \
-             (S), \
+             (void *)(S), \
              (unsigned long) (S)->size, \
              (unsigned long) (S)->getp, \
              (unsigned long) (S)->endp)\
diff --git a/lib/table.h b/lib/table.h
index ab357a0..ab7eb68 100644
--- a/lib/table.h
+++ b/lib/table.h
@@ -92,7 +92,7 @@
 /* Each routing entry. */
 struct route_node
 {
-  ROUTE_NODE_FIELDS;
+  ROUTE_NODE_FIELDS
 
 #define l_left   link[0]
 #define l_right  link[1]
diff --git a/lib/vty.c b/lib/vty.c
index 750f885..d623b85 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -870,7 +870,7 @@
 
   /* In case of 'help \t'. */
   if (isspace ((int) vty->buf[vty->length - 1]))
-    vector_set (vline, '\0');
+    vector_set (vline, NULL);
 
   matched = cmd_complete_command (vline, vty, &ret);
   
@@ -985,11 +985,11 @@
   if (vline == NULL)
     {
       vline = vector_init (1);
-      vector_set (vline, '\0');
+      vector_set (vline, NULL);
     }
   else 
     if (isspace ((int) vty->buf[vty->length - 1]))
-      vector_set (vline, '\0');
+      vector_set (vline, NULL);
 
   describe = cmd_describe_command (vline, vty, &ret);
 
diff --git a/lib/zclient.c b/lib/zclient.c
index 41ecbb6..1e05d6d 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -41,7 +41,7 @@
 
 extern struct thread_master *master;
 
-char *zclient_serv_path = NULL;
+const char *zclient_serv_path = NULL;
 
 /* This file local debug flag. */
 int zclient_debug = 0;
@@ -919,7 +919,7 @@
   length -= ZEBRA_HEADER_SIZE;
 
   if (zclient_debug)
-    zlog_debug("zclient 0x%p command 0x%x \n", zclient, command);
+    zlog_debug("zclient 0x%p command 0x%x \n", (void *)zclient, command);
 
   switch (command)
     {
@@ -1053,7 +1053,7 @@
     }
 }
 
-const char *const zclient_serv_path_get()
+const char *zclient_serv_path_get()
 {
   return zclient_serv_path ? zclient_serv_path : ZEBRA_SERV_PATH;
 }
diff --git a/lib/zclient.h b/lib/zclient.h
index d0c5450..a51b3de 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -134,7 +134,7 @@
 
 extern int  zclient_socket_connect (struct zclient *);
 extern void zclient_serv_path_set  (char *path);
-extern const char *const zclient_serv_path_get (void);
+extern const char *zclient_serv_path_get (void);
 
 /* Send redistribute command to zebra daemon. Do not update zclient state. */
 extern int zebra_redistribute_send (int command, struct zclient *, int type);
diff --git a/ospf6d/Makefile.am b/ospf6d/Makefile.am
index d30ce58..cbd850f 100644
--- a/ospf6d/Makefile.am
+++ b/ospf6d/Makefile.am
@@ -4,7 +4,7 @@
 DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\"
 INSTALL_SDATA=@INSTALL@ -m 600
 
-AM_CFLAGS = $(PICFLAGS)
+AM_CFLAGS = $(PICFLAGS) $(WERROR)
 AM_LDFLAGS = $(PILDFLAGS)
 
 noinst_LIBRARIES = libospf6.a
diff --git a/ospf6d/ospf6_interface.c b/ospf6d/ospf6_interface.c
index 772caff..c9c9011 100644
--- a/ospf6d/ospf6_interface.c
+++ b/ospf6d/ospf6_interface.c
@@ -40,6 +40,7 @@
 #include "ospf6_neighbor.h"
 #include "ospf6_intra.h"
 #include "ospf6_spf.h"
+#include "ospf6_snmp.h"
 #include "ospf6d.h"
 
 unsigned char conf_debug_ospf6_interface = 0;
@@ -913,7 +914,7 @@
 	       "disabled" : "enabled", VNL);
       inet_ntop (AF_INET, &oi->area->area_id,
                  strbuf, sizeof (strbuf));
-      vty_out (vty, "  Area ID %s, Cost %hu%s", strbuf, oi->cost,
+      vty_out (vty, "  Area ID %s, Cost %u%s", strbuf, oi->cost,
 	       VNL);
     }
   else
diff --git a/ospf6d/ospf6_intra.c b/ospf6d/ospf6_intra.c
index 4ad7521..6606c96 100644
--- a/ospf6d/ospf6_intra.c
+++ b/ospf6d/ospf6_intra.c
@@ -234,9 +234,9 @@
 
       /* Multiple Router-LSA instance according to size limit setting */
       if ( (oa->router_lsa_size_limit != 0)
-          && ((caddr_t) lsdesc + sizeof (struct ospf6_router_lsdesc) -
-	      /* XXX warning: comparison between signed and unsigned */
-              (caddr_t) buffer > oa->router_lsa_size_limit))
+          && ((size_t)((char *)lsdesc - buffer)
+                 + sizeof (struct ospf6_router_lsdesc)
+               > oa->router_lsa_size_limit))
         {
           if ((caddr_t) lsdesc == (caddr_t) router_lsa +
                                   sizeof (struct ospf6_router_lsa))
@@ -1495,7 +1495,8 @@
 
   zlog_info ("Brouter: %s via area %s", brouter_name, area_name);
   zlog_info ("  memory: prev: %p this: %p next: %p parent rnode: %p",
-             brouter->prev, brouter, brouter->next, brouter->rnode);
+             (void *)brouter->prev, (void *)brouter, (void *)brouter->next,
+             (void *)brouter->rnode);
   zlog_info ("  type: %d prefix: %s installed: %s changed: %s",
              brouter->type, destination, installed, changed);
   zlog_info ("  lock: %d flags: %s%s%s%s", brouter->lock,
@@ -1543,7 +1544,7 @@
           IS_OSPF6_DEBUG_ROUTE (MEMORY))
         {
           zlog_info ("%p: mark as removing: area %s brouter %s",
-                     brouter, oa->name, brouter_name);
+                     (void *)brouter, oa->name, brouter_name);
           ospf6_brouter_debug_print (brouter);
         }
     }
@@ -1575,7 +1576,7 @@
           IS_OSPF6_DEBUG_ROUTE (MEMORY))
         {
           zlog_info ("%p: transfer: area %s brouter %s",
-                     brouter, oa->name, brouter_name);
+                     (void *)brouter, oa->name, brouter_name);
           ospf6_brouter_debug_print (brouter);
         }
     }
diff --git a/ospf6d/ospf6_lsa.c b/ospf6d/ospf6_lsa.c
index 8eeb995..3f008d3 100644
--- a/ospf6d/ospf6_lsa.c
+++ b/ospf6d/ospf6_lsa.c
@@ -494,7 +494,7 @@
   vty_out (vty, "Lock: %d %s", lsa->lock, VNL);
   vty_out (vty, "ReTx Count: %d%s", lsa->retrans_count, VNL);
   vty_out (vty, "Threads: Expire: 0x%p, Refresh: 0x%p %s",
-	   lsa->expire, lsa->refresh, VNL);
+           (void *)lsa->expire, (void *)lsa->refresh, VNL);
   vty_out (vty, "%s", VNL);
   return;
 }
@@ -807,8 +807,8 @@
 
   for (i = 0; i < MIN (size, sizeof (buf)); i++)
     {
-      if (! islower (h->name[i]))
-        buf[i] = tolower (h->name[i]);
+      if (! islower ((unsigned char)h->name[i]))
+        buf[i] = tolower ((unsigned char)h->name[i]);
       else
         buf[i] = h->name[i];
     }
diff --git a/ospf6d/ospf6_neighbor.c b/ospf6d/ospf6_neighbor.c
index f20c83b..4e63797 100644
--- a/ospf6d/ospf6_neighbor.c
+++ b/ospf6d/ospf6_neighbor.c
@@ -38,6 +38,7 @@
 #include "ospf6_neighbor.h"
 #include "ospf6_intra.h"
 #include "ospf6_flood.h"
+#include "ospf6_snmp.h"
 #include "ospf6d.h"
 
 unsigned char conf_debug_ospf6_neighbor = 0;
diff --git a/ospf6d/ospf6_route.c b/ospf6d/ospf6_route.c
index 9e6b33e..3092773 100644
--- a/ospf6d/ospf6_route.c
+++ b/ospf6d/ospf6_route.c
@@ -374,7 +374,7 @@
 
   if (IS_OSPF6_DEBUG_ROUTE (MEMORY))
     zlog_debug ("%s %p: route add %p: %s", ospf6_route_table_name (table),
-                table, route, buf);
+                (void *)table, (void *)route, buf);
   else if (IS_OSPF6_DEBUG_ROUTE (TABLE))
     zlog_debug ("%s: route add: %s", ospf6_route_table_name (table), buf);
 
@@ -408,7 +408,8 @@
         {
           if (IS_OSPF6_DEBUG_ROUTE (MEMORY))
             zlog_debug ("%s %p: route add %p: needless update of %p",
-                        ospf6_route_table_name (table), table, route, old);
+                        ospf6_route_table_name (table),
+                        (void *)table, (void *)route, (void *)old);
           else if (IS_OSPF6_DEBUG_ROUTE (TABLE))
             zlog_debug ("%s: route add: needless update",
                         ospf6_route_table_name (table));
@@ -422,7 +423,8 @@
 
       if (IS_OSPF6_DEBUG_ROUTE (MEMORY))
         zlog_debug ("%s %p: route add %p: update of %p",
-                    ospf6_route_table_name (table), table, route, old);
+                    ospf6_route_table_name (table),
+                    (void *)table, (void *)route, (void *)old);
       else if (IS_OSPF6_DEBUG_ROUTE (TABLE))
         zlog_debug ("%s: route add: update",
                     ospf6_route_table_name (table));
@@ -463,7 +465,8 @@
     {
       if (IS_OSPF6_DEBUG_ROUTE (MEMORY))
         zlog_debug ("%s %p: route add %p: another path: prev %p, next %p",
-                   ospf6_route_table_name (table), table, route, prev, next);
+                    ospf6_route_table_name (table),
+                    (void *)table, (void *)route, (void *)prev, (void *)next);
       else if (IS_OSPF6_DEBUG_ROUTE (TABLE))
         zlog_debug ("%s: route add: another path found",
                     ospf6_route_table_name (table));
@@ -488,7 +491,8 @@
           SET_FLAG (route->flag, OSPF6_ROUTE_BEST);
           if (IS_OSPF6_DEBUG_ROUTE (MEMORY))
             zlog_info ("%s %p: route add %p: replacing previous best: %p",
-                       ospf6_route_table_name (table), table, route, next);
+                       ospf6_route_table_name (table),
+                       (void *)table, (void *)route, (void *)next);
         }
 
       route->installed = now;
@@ -510,7 +514,7 @@
   /* Else, this is the brand new route regarding to the prefix */
   if (IS_OSPF6_DEBUG_ROUTE (MEMORY))
     zlog_debug ("%s %p: route add %p: brand new route",
-                ospf6_route_table_name (table), table, route);
+                ospf6_route_table_name (table), (void *)table, (void *)route);
   else if (IS_OSPF6_DEBUG_ROUTE (TABLE))
     zlog_debug ("%s: route add: brand new route",
                 ospf6_route_table_name (table));
@@ -589,7 +593,8 @@
 
   if (IS_OSPF6_DEBUG_ROUTE (MEMORY))
     zlog_debug ("%s %p: route remove %p: %s",
-                ospf6_route_table_name (table), table, route, buf);
+                ospf6_route_table_name (table),
+                (void *)table, (void *)route, buf);
   else if (IS_OSPF6_DEBUG_ROUTE (TABLE))
     zlog_debug ("%s: route remove: %s", ospf6_route_table_name (table), buf);
 
@@ -661,8 +666,8 @@
 
   if (IS_OSPF6_DEBUG_ROUTE (MEMORY))
     zlog_info ("%s %p: route head: %p<-[%p]->%p",
-               ospf6_route_table_name (table), table,
-               route->prev, route, route->next);
+               ospf6_route_table_name (table), (void *)table,
+               (void *)route->prev, (void *)route, (void *)route->next);
 
   return route;
 }
@@ -674,8 +679,8 @@
 
   if (IS_OSPF6_DEBUG_ROUTE (MEMORY))
     zlog_info ("%s %p: route next: %p<-[%p]->%p",
-               ospf6_route_table_name (route->table), route->table,
-               route->prev, route, route->next);
+               ospf6_route_table_name (route->table), (void *)route->table,
+               (void *)route->prev, (void *)route, (void *)route->next);
 
   ospf6_route_unlock (route);
   if (next)
@@ -874,7 +879,7 @@
            (CHECK_FLAG (route->flag, OSPF6_ROUTE_CHANGE) ? "C" : "-"),
            VNL);
   vty_out (vty, "Memory: prev: %p this: %p next: %p%s",
-           route->prev, route, route->next, VNL);
+           (void *)route->prev, (void *)route, (void *)route->next, VNL);
 
   /* Path section */
 
diff --git a/ospf6d/ospf6_route.h b/ospf6d/ospf6_route.h
index c0dcf9f..42eb69e 100644
--- a/ospf6d/ospf6_route.h
+++ b/ospf6d/ospf6_route.h
@@ -239,16 +239,15 @@
            sizeof (struct ospf6_nexthop) * OSPF6_MULTI_PATH_LIMIT) == 0)
 #define ospf6_route_is_best(r) (CHECK_FLAG ((r)->flag, OSPF6_ROUTE_BEST))
 
-/* XXX: This gives GCC heartburn aboutbreaking aliasing rules. */
 #define ospf6_linkstate_prefix_adv_router(x) \
-  (*(u_int32_t *)(&(x)->u.prefix6.s6_addr[0]))
+  ((x)->u.lp.id.s_addr)
 #define ospf6_linkstate_prefix_id(x) \
-  (*(u_int32_t *)(&(x)->u.prefix6.s6_addr[4]))
+  ((x)->u.lp.adv_router.s_addr)
 
 #define ADV_ROUTER_IN_PREFIX(x) \
-  (*(u_int32_t *)(&(x)->u.prefix6.s6_addr[0]))
+  ((x)->u.lp.id.s_addr)
 #define ID_IN_PREFIX(x) \
-  (*(u_int32_t *)(&(x)->u.prefix6.s6_addr[4]))
+  ((x)->u.lp.adv_router.s_addr)
 
 /* Function prototype */
 extern void ospf6_linkstate_prefix (u_int32_t adv_router, u_int32_t id,
diff --git a/ospf6d/ospf6_snmp.c b/ospf6d/ospf6_snmp.c
index 4be8be0..ef44e4c 100644
--- a/ospf6d/ospf6_snmp.c
+++ b/ospf6d/ospf6_snmp.c
@@ -40,6 +40,8 @@
 #include "ospf6_interface.h"
 #include "ospf6_message.h"
 #include "ospf6_neighbor.h"
+#include "ospf6_abr.h"
+#include "ospf6_asbr.h"
 #include "ospf6d.h"
 #include "ospf6_snmp.h"
 
@@ -626,7 +628,6 @@
   int len;
   oid *offset;
   int offsetlen;
-  char a[16], b[16], c[16];
   struct ospf6_area *oa;
   struct listnode *node;
   struct interface *iif;
diff --git a/ospf6d/ospf6_spf.c b/ospf6d/ospf6_spf.c
index d0e9101..88e1285 100644
--- a/ospf6d/ospf6_spf.c
+++ b/ospf6d/ospf6_spf.c
@@ -601,11 +601,12 @@
   ospf6_spf_reason_string(ospf6->spf_reason, rbuf, sizeof(rbuf));
 
   if (IS_OSPF6_DEBUG_SPF (PROCESS) || IS_OSPF6_DEBUG_SPF (TIME))
-    zlog_debug ("SPF runtime: %ld sec %ld usec",
-		runtime.tv_sec, runtime.tv_usec);
+    zlog_debug ("SPF runtime: %lld sec %lld usec",
+		(long long)runtime.tv_sec, (long long)runtime.tv_usec);
 
-  zlog_info("SPF processing: # Areas: %d, SPF runtime: %ld sec %ld usec, "
-	    "Reason: %s\n", areas_processed, runtime.tv_sec, runtime.tv_usec,
+  zlog_info("SPF processing: # Areas: %d, SPF runtime: %lld sec %lld usec, "
+	    "Reason: %s\n", areas_processed,
+	    (long long)runtime.tv_sec, (long long)runtime.tv_usec,
 	    rbuf);
   ospf6->last_spf_reason = ospf6->spf_reason;
   ospf6_reset_spf_reason(ospf6);
@@ -638,7 +639,7 @@
     {
       if (IS_OSPF6_DEBUG_SPF(PROCESS) || IS_OSPF6_DEBUG_SPF (TIME))
         zlog_debug ("SPF: calculation timer is already scheduled: %p",
-                   ospf6->t_spf_calc);
+                    (void *)ospf6->t_spf_calc);
       return;
     }
 
diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c
index e4e6f17..7fffba8 100644
--- a/ospf6d/ospf6_top.c
+++ b/ospf6d/ospf6_top.c
@@ -663,8 +663,9 @@
       timerstring(&result, buf, sizeof(buf));
       ospf6_spf_reason_string(o->last_spf_reason, rbuf, sizeof(rbuf));
       vty_out(vty, "last executed %s ago, reason %s%s", buf, rbuf, VNL);
-      vty_out (vty, " Last SPF duration %ld sec %ld usec%s",
-	       o->ts_spf_duration.tv_sec, o->ts_spf_duration.tv_usec, VNL);
+      vty_out (vty, " Last SPF duration %lld sec %lld usec%s",
+               (long long)o->ts_spf_duration.tv_sec,
+               (long long)o->ts_spf_duration.tv_usec, VNL);
     }
   else
     vty_out(vty, "has not been run$%s", VNL);
diff --git a/ospf6d/ospf6d.h b/ospf6d/ospf6d.h
index 4122b30..9e2efb4 100644
--- a/ospf6d/ospf6d.h
+++ b/ospf6d/ospf6d.h
@@ -71,19 +71,19 @@
       }                                               \
   } while (0)
 #endif /*timersub*/
-#define timerstring(tv, buf, size)                    \
-  do {                                                \
-    if ((tv)->tv_sec / 60 / 60 / 24)                  \
-      snprintf (buf, size, "%ldd%02ld:%02ld:%02ld",   \
-                (tv)->tv_sec / 60 / 60 / 24,          \
-                (tv)->tv_sec / 60 / 60 % 24,          \
-                (tv)->tv_sec / 60 % 60,               \
-                (tv)->tv_sec % 60);                   \
-    else                                              \
-      snprintf (buf, size, "%02ld:%02ld:%02ld",       \
-                (tv)->tv_sec / 60 / 60 % 24,          \
-                (tv)->tv_sec / 60 % 60,               \
-                (tv)->tv_sec % 60);                   \
+#define timerstring(tv, buf, size)                      \
+  do {                                                  \
+    if ((tv)->tv_sec / 60 / 60 / 24)                    \
+      snprintf (buf, size, "%lldd%02lld:%02lld:%02lld", \
+                (tv)->tv_sec / 60LL / 60 / 24,          \
+                (tv)->tv_sec / 60LL / 60 % 24,          \
+                (tv)->tv_sec / 60LL % 60,               \
+                (tv)->tv_sec % 60LL);                   \
+    else                                                \
+      snprintf (buf, size, "%02lld:%02lld:%02lld",      \
+                (tv)->tv_sec / 60LL / 60 % 24,          \
+                (tv)->tv_sec / 60LL % 60,               \
+                (tv)->tv_sec % 60LL);                   \
   } while (0)
 #define timerstring_local(tv, buf, size)                  \
   do {                                                    \
diff --git a/ospfclient/Makefile.am b/ospfclient/Makefile.am
index 09d2ba8..c4f0da8 100644
--- a/ospfclient/Makefile.am
+++ b/ospfclient/Makefile.am
@@ -1,6 +1,7 @@
 ## Automake.am for OSPF API client
 
 AM_CPPFLAGS = -I.. -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_builddir)/lib
+AM_CFLAGS = $(WERROR)
 
 lib_LTLIBRARIES = libospfapiclient.la
 libospfapiclient_la_LDFLAGS = -version-info 0:0:0
diff --git a/ospfd/Makefile.am b/ospfd/Makefile.am
index 4160bfc..40f2cfe 100644
--- a/ospfd/Makefile.am
+++ b/ospfd/Makefile.am
@@ -1,6 +1,7 @@
 ## Process this file with automake to produce Makefile.in.
 
 AM_CPPFLAGS = -I.. -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_builddir)/lib
+AM_CFLAGS = $(WERROR)
 DEFS = @DEFS@ $(LOCAL_OPTS) -DSYSCONFDIR=\"$(sysconfdir)/\"
 INSTALL_SDATA=@INSTALL@ -m 600
 
diff --git a/ospfd/ospf_apiserver.c b/ospfd/ospf_apiserver.c
index db1ccda..92f68f7 100644
--- a/ospfd/ospf_apiserver.c
+++ b/ospfd/ospf_apiserver.c
@@ -244,7 +244,8 @@
 ospf_apiserver_new_lsa_hook (struct ospf_lsa *lsa)
 {
   if (IS_DEBUG_OSPF_EVENT)
-    zlog_debug ("API: Put LSA(%p)[%s] into reserve, total=%ld", lsa, dump_lsa_key (lsa), lsa->lsdb->total);
+    zlog_debug ("API: Put LSA(%p)[%s] into reserve, total=%ld", (void *)lsa,
+                dump_lsa_key (lsa), lsa->lsdb->total);
   return 0;
 }
 
@@ -252,7 +253,8 @@
 ospf_apiserver_del_lsa_hook (struct ospf_lsa *lsa)
 {
   if (IS_DEBUG_OSPF_EVENT)
-    zlog_debug ("API: Get LSA(%p)[%s] from reserve, total=%ld", lsa, dump_lsa_key (lsa), lsa->lsdb->total);
+    zlog_debug ("API: Get LSA(%p)[%s] from reserve, total=%ld", (void *)lsa,
+                dump_lsa_key (lsa), lsa->lsdb->total);
   return 0;
 }
 
@@ -395,7 +397,8 @@
   listnode_delete (apiserver_list, apiserv);
 
   if (IS_DEBUG_OSPF_EVENT)
-    zlog_debug ("API: Delete apiserv(%p), total#(%d)", apiserv, apiserver_list->count);
+    zlog_debug ("API: Delete apiserv(%p), total#(%d)",
+                (void *)apiserv, apiserver_list->count);
 
   /* And free instance. */
   XFREE (MTYPE_OSPF_APISERVER, apiserv);
@@ -755,7 +758,8 @@
 #endif /* USE_ASYNC_READ */
 
   if (IS_DEBUG_OSPF_EVENT)
-    zlog_debug ("API: New apiserv(%p), total#(%d)", apiserv, apiserver_list->count);
+    zlog_debug ("API: New apiserv(%p), total#(%d)",
+                (void *)apiserv, apiserver_list->count);
 
   return 0;
 }
@@ -944,7 +948,7 @@
   if (IS_DEBUG_OSPF_EVENT)
     zlog_debug ("API: Add LSA-type(%d)/Opaque-type(%d) into"
                " apiserv(%p), total#(%d)", 
-               lsa_type, opaque_type, apiserv, 
+               lsa_type, opaque_type, (void *)apiserv, 
                listcount (apiserv->opaque_types));
 
   return 0;
@@ -976,7 +980,7 @@
           if (IS_DEBUG_OSPF_EVENT)
             zlog_debug ("API: Del LSA-type(%d)/Opaque-type(%d)"
                        " from apiserv(%p), total#(%d)", 
-                       lsa_type, opaque_type, apiserv, 
+                       lsa_type, opaque_type, (void *)apiserv,
                        listcount (apiserv->opaque_types));
 
 	  return 0;
diff --git a/ospfd/ospf_ase.c b/ospfd/ospf_ase.c
index 8aedc80..04240c1 100644
--- a/ospfd/ospf_ase.c
+++ b/ospfd/ospf_ase.c
@@ -679,8 +679,8 @@
 
       quagga_gettime(QUAGGA_CLK_MONOTONIC, &stop_time);
 
-      zlog_info ("SPF Processing Time(usecs): External Routes: %ld\n",
-		 (stop_time.tv_sec - start_time.tv_sec)*1000000L+
+      zlog_info ("SPF Processing Time(usecs): External Routes: %lld\n",
+		 (stop_time.tv_sec - start_time.tv_sec)*1000000LL+
 		 (stop_time.tv_usec - start_time.tv_usec));
     }
   return 0;
diff --git a/ospfd/ospf_dump.c b/ospfd/ospf_dump.c
index ebcc717..2e4e69d 100644
--- a/ospfd/ospf_dump.c
+++ b/ospfd/ospf_dump.c
@@ -299,13 +299,13 @@
   else if (d)
     snprintf (buf, size, "%1ldd%02ldh%02ldm", d, h, m);
   else if (h)
-    snprintf (buf, size, "%ldh%02ldm%02lds", h, m, t->tv_sec);
+    snprintf (buf, size, "%ldh%02ldm%02lds", h, m, (long)t->tv_sec);
   else if (m)
-    snprintf (buf, size, "%ldm%02lds", m, t->tv_sec);
+    snprintf (buf, size, "%ldm%02lds", m, (long)t->tv_sec);
   else if (ms)
-    snprintf (buf, size, "%ld.%03lds", t->tv_sec, ms);
+    snprintf (buf, size, "%ld.%03lds", (long)t->tv_sec, ms);
   else
-    snprintf (buf, size, "%ld usecs", t->tv_usec);
+    snprintf (buf, size, "%ld usecs", (long)t->tv_usec);
 
   return buf;
 }
diff --git a/ospfd/ospf_flood.c b/ospfd/ospf_flood.c
index d18314a..c0b3622 100644
--- a/ospfd/ospf_flood.c
+++ b/ospfd/ospf_flood.c
@@ -244,7 +244,7 @@
     zlog_debug ("LSA[Flooding]: start, NBR %s (%s), cur(%p), New-LSA[%s]",
                inet_ntoa (nbr->router_id),
                LOOKUP (ospf_nsm_state_msg, nbr->state),
-               current,
+               (void *)current,
                dump_lsa_key (new));
 
   lsa_ack_flag = 0;
@@ -584,7 +584,8 @@
            * for the link on which the LSA has received.
            */
           if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
-            zlog_debug ("Type-9 Opaque-LSA: lsa->oi(%p) != oi(%p)", lsa->oi, oi);
+            zlog_debug ("Type-9 Opaque-LSA: lsa->oi(%p) != oi(%p)",
+                        (void *)lsa->oi, (void *)oi);
           continue;
         }
 #endif /* HAVE_OPAQUE_LSA */
diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c
index 94c31c9..f032601 100644
--- a/ospfd/ospf_lsa.c
+++ b/ospfd/ospf_lsa.c
@@ -248,7 +248,7 @@
   new->refresh_list = -1;
 
   if (IS_DEBUG_OSPF (lsa, LSA))
-    zlog_debug ("LSA: duplicated %p (new: %p)", lsa, new);
+    zlog_debug ("LSA: duplicated %p (new: %p)", (void *)lsa, (void *)new);
 
   return new;
 }
@@ -260,7 +260,7 @@
   assert (lsa->lock == 0);
   
   if (IS_DEBUG_OSPF (lsa, LSA))
-    zlog_debug ("LSA: freed %p", lsa);
+    zlog_debug ("LSA: freed %p", (void *)lsa);
 
   /* Delete LSA data. */
   if (lsa->data != NULL)
@@ -336,7 +336,7 @@
 {
   if (IS_DEBUG_OSPF (lsa, LSA))
     zlog_debug ("LSA[Type%d:%s]: data freed %p",
-	       lsah->type, inet_ntoa (lsah->id), lsah);
+	       lsah->type, inet_ntoa (lsah->id), (void *)lsah);
 
   XFREE (MTYPE_OSPF_LSA_DATA, lsah);
 }
@@ -888,7 +888,7 @@
   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
     {
       zlog_debug ("LSA[Type%d:%s]: Originate router-LSA %p",
-		 new->data->type, inet_ntoa (new->data->id), new);
+		 new->data->type, inet_ntoa (new->data->id), (void *)new);
       ospf_lsa_header_dump (new->data);
     }
 
@@ -1123,7 +1123,7 @@
   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
     {
       zlog_debug ("LSA[Type%d:%s]: Originate network-LSA %p",
-		 new->data->type, inet_ntoa (new->data->id), new);
+		 new->data->type, inet_ntoa (new->data->id), (void *)new);
       ospf_lsa_header_dump (new->data);
     }
 
@@ -1300,7 +1300,7 @@
   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
     {
       zlog_debug ("LSA[Type%d:%s]: Originate summary-LSA %p",
-		 new->data->type, inet_ntoa (new->data->id), new);
+		 new->data->type, inet_ntoa (new->data->id), (void *)new);
       ospf_lsa_header_dump (new->data);
     }
 
@@ -1443,7 +1443,7 @@
   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
     {
       zlog_debug ("LSA[Type%d:%s]: Originate summary-ASBR-LSA %p",
-		 new->data->type, inet_ntoa (new->data->id), new);
+		 new->data->type, inet_ntoa (new->data->id), (void *)new);
       ospf_lsa_header_dump (new->data);
     }
 
@@ -2075,7 +2075,7 @@
   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
     {
       zlog_debug ("LSA[Type%d:%s]: Originate AS-external-LSA %p",
-		 new->data->type, inet_ntoa (new->data->id), new);
+		 new->data->type, inet_ntoa (new->data->id), (void *)new);
       ospf_lsa_header_dump (new->data);
     }
 
@@ -2260,7 +2260,8 @@
       if (lsa)
 	{
 	  if (IS_DEBUG_OSPF_EVENT)
-	    zlog_debug ("LSA[Type5:0.0.0.0]: Refresh AS-external-LSA %p", lsa);
+	    zlog_debug ("LSA[Type5:0.0.0.0]: Refresh AS-external-LSA %p",
+		       (void *)lsa);
 	  ospf_external_lsa_refresh (ospf, lsa, ei, LSA_REFRESH_FORCE);
 	}
       else
@@ -2687,7 +2688,7 @@
             {
       	      zlog_debug ("ospf_lsa_install() Premature Aging "
 		         "lsa 0x%p, seqnum 0x%x",
-		         lsa, ntohl(lsa->data->ls_seqnum));
+		         (void *)lsa, ntohl(lsa->data->ls_seqnum));
       	      ospf_lsa_header_dump (lsa->data);
             }
         }
@@ -2790,9 +2791,9 @@
     {
       if (IS_DEBUG_OSPF (lsa, LSA_INSTALL))
         zlog_debug ("LSA[Type%d:%s]: Install LSA 0x%p, MaxAge",
-                   new->data->type, 
-                   inet_ntoa (new->data->id), 
-                   lsa);
+                   new->data->type,
+                   inet_ntoa (new->data->id),
+                   (void *)lsa);
       ospf_lsa_maxage (ospf, lsa);
     }
 
@@ -2879,7 +2880,7 @@
 	if (CHECK_FLAG (lsa->flags, OSPF_LSA_PREMATURE_AGE))
           {
             if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
-              zlog_debug ("originating new lsa for lsa 0x%p\n", lsa);
+              zlog_debug ("originating new lsa for lsa 0x%p\n", (void *)lsa);
             ospf_lsa_refresh (ospf, lsa);
           }
 
@@ -2946,7 +2947,7 @@
     {
       if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
 	zlog_debug ("LSA[Type%d:%s]: %p already exists on MaxAge LSA list",
-		   lsa->data->type, inet_ntoa (lsa->data->id), lsa);
+		   lsa->data->type, inet_ntoa (lsa->data->id), (void *)lsa);
       return;
     }
 
@@ -2961,7 +2962,8 @@
 	{
 	  if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
 	    zlog_debug ("LSA[%s]: found LSA (%p) in table for LSA %p %d",
-			dump_lsa_key (lsa), rn->info, lsa, lsa_prefix.prefixlen);
+			dump_lsa_key (lsa), rn->info, (void *)lsa,
+			lsa_prefix.prefixlen);
 	  route_unlock_node (rn);
 	}
       else
@@ -3691,7 +3693,7 @@
       if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
         zlog_debug ("LSA[Refresh:%s]: ospf_refresher_register_lsa(): "
                    "setting refresh_list on lsa %p (slod %d)", 
-                   inet_ntoa (lsa->data->id), lsa, index);
+                   inet_ntoa (lsa->data->id), (void *)lsa, index);
     }
 }
 
@@ -3762,9 +3764,9 @@
 	    {
 	      if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
 		zlog_debug ("LSA[Refresh:%s]: ospf_lsa_refresh_walker(): "
-		           "refresh lsa %p (slot %d)", 
-		           inet_ntoa (lsa->data->id), lsa, i);
-	      
+		           "refresh lsa %p (slot %d)",
+		           inet_ntoa (lsa->data->id), (void *)lsa, i);
+
 	      assert (lsa->lock > 0);
 	      list_delete_node (refresh_list, node);
 	      lsa->refresh_list = -1;
diff --git a/ospfd/ospf_lsdb.c b/ospfd/ospf_lsdb.c
index f7cf60f..b92e749 100644
--- a/ospfd/ospf_lsdb.c
+++ b/ospfd/ospf_lsdb.c
@@ -158,7 +158,7 @@
       if (lsa)
         zlog_warn ("LSA[Type%d:%s]: LSA %p, lsa->lsdb %p",
                    lsa->data->type, inet_ntoa (lsa->data->id),
-                   lsa, lsa->lsdb);
+                   (void *)lsa, (void *)lsa->lsdb);
       return;
     }
   
diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c
index 98b1af3..b97e3a7 100644
--- a/ospfd/ospf_packet.c
+++ b/ospfd/ospf_packet.c
@@ -1681,7 +1681,7 @@
 
       if (IS_DEBUG_OSPF_EVENT)
 	zlog_debug("LSA[Type%d:%s]: %p new LSA created with Link State Update",
-		  lsa->data->type, inet_ntoa (lsa->data->id), lsa);
+		  lsa->data->type, inet_ntoa (lsa->data->id), (void *)lsa);
       listnode_add (lsas, lsa);
     }
 
@@ -1762,7 +1762,8 @@
 
 #define DISCARD_LSA(L,N) {\
         if (IS_DEBUG_OSPF_EVENT) \
-          zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point %d: lsa %p Type-%d", N, lsa, (int) lsa->data->type); \
+          zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point %d: lsa %p" \
+                      " Type-%d", N, (void *)lsa, (int) lsa->data->type); \
         ospf_lsa_discard (L); \
 	continue; }
 
@@ -1947,7 +1948,7 @@
               ospf_lsa_flush_area(lsa,out_if->area);
               if(IS_DEBUG_OSPF_EVENT)
                 zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point 9: lsa %p Type-%d",
-                            lsa, (int) lsa->data->type);
+                            (void *)lsa, (int) lsa->data->type);
               ospf_lsa_discard (lsa);
               Flag = 1;
             }
diff --git a/ospfd/ospf_snmp.c b/ospfd/ospf_snmp.c
index 7f7b157..9f91776 100644
--- a/ospfd/ospf_snmp.c
+++ b/ospfd/ospf_snmp.c
@@ -986,7 +986,7 @@
       offsetlen = *length - v->namelen;
       len = offsetlen;
 
-      if (len > IN_ADDR_SIZE)
+      if (len > (int)IN_ADDR_SIZE)
 	len = IN_ADDR_SIZE;
 
       oid2in_addr (offset, len, area_id);
@@ -1026,7 +1026,7 @@
 	  else
 	    {
 	      ls_id_next = 0;
-	      if (len > IN_ADDR_SIZE)
+	      if (len > (int)IN_ADDR_SIZE)
 		len = IN_ADDR_SIZE;
 
 	      oid2in_addr (offset, len, ls_id);
@@ -1042,7 +1042,7 @@
 	  else
 	    {
 	      router_id_next = 0;
-	      if (len > IN_ADDR_SIZE)
+	      if (len > (int)IN_ADDR_SIZE)
 		len = IN_ADDR_SIZE;
 
 	      oid2in_addr (offset, len, router_id);
@@ -1152,7 +1152,7 @@
 {
   oid *offset;
   int offsetlen;
-  unsigned int len;
+  int len;
   struct ospf *ospf;
   struct ospf_area *area;
   struct ospf_area_range *range;
@@ -1193,7 +1193,7 @@
       offsetlen = *length - v->namelen;
 
       len = offsetlen;
-      if (len > IN_ADDR_SIZE)
+      if (len > (int)IN_ADDR_SIZE)
 	len = IN_ADDR_SIZE;
 
       oid2in_addr (offset, len, area_id);
@@ -1215,7 +1215,7 @@
 
 	  if (len < 0)
 	    len = 0;
-	  if (len > IN_ADDR_SIZE)
+	  if (len > (int)IN_ADDR_SIZE)
 	    len = IN_ADDR_SIZE;
 
 	  oid2in_addr (offset, len, range_net);
diff --git a/ospfd/ospf_spf.c b/ospfd/ospf_spf.c
index 1fe8ab4..58a3992 100644
--- a/ospfd/ospf_spf.c
+++ b/ospfd/ospf_spf.c
@@ -590,7 +590,7 @@
 
           if (l->m[0].type == LSA_LINK_TYPE_POINTOPOINT)
             {
-	      struct in_addr nexthop;
+              struct in_addr nexthop = { .s_addr = 0 };
 
               /* If the destination is a router which connects to
                  the calculating router via a Point-to-MultiPoint
@@ -1014,7 +1014,7 @@
     for (ALL_LIST_ELEMENTS_RO (v->parents, nnode, parent))
       {
         zlog_debug (" nexthop %p %s %s", 
-                    parent->nexthop,
+                    (void *)parent->nexthop,
                     inet_ntoa (parent->nexthop->router),
                     parent->nexthop->oi ? IF_NAME(parent->nexthop->oi)
                                         : "NULL");
@@ -1444,7 +1444,7 @@
     {
       if (IS_DEBUG_OSPF_EVENT)
         zlog_debug ("SPF: calculation timer is already scheduled: %p",
-                   ospf->t_spf_calc);
+                    (void *)ospf->t_spf_calc);
       return;
     }
   
diff --git a/ospfd/ospf_te.c b/ospfd/ospf_te.c
index c605ce6..bcb8963 100644
--- a/ospfd/ospf_te.c
+++ b/ospfd/ospf_te.c
@@ -556,7 +556,7 @@
 
   if (lookup_linkparams_by_ifp (ifp) != NULL)
     {
-      zlog_warn ("ospf_mpls_te_new_if: ifp(%p) already in use?", ifp);
+      zlog_warn ("ospf_mpls_te_new_if: ifp(%p) already in use?", (void *)ifp);
       rc = 0; /* Do nothing here. */
       goto out;
     }
diff --git a/pimd/Makefile.am b/pimd/Makefile.am
index f13debd..b82613a 100644
--- a/pimd/Makefile.am
+++ b/pimd/Makefile.am
@@ -34,12 +34,12 @@
 PIM_DEFS += -DPIM_ENFORCE_LOOPFREE_MFC
 #PIM_DEFS += -DPIM_UNEXPECTED_KERNEL_UPCALL
 
-AM_CPPFLAGS = -I.. -I$(top_srcdir) -I$(top_srcdir)/lib
+AM_CPPFLAGS = -I.. -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_builddir)/lib
 DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\" $(PIM_DEFS)
 INSTALL_SDATA=@INSTALL@ -m 600
 LIBS = @LIBS@
 
-AM_CFLAGS = $(PICFLAGS)
+AM_CFLAGS = $(PICFLAGS) $(WERROR)
 AM_LDFLAGS = $(PILDFLAGS)
 
 noinst_LIBRARIES = libpim.a
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index 6b2ac66..13812cd 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -2031,8 +2031,8 @@
     if (ioctl(qpim_mroute_socket_fd, SIOCGETVIFCNT, &vreq)) {
       int e = errno;
       vty_out(vty,
-	      "ioctl(SIOCGETVIFCNT=%d) failure for interface %s vif_index=%d: errno=%d: %s%s",
-	      SIOCGETVIFCNT,
+	      "ioctl(SIOCGETVIFCNT=%lu) failure for interface %s vif_index=%d: errno=%d: %s%s",
+	      (unsigned long)SIOCGETVIFCNT,
 	      ifp->name,
 	      pim_ifp->mroute_vif_index,
 	      e,
@@ -2225,8 +2225,8 @@
     if (ioctl(qpim_mroute_socket_fd, SIOCGETSGCNT, &sgreq)) {
       int e = errno;
       vty_out(vty,
-	      "ioctl(SIOCGETSGCNT=%d) failure for (S,G)=(%s,%s): errno=%d: %s%s",
-	      SIOCGETSGCNT,
+	      "ioctl(SIOCGETSGCNT=%lu) failure for (S,G)=(%s,%s): errno=%d: %s%s",
+	      (unsigned long)SIOCGETSGCNT,
 	      source_str,
 	      group_str,
 	      e,
diff --git a/pimd/pim_igmpv3.c b/pimd/pim_igmpv3.c
index 3baddbf..3657f2f 100644
--- a/pimd/pim_igmpv3.c
+++ b/pimd/pim_igmpv3.c
@@ -1680,7 +1680,8 @@
 #endif
   tolen = sizeof(to);
 
-  sent = sendto(fd, query_buf, msg_size, MSG_DONTWAIT, &to, tolen);
+  sent = sendto(fd, query_buf, msg_size, MSG_DONTWAIT,
+                (struct sockaddr *)&to, tolen);
   if (sent != (ssize_t) msg_size) {
     int e = errno;
     char dst_str[100];
diff --git a/pimd/pim_int.c b/pimd/pim_int.c
index 2ff1a11..0bdd772 100644
--- a/pimd/pim_int.c
+++ b/pimd/pim_int.c
@@ -22,6 +22,7 @@
 
 #include <string.h>
 #include <netinet/in.h>
+#include <arpa/inet.h>
 
 #include "pim_int.h"
 
diff --git a/pimd/pim_pim.c b/pimd/pim_pim.c
index f6f4c95..f8ac650 100644
--- a/pimd/pim_pim.c
+++ b/pimd/pim_pim.c
@@ -476,7 +476,8 @@
     pim_pkt_dump(__PRETTY_FUNCTION__, pim_msg, pim_msg_size);
   }
 
-  sent = sendto(fd, pim_msg, pim_msg_size, MSG_DONTWAIT, &to, tolen);
+  sent = sendto(fd, pim_msg, pim_msg_size, MSG_DONTWAIT,
+                (struct sockaddr *)&to, tolen);
   if (sent != (ssize_t) pim_msg_size) {
     int e = errno;
     char dst_str[100];
diff --git a/pimd/pim_ssmpingd.c b/pimd/pim_ssmpingd.c
index fd1eac0..82e0722 100644
--- a/pimd/pim_ssmpingd.c
+++ b/pimd/pim_ssmpingd.c
@@ -96,7 +96,7 @@
   sockaddr.sin_addr   = addr;
   sockaddr.sin_port   = htons(port);
 
-  if (bind(fd, &sockaddr, sizeof(sockaddr))) {
+  if (bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr))) {
     char addr_str[100];
     pim_inet4_dump("<addr?>", addr, addr_str, sizeof(addr_str));
     zlog_warn("%s: bind(fd=%d,addr=%s,port=%d,len=%zu) failure: errno=%d: %s",
@@ -222,7 +222,8 @@
   socklen_t tolen = sizeof(to);
   int sent;
 
-  sent = sendto(ss->sock_fd, buf, len, MSG_DONTWAIT, &to, tolen);
+  sent = sendto(ss->sock_fd, buf, len, MSG_DONTWAIT,
+                (struct sockaddr *)&to, tolen);
   if (sent != len) {
     int e = errno;
     char to_str[100];
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index 6f241d5..129cbe4 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -51,6 +51,7 @@
 		   struct interface *oif,
 		   uint32_t proto_mask);
 
+#if 0
 static void zclient_broken(struct zclient *zclient)
 {
   struct listnode  *ifnode;
@@ -65,6 +66,7 @@
 
   /* upon return, zclient will discard connected addresses */
 }
+#endif
 
 /* Router-id update message from zebra. */
 static int pim_router_id_update_zebra(int command, struct zclient *zclient,
diff --git a/ripd/Makefile.am b/ripd/Makefile.am
index 65a626d..34c5f18 100644
--- a/ripd/Makefile.am
+++ b/ripd/Makefile.am
@@ -4,7 +4,7 @@
 DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\"
 INSTALL_SDATA=@INSTALL@ -m 600
 
-AM_CFLAGS = $(PICFLAGS)
+AM_CFLAGS = $(PICFLAGS) $(WERROR)
 AM_LDFLAGS = $(PILDFLAGS)
 
 noinst_LIBRARIES = librip.a
diff --git a/ripd/rip_snmp.c b/ripd/rip_snmp.c
index 2df815b..2c7cd2c 100644
--- a/ripd/rip_snmp.c
+++ b/ripd/rip_snmp.c
@@ -295,7 +295,7 @@
 
       peer = rip_peer_lookup (addr);
 
-      if (peer->domain == name[v->namelen + sizeof (struct in_addr)])
+      if (peer->domain == (int)name[v->namelen + sizeof (struct in_addr)])
 	return peer;
 
       return NULL;
@@ -311,8 +311,8 @@
       peer = rip_peer_lookup (addr);
       if (peer)
 	{
-	  if ((len < sizeof (struct in_addr) + 1) ||
-	      (peer->domain > name[v->namelen + sizeof (struct in_addr)]))
+	  if ((len < (int)sizeof (struct in_addr) + 1) ||
+	      (peer->domain > (int)name[v->namelen + sizeof (struct in_addr)]))
 	    {
 	      oid_copy_addr (name + v->namelen, &peer->addr,
 			     sizeof (struct in_addr));
diff --git a/ripngd/Makefile.am b/ripngd/Makefile.am
index 9bd14ba..0487459 100644
--- a/ripngd/Makefile.am
+++ b/ripngd/Makefile.am
@@ -4,7 +4,7 @@
 DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\"
 INSTALL_SDATA=@INSTALL@ -m 600
 
-AM_CFLAGS = $(PICFLAGS)
+AM_CFLAGS = $(PICFLAGS) $(WERROR)
 AM_LDFLAGS = $(PILDFLAGS)
 
 noinst_LIBRARIES = libripng.a
diff --git a/ripngd/ripngd.c b/ripngd/ripngd.c
index 8c20a7a..4c0b67d 100644
--- a/ripngd/ripngd.c
+++ b/ripngd/ripngd.c
@@ -236,7 +236,7 @@
   struct msghdr msg;
   struct iovec iov;
   struct cmsghdr  *cmsgptr;
-  struct in6_addr dst;
+  struct in6_addr dst = { .s6_addr = { 0 } };
 
   /* Ancillary data.  This store cmsghdr and in6_pktinfo.  But at this
      point I can't determine size of cmsghdr */
@@ -1317,7 +1317,7 @@
   int sock;
   struct sockaddr_in6 from;
   struct ripng_packet *packet;
-  unsigned int ifindex;
+  unsigned int ifindex = 0;
   struct interface *ifp;
   int hoplimit = -1;
 
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 1fe28c7..b542071 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -36,14 +36,14 @@
 
 test-commands-defun.c: ../vtysh/vtysh_cmd.c
 	sed \
-		-e '/"vtysh.h"/d' \
+		-e 's/"vtysh\.h"/"tests.h"/' \
 		-e 's/vtysh_init_cmd/test_init_cmd/' \
 		-e 's/VTYSH_[A-Z][A-Z_0-9]*/0/g' \
 		< ../vtysh/vtysh_cmd.c \
 		> test-commands-defun.c
 
 BUILT_SOURCES = test-commands-defun.c
-noinst_HEADERS = prng.h
+noinst_HEADERS = prng.h tests.h
 
 testsig_SOURCES = test-sig.c
 testsegv_SOURCES = test-segv.c
diff --git a/tests/bgp_mp_attr_test.c b/tests/bgp_mp_attr_test.c
index 5f0e733..d649e14 100644
--- a/tests/bgp_mp_attr_test.c
+++ b/tests/bgp_mp_attr_test.c
@@ -545,7 +545,7 @@
     return -1;
   
   peer = peer_create_accept (bgp);
-  peer->host = "foo";
+  peer->host = (char *)"foo";
   
   for (i = AFI_IP; i < AFI_MAX; i++)
     for (j = SAFI_UNICAST; j < SAFI_MAX; j++)
diff --git a/tests/bgp_mpath_test.c b/tests/bgp_mpath_test.c
index 3d0ecb7..3594753 100644
--- a/tests/bgp_mpath_test.c
+++ b/tests/bgp_mpath_test.c
@@ -252,7 +252,7 @@
   bgp_mp_list_add (&mp_list, &test_mp_list_info[3]);
   bgp_mp_list_add (&mp_list, &test_mp_list_info[0]);
 
-  for (i = 0, mp_node = listhead(&mp_list); i < test_mp_list_info_count;
+  for (i = 0, mp_node = mp_list.head; i < test_mp_list_info_count;
        i++, mp_node = listnextnode(mp_node))
     {
       info = listgetdata(mp_node);
diff --git a/tests/ecommunity_test.c b/tests/ecommunity_test.c
index cd1681d..f12aa71 100644
--- a/tests/ecommunity_test.c
+++ b/tests/ecommunity_test.c
@@ -132,7 +132,7 @@
   
   printf ("%s: %s\n", t->name, t->desc);
 
-  ecom = ecommunity_parse (t->data, t->len);
+  ecom = ecommunity_parse ((u_int8_t *)t->data, t->len);
 
   printf ("ecom: %s\nvalidating...:\n", ecommunity_str (ecom));
 
diff --git a/tests/heavy-thread.c b/tests/heavy-thread.c
index cd3a3b9..c2e71c1 100644
--- a/tests/heavy-thread.c
+++ b/tests/heavy-thread.c
@@ -37,6 +37,8 @@
 #include "memory.h"
 #include "log.h"
 
+#include "tests.h"
+
 extern struct thread_master *master;
 
 enum
diff --git a/tests/heavy-wq.c b/tests/heavy-wq.c
index e5f688c..2f133cc 100644
--- a/tests/heavy-wq.c
+++ b/tests/heavy-wq.c
@@ -36,6 +36,8 @@
 #include "workqueue.h"
 #include <math.h>
 
+#include "tests.h"
+
 extern struct thread_master *master;
 static struct work_queue *heavy_wq;
 
diff --git a/tests/heavy.c b/tests/heavy.c
index 577a481..9af46c8 100644
--- a/tests/heavy.c
+++ b/tests/heavy.c
@@ -36,6 +36,8 @@
 #include "memory.h"
 #include <math.h>
 
+#include "tests.h"
+
 enum
 {
   ITERS_FIRST = 0,
diff --git a/tests/main.c b/tests/main.c
index 5e7bdcb..5396c7d 100644
--- a/tests/main.c
+++ b/tests/main.c
@@ -52,7 +52,7 @@
 }
 
 static int timer_count;
-int
+static int
 test_timer (struct thread *thread)
 {
   int *count = THREAD_ARG(thread);
diff --git a/tests/test-checksum.c b/tests/test-checksum.c
index 9672e95..b6741f3 100644
--- a/tests/test-checksum.c
+++ b/tests/test-checksum.c
@@ -46,41 +46,6 @@
 /* Fletcher Checksum -- Refer to RFC1008. */
 #define MODX                 4102
 
-/* Accumulator phase of checksum */
-static 
-struct acc_vals
-accumulate (u_char *buffer, testsz_t len, testoff_t off)
-{
-  u_int8_t *p;
-  u_int16_t *csum;
-  int i, partial_len;
-  struct acc_vals ret;
-  
-  csum = (u_int16_t *) (buffer + off);
-  *(csum) = 0;
-  
-  p = buffer;
-  ret.c0 = 0;
-  ret.c1 = 0;
-  
-  while (len != 0)
-    {
-      partial_len = MIN(len, MODX);
-
-      for (i = 0; i < partial_len; i++)
-	{
-	  ret.c0 = ret.c0 + *(p++);
-	  ret.c1 += ret.c0;
-	}
-
-      ret.c0 = ret.c0 % 255;
-      ret.c1 = ret.c1 % 255;
-
-      len -= partial_len;
-    }
-  return ret;
-}
-
 /* The final reduction phase.
  * This one should be the original ospfd version 
  */
diff --git a/tests/test-segv.c b/tests/test-segv.c
index 55bd25a..1b851fc 100644
--- a/tests/test-segv.c
+++ b/tests/test-segv.c
@@ -35,7 +35,7 @@
 
 struct thread_master *master;
 
-int
+static int
 threadfunc (struct thread *thread)
 {
   int *null = NULL;
diff --git a/tests/test-sig.c b/tests/test-sig.c
index 7415d7a..f24da96 100644
--- a/tests/test-sig.c
+++ b/tests/test-sig.c
@@ -22,19 +22,19 @@
 #include "lib/log.h"
 #include "lib/memory.h"
 
-void
+static void
 sighup (void)
 {
   printf ("processed hup\n");
 }
 
-void
+static void
 sigusr1 (void)
 {
   printf ("processed usr1\n");
 }
 
-void
+static void
 sigusr2 (void)
 {
   printf ("processed usr2\n");
diff --git a/tests/test-timer-correctness.c b/tests/test-timer-correctness.c
index 94c8f1d..47c0b73 100644
--- a/tests/test-timer-correctness.c
+++ b/tests/test-timer-correctness.c
@@ -140,8 +140,9 @@
       interval_msec = prng_rand(prng) % 5000;
       arg = XMALLOC(MTYPE_TMP, TIMESTR_LEN + 1);
       timers[i] = thread_add_timer_msec(master, timer_func, arg, interval_msec);
-      ret = snprintf(arg, TIMESTR_LEN + 1, "%ld.%06ld",
-                     timers[i]->u.sands.tv_sec, timers[i]->u.sands.tv_usec);
+      ret = snprintf(arg, TIMESTR_LEN + 1, "%lld.%06lld",
+                     (long long)timers[i]->u.sands.tv_sec,
+                     (long long)timers[i]->u.sands.tv_usec);
       assert(ret > 0);
       assert((size_t)ret < TIMESTR_LEN + 1);
       timers_pending++;
@@ -180,7 +181,9 @@
 
       ret = snprintf(expected_buf + expected_buf_pos,
                      expected_buf_len - expected_buf_pos,
-                     "%ld.%06ld\n", alarms[i]->tv_sec, alarms[i]->tv_usec);
+                     "%lld.%06lld\n",
+                     (long long)alarms[i]->tv_sec,
+                     (long long)alarms[i]->tv_usec);
       assert(ret > 0);
       expected_buf_pos += ret;
       assert(expected_buf_pos < expected_buf_len);
diff --git a/tests/tests.h b/tests/tests.h
new file mode 100644
index 0000000..a528e55
--- /dev/null
+++ b/tests/tests.h
@@ -0,0 +1,31 @@
+/*
+ * Test wrappers common header file
+ *
+ * Copyright (C) 2015 by David Lamparter,
+ *                    for Open Source Routing./ NetDEF, Inc.
+ *
+ * This file is part of Quagga
+ *
+ * Quagga is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * Quagga is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Quagga; see the file COPYING.  If not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifndef _QUAGGA_TESTS_H
+#define _QUAGGA_TESTS_H
+
+extern void test_init (void);
+extern void test_init_cmd (void);
+
+#endif /* _QUAGGA_TESTS_H */
diff --git a/vtysh/Makefile.am b/vtysh/Makefile.am
index a66615b..0cc6d5b 100644
--- a/vtysh/Makefile.am
+++ b/vtysh/Makefile.am
@@ -5,7 +5,7 @@
 
 LIBS = @LIBS@ @CURSES@ @LIBPAM@
 
-AM_CFLAGS = $(PICFLAGS)
+AM_CFLAGS = $(PICFLAGS) $(WERROR)
 AM_LDFLAGS = $(PILDFLAGS)
 
 bin_PROGRAMS = vtysh
diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c
index 984f8d3..fbbc88d 100644
--- a/vtysh/vtysh.c
+++ b/vtysh/vtysh.c
@@ -251,7 +251,7 @@
     }
 }
 
-void
+static void
 vtysh_exit_ripd_only (void)
 {
   if (ripd_client)
@@ -547,7 +547,7 @@
 }
 
 /* We don't care about the point of the cursor when '?' is typed. */
-int
+static int
 vtysh_rl_describe (void)
 {
   int ret;
@@ -563,11 +563,11 @@
   if (vline == NULL)
     {
       vline = vector_init (1);
-      vector_set (vline, '\0');
+      vector_set (vline, NULL);
     }
   else 
     if (rl_end && isspace ((int) rl_line_buffer[rl_end - 1]))
-      vector_set (vline, '\0');
+      vector_set (vline, NULL);
 
   describe = cmd_describe_command (vline, vty, &ret);
 
@@ -657,7 +657,7 @@
 	return NULL;
 
       if (rl_end && isspace ((int) rl_line_buffer[rl_end - 1]))
-	vector_set (vline, '\0');
+        vector_set (vline, NULL);
 
       matched = cmd_complete_command (vline, vty, &complete_status);
     }
@@ -821,7 +821,7 @@
 extern struct cmd_node vty_node;
 
 /* When '^Z' is received from vty, move down to the enable mode. */
-int
+static int
 vtysh_end (void)
 {
   switch (vty->node)
@@ -1713,7 +1713,6 @@
        "Write to terminal\n")
 {
   u_int i;
-  int ret;
   char line[] = "write terminal\n";
   FILE *fp = NULL;
 
@@ -1735,7 +1734,7 @@
   vty_out (vty, "!%s", VTY_NEWLINE);
 
   for (i = 0; i < array_size(vtysh_client); i++)
-    ret = vtysh_client_config (&vtysh_client[i], line);
+    vtysh_client_config (&vtysh_client[i], line);
 
   /* Integrate vtysh specific configuration. */
   vtysh_config_write ();
@@ -1783,7 +1782,6 @@
 write_config_integrated(void)
 {
   u_int i;
-  int ret;
   char line[] = "write terminal\n";
   FILE *fp;
   char *integrate_sav = NULL;
@@ -1809,7 +1807,7 @@
     }
 
   for (i = 0; i < array_size(vtysh_client); i++)
-    ret = vtysh_client_config (&vtysh_client[i], line);
+    vtysh_client_config (&vtysh_client[i], line);
 
   vtysh_config_dump (fp);
 
@@ -1948,7 +1946,6 @@
 execute_command (const char *command, int argc, const char *arg1,
 		 const char *arg2)
 {
-  int ret;
   pid_t pid;
   int status;
 
@@ -1967,13 +1964,13 @@
       switch (argc)
 	{
 	case 0:
-	  ret = execlp (command, command, (const char *)NULL);
+	  execlp (command, command, (const char *)NULL);
 	  break;
 	case 1:
-	  ret = execlp (command, command, arg1, (const char *)NULL);
+	  execlp (command, command, arg1, (const char *)NULL);
 	  break;
 	case 2:
-	  ret = execlp (command, command, arg1, arg2, (const char *)NULL);
+	  execlp (command, command, arg1, arg2, (const char *)NULL);
 	  break;
 	}
 
@@ -1985,7 +1982,7 @@
     {
       /* This is parent. */
       execute_flag = 1;
-      ret = wait4 (pid, &status, 0, NULL);
+      wait4 (pid, &status, 0, NULL);
       execute_flag = 0;
     }
   return 0;
diff --git a/vtysh/vtysh_config.c b/vtysh/vtysh_config.c
index f9cb6a7..1ddaac0 100644
--- a/vtysh/vtysh_config.c
+++ b/vtysh/vtysh_config.c
@@ -47,19 +47,19 @@
 
 struct list *config_top;
 
-int
+static int
 line_cmp (char *c1, char *c2)
 {
   return strcmp (c1, c2);
 }
 
-void
+static void
 line_del (char *line)
 {
   XFREE (MTYPE_VTYSH_CONFIG_LINE, line);
 }
 
-struct config *
+static struct config *
 config_new ()
 {
   struct config *config;
@@ -67,13 +67,13 @@
   return config;
 }
 
-int
+static int
 config_cmp (struct config *c1, struct config *c2)
 {
   return strcmp (c1->name, c2->name);
 }
 
-void
+static void
 config_del (struct config* config)
 {
   list_delete (config->line);
@@ -82,7 +82,7 @@
   XFREE (MTYPE_VTYSH_CONFIG, config);
 }
 
-struct config *
+static struct config *
 config_get (int index, const char *line)
 {
   struct config *config;
@@ -121,13 +121,13 @@
   return config;
 }
 
-void
+static void
 config_add_line (struct list *config, const char *line)
 {
   listnode_add (config, XSTRDUP (MTYPE_VTYSH_CONFIG_LINE, line));
 }
 
-void
+static void
 config_add_line_uniq (struct list *config, const char *line)
 {
   struct listnode *node, *nnode;
@@ -141,7 +141,7 @@
   listnode_add_sort (config, XSTRDUP (MTYPE_VTYSH_CONFIG_LINE, line));
 }
 
-void
+static void
 vtysh_config_parse_line (const char *line)
 {
   char c;
diff --git a/vtysh/vtysh_main.c b/vtysh/vtysh_main.c
index 48958f0..aa7d021 100644
--- a/vtysh/vtysh_main.c
+++ b/vtysh/vtysh_main.c
@@ -63,7 +63,7 @@
 FILE *logfile;
 
 /* SIGTSTP handler.  This function care user's ^Z input. */
-void
+static void
 sigtstp (int sig)
 {
   /* Execute "end" command. */
@@ -84,7 +84,7 @@
 }
 
 /* SIGINT handler.  This function care user's ^Z input.  */
-void
+static void
 sigint (int sig)
 {
   /* Check this process is not child process. */
@@ -98,10 +98,9 @@
 
 /* Signale wrapper for vtysh. We don't use sigevent because
  * vtysh doesn't use threads. TODO */
-RETSIGTYPE *
+static void
 vtysh_signal_set (int signo, void (*func)(int))
 {
-  int ret;
   struct sigaction sig;
   struct sigaction osig;
 
@@ -112,16 +111,11 @@
   sig.sa_flags |= SA_RESTART;
 #endif /* SA_RESTART */
 
-  ret = sigaction (signo, &sig, &osig);
-
-  if (ret < 0) 
-    return (SIG_ERR);
-  else
-    return (osig.sa_handler);
+  sigaction (signo, &sig, &osig);
 }
 
 /* Initialization of signal handles. */
-void
+static void
 vtysh_signal_init ()
 {
   vtysh_signal_set (SIGINT, sigint);
@@ -168,7 +162,7 @@
 };
 
 /* Read a string, and return a pointer to it.  Returns NULL on EOF. */
-char *
+static char *
 vtysh_rl_gets ()
 {
   HIST_ENTRY *last;
@@ -202,9 +196,12 @@
 {
   time_t t = time(NULL);
   struct tm *tmp = localtime(&t);
-  char *user = getenv("USER") ? : "boot";
+  const char *user = getenv("USER");
   char tod[64];
 
+  if (!user)
+    user = "boot";
+
   strftime(tod, sizeof tod, "%Y%m%d-%H:%M.%S", tmp);
   
   fprintf(logfile, "%s:%s %s\n", tod, user, line);
diff --git a/vtysh/vtysh_user.c b/vtysh/vtysh_user.c
index 58676c1..e1c611c 100644
--- a/vtysh/vtysh_user.c
+++ b/vtysh/vtysh_user.c
@@ -37,6 +37,7 @@
 #include "memory.h"
 #include "linklist.h"
 #include "command.h"
+#include "vtysh_user.h"
 
 #ifdef USE_PAM
 static struct pam_conv conv = 
@@ -98,19 +99,21 @@
 
 struct list *userlist;
 
-struct vtysh_user *
+static struct vtysh_user *
 user_new ()
 {
   return XCALLOC (0, sizeof (struct vtysh_user));
 }
 
-void
+#if 0
+static void
 user_free (struct vtysh_user *user)
 {
   XFREE (0, user);
 }
+#endif
 
-struct vtysh_user *
+static struct vtysh_user *
 user_lookup (const char *name)
 {
   struct listnode *node, *nnode;
@@ -124,7 +127,8 @@
   return NULL;
 }
 
-void
+#if 0
+static void
 user_config_write ()
 {
   struct listnode *node, *nnode;
@@ -136,8 +140,9 @@
 	printf (" username %s nopassword\n", user->name);
     }
 }
+#endif
 
-struct vtysh_user *
+static struct vtysh_user *
 user_get (const char *name)
 {
   struct vtysh_user *user;
@@ -166,7 +171,7 @@
 }
 
 int
-vtysh_auth ()
+vtysh_auth (void)
 {
   struct vtysh_user *user;
   struct passwd *passwd;
@@ -187,7 +192,7 @@
 }
 
 void
-vtysh_user_init ()
+vtysh_user_init (void)
 {
   userlist = list_new ();
   install_element (CONFIG_NODE, &username_nopassword_cmd);
diff --git a/vtysh/vtysh_user.h b/vtysh/vtysh_user.h
index 8d0a4cf..c485c23 100644
--- a/vtysh/vtysh_user.h
+++ b/vtysh/vtysh_user.h
@@ -22,6 +22,7 @@
 #ifndef _VTYSH_USER_H
 #define _VTYSH_USER_H
 
-int vtysh_auth ();
+int vtysh_auth (void);
+void vtysh_user_init (void);
 
 #endif /* _VTYSH_USER_H */
diff --git a/watchquagga/Makefile.am b/watchquagga/Makefile.am
index 9256006..939ecd7 100644
--- a/watchquagga/Makefile.am
+++ b/watchquagga/Makefile.am
@@ -3,7 +3,7 @@
 AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_builddir)/lib
 DEFS = @DEFS@ -DSTATEDIR=\"$(localstatedir)/\"
 
-AM_CFLAGS = $(PICFLAGS)
+AM_CFLAGS = $(PICFLAGS) $(WERROR)
 AM_LDFLAGS = $(PILDFLAGS)
 
 sbin_PROGRAMS = watchquagga
diff --git a/watchquagga/watchquagga.c b/watchquagga/watchquagga.c
index c1c8892..d92803d 100644
--- a/watchquagga/watchquagga.c
+++ b/watchquagga/watchquagga.c
@@ -215,7 +215,8 @@
   if (status != 0)
     fprintf(stderr, "Try `%s --help' for more information.\n", progname);
   else
-    printf("Usage : %s [OPTION...] <daemon name> ...\n\n\
+    {
+      printf("Usage : %s [OPTION...] <daemon name> ...\n\n\
 Watchdog program to monitor status of quagga daemons and try to restart\n\
 them if they are down or unresponsive.  It determines whether a daemon is\n\
 up based on whether it can connect to the daemon's vty unix stream socket.\n\
@@ -259,8 +260,12 @@
 restart commands.  The minimum restart delay is recalculated each time\n\
 a restart is attempted: if the time since the last restart attempt exceeds\n\
 twice the -M value, then the restart delay is set to the -m value.\n\
-Otherwise, the interval is doubled (but capped at the -M value).\n\n\
-Options:\n\
+Otherwise, the interval is doubled (but capped at the -M value).\n\n",
+        progname,mode_str[0],progname,mode_str[1],progname,mode_str[2],
+        progname,mode_str[3],progname,mode_str[4],progname,mode_str[2],
+        mode_str[3]);
+
+      printf("Options:\n\
 -d, --daemon	Run in daemon mode.  In this mode, error messages are sent\n\
 		to syslog instead of stdout.\n\
 -S, --statedir	Set the vty socket directory (default is %s)\n\
@@ -318,12 +323,12 @@
 		it with a space.  This is an ugly hack to circumvent problems\n\
 		passing command-line arguments with embedded spaces.\n\
 -v, --version	Print program version\n\
--h, --help	Display this help and exit\n\
-", progname,mode_str[0],progname,mode_str[1],progname,mode_str[2],
-progname,mode_str[3],progname,mode_str[4],progname,mode_str[2],mode_str[3],
-VTYDIR,DEFAULT_LOGLEVEL,LOG_EMERG,LOG_DEBUG,LOG_DEBUG,
-DEFAULT_MIN_RESTART,DEFAULT_MAX_RESTART,
-DEFAULT_PERIOD,DEFAULT_TIMEOUT,DEFAULT_RESTART_TIMEOUT,DEFAULT_PIDFILE);
+-h, --help	Display this help and exit\n",
+        VTYDIR,DEFAULT_LOGLEVEL,LOG_EMERG,LOG_DEBUG,LOG_DEBUG,
+        DEFAULT_MIN_RESTART,DEFAULT_MAX_RESTART,
+        DEFAULT_PERIOD,DEFAULT_TIMEOUT,DEFAULT_RESTART_TIMEOUT,
+        DEFAULT_PIDFILE);
+    }
 
   return status;
 }
@@ -381,7 +386,7 @@
   time_elapsed(&delay,&restart->time);
   zlog_warn("Warning: %s %s child process %d still running after "
 	    "%ld seconds, sending signal %d",
-	    restart->what,restart->name,(int)restart->pid,delay.tv_sec,
+	    restart->what,restart->name,(int)restart->pid, (long)delay.tv_sec,
 	    (restart->kills ? SIGKILL : SIGTERM));
   kill(-restart->pid,(restart->kills ? SIGKILL : SIGTERM));
   restart->kills++;
@@ -654,15 +659,17 @@
 	{
 	  dmn->state = DAEMON_UP;
 	  zlog_warn("%s state -> up : echo response received after %ld.%06ld "
-		    "seconds", dmn->name,delay.tv_sec,delay.tv_usec);
+		    "seconds", dmn->name,
+		    (long)delay.tv_sec, (long)delay.tv_usec);
 	}
       else
 	zlog_warn("%s: slow echo response finally received after %ld.%06ld "
-		  "seconds", dmn->name,delay.tv_sec,delay.tv_usec);
+		  "seconds", dmn->name,
+		  (long)delay.tv_sec, (long)delay.tv_usec);
     }
   else if (gs.loglevel > LOG_DEBUG+1)
     zlog_debug("%s: echo response received after %ld.%06ld seconds",
-	       dmn->name,delay.tv_sec,delay.tv_usec);
+	       dmn->name, (long)delay.tv_sec, (long)delay.tv_usec);
 
   SET_READ_HANDLER(dmn);
   if (dmn->t_wakeup)
diff --git a/zebra/Makefile.am b/zebra/Makefile.am
index 4808791..7dcbd66 100644
--- a/zebra/Makefile.am
+++ b/zebra/Makefile.am
@@ -20,7 +20,7 @@
 othersrc = zebra_fpm_netlink.c
 endif
 
-AM_CFLAGS = $(PICFLAGS)
+AM_CFLAGS = $(PICFLAGS) $(WERROR)
 AM_LDFLAGS = $(PILDFLAGS)
 
 sbin_PROGRAMS = zebra
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index 86bd8ff..8701416 100644
--- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c
@@ -23,12 +23,11 @@
 #include <zebra.h>
 
 #include "zebra/zserv.h"
-
-extern int interface_lookup_netlink (void);
+#include "rt_netlink.h"
 
 /* Interface information read by netlink. */
 void
 interface_list (void)
 {
-  interface_lookup_netlink ();  
+  interface_lookup_netlink ();
 }
diff --git a/zebra/if_sysctl.c b/zebra/if_sysctl.c
index 5e80996..ffa6927 100644
--- a/zebra/if_sysctl.c
+++ b/zebra/if_sysctl.c
@@ -29,6 +29,7 @@
 #include "memory.h"
 #include "ioctl.h"
 #include "log.h"
+#include "interface.h"
 
 #include "zebra/rt.h"
 #include "zebra/kernel_socket.h"
diff --git a/zebra/interface.c b/zebra/interface.c
index 0271061..54d8b10 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -836,24 +836,29 @@
 #ifdef HAVE_NET_RT_IFLIST
 #if defined (__bsdi__) || defined (__NetBSD__)
   /* Statistics print out using sysctl (). */
-  vty_out (vty, "    input packets %qu, bytes %qu, dropped %qu,"
-	   " multicast packets %qu%s",
-	   ifp->stats.ifi_ipackets, ifp->stats.ifi_ibytes,
-	   ifp->stats.ifi_iqdrops, ifp->stats.ifi_imcasts,
-	   VTY_NEWLINE);
+  vty_out (vty, "    input packets %llu, bytes %llu, dropped %llu,"
+           " multicast packets %llu%s",
+           (unsigned long long)ifp->stats.ifi_ipackets,
+           (unsigned long long)ifp->stats.ifi_ibytes,
+           (unsigned long long)ifp->stats.ifi_iqdrops,
+           (unsigned long long)ifp->stats.ifi_imcasts,
+           VTY_NEWLINE);
 
-  vty_out (vty, "    input errors %qu%s",
-	   ifp->stats.ifi_ierrors, VTY_NEWLINE);
+  vty_out (vty, "    input errors %llu%s",
+           (unsigned long long)ifp->stats.ifi_ierrors, VTY_NEWLINE);
 
-  vty_out (vty, "    output packets %qu, bytes %qu, multicast packets %qu%s",
-	   ifp->stats.ifi_opackets, ifp->stats.ifi_obytes,
-	   ifp->stats.ifi_omcasts, VTY_NEWLINE);
+  vty_out (vty, "    output packets %llu, bytes %llu,"
+           " multicast packets %llu%s",
+           (unsigned long long)ifp->stats.ifi_opackets,
+           (unsigned long long)ifp->stats.ifi_obytes,
+           (unsigned long long)ifp->stats.ifi_omcasts,
+           VTY_NEWLINE);
 
-  vty_out (vty, "    output errors %qu%s",
-	   ifp->stats.ifi_oerrors, VTY_NEWLINE);
+  vty_out (vty, "    output errors %llu%s",
+           (unsigned long long)ifp->stats.ifi_oerrors, VTY_NEWLINE);
 
-  vty_out (vty, "    collisions %qu%s",
-	   ifp->stats.ifi_collisions, VTY_NEWLINE);
+  vty_out (vty, "    collisions %llu%s",
+           (unsigned long long)ifp->stats.ifi_collisions, VTY_NEWLINE);
 #else
   /* Statistics print out using sysctl (). */
   vty_out (vty, "    input packets %lu, bytes %lu, dropped %lu,"
diff --git a/zebra/ioctl.c b/zebra/ioctl.c
index d783b0a..f7a7ff4 100644
--- a/zebra/ioctl.c
+++ b/zebra/ioctl.c
@@ -52,7 +52,7 @@
 {
   int sock;
   int ret;
-  int err;
+  int err = 0;
 
   if (zserv_privs.change(ZPRIVS_RAISE))
     zlog (NULL, LOG_ERR, "Can't raise privileges");
@@ -85,7 +85,7 @@
 {
   int sock;
   int ret;
-  int err;
+  int err = 0;
 
   if (zserv_privs.change(ZPRIVS_RAISE))
     zlog (NULL, LOG_ERR, "Can't raise privileges");
diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c
index 7553491..916dad9 100644
--- a/zebra/kernel_socket.c
+++ b/zebra/kernel_socket.c
@@ -58,6 +58,12 @@
  * Because of these varying conventions, the only sane approach is for
  * the <net/route.h> header to define some flavor of ROUNDUP macro.
  */
+
+#if defined(SA_SIZE)
+/* SAROUNDUP is the only thing we need, and SA_SIZE provides that */
+#define SAROUNDUP(a)	SA_SIZE(a)
+#else /* !SA_SIZE */
+
 #if defined(RT_ROUNDUP)
 #define ROUNDUP(a)	RT_ROUNDUP(a)
 #endif /* defined(RT_ROUNDUP) */
@@ -114,6 +120,8 @@
            ROUNDUP(sizeof(struct sockaddr_dl)) : sizeof(struct sockaddr)))
 #endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
 
+#endif /* !SA_SIZE */
+
 /*
  * We use a call to an inline function to copy (PNT) to (DEST)
  * 1. Calculating the length of the copy requires an #ifdef to determine
@@ -121,7 +129,7 @@
  * 2. So the compiler doesn't complain when DEST is NULL, which is only true
  *    when we are skipping the copy and incrementing to the next SA
  */
-static void inline
+static inline void
 rta_copy (union sockunion *dest, caddr_t src) {
   int len;
 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
@@ -271,7 +279,7 @@
 /* #define DEBUG */
 
 /* Supported address family check. */
-static int inline
+static inline int
 af_check (int family)
 {
   if (family == AF_INET)
@@ -1114,15 +1122,6 @@
     msg.rtm.rtm_flags |= RTF_REJECT;
 
 
-#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
-#define SOCKADDRSET(X,R) \
-  if (msg.rtm.rtm_addrs & (R)) \
-    { \
-      int len = ROUNDUP ((X)->sa.sa_len); \
-      memcpy (pnt, (caddr_t)(X), len); \
-      pnt += len; \
-    }
-#else 
 #define SOCKADDRSET(X,R) \
   if (msg.rtm.rtm_addrs & (R)) \
     { \
@@ -1130,7 +1129,6 @@
       memcpy (pnt, (caddr_t)(X), len); \
       pnt += len; \
     }
-#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
 
   pnt = (caddr_t) msg.buf;
 
diff --git a/zebra/misc_null.c b/zebra/misc_null.c
index b4416e6..18977d2 100644
--- a/zebra/misc_null.c
+++ b/zebra/misc_null.c
@@ -27,16 +27,27 @@
 #include "zebra/interface.h"
 #include "zebra/zebra_fpm.h"
 
-void ifstat_update_proc (void) { return; }
 #ifdef HAVE_SYS_WEAK_ALIAS_PRAGMA
-#pragma weak rtadv_config_write = ifstat_update_proc
-#pragma weak irdp_config_write = ifstat_update_proc
-#pragma weak ifstat_update_sysctl = ifstat_update_proc
+void _quagga_noop (void);
+void _quagga_noop (void) { return; }
+#pragma weak rtadv_config_write = _quagga_noop
+#pragma weak irdp_config_write = _quagga_noop
+#ifdef HAVE_NET_RT_IFLIST
+#pragma weak ifstat_update_sysctl = _quagga_noop
+#endif
+#ifdef HAVE_PROC_NET_DEV
+#pragma weak ifstat_update_proc = _quagga_noop
+#endif
 #else
 void rtadv_config_write (struct vty *vty, struct interface *ifp) { return; }
 void irdp_config_write (struct vty *vty, struct interface *ifp) { return; }
+#ifdef HAVE_PROC_NET_DEV
+void ifstat_update_proc (void) { return; }
+#endif
+#ifdef HAVE_NET_RT_IFLIST
 void ifstat_update_sysctl (void) { return; }
 #endif
+#endif
 
 void
 zfpm_trigger_update (struct route_node *rn, const char *reason)
diff --git a/zebra/router-id.c b/zebra/router-id.c
index 94a2941..bfafc27 100644
--- a/zebra/router-id.c
+++ b/zebra/router-id.c
@@ -245,8 +245,8 @@
   install_element (CONFIG_NODE, &router_id_cmd);
   install_element (CONFIG_NODE, &no_router_id_cmd);
 
-  memset (rid_all_sorted_list, 0, sizeof (rid_all_sorted_list));
-  memset (rid_lo_sorted_list, 0, sizeof (rid_lo_sorted_list));
+  memset (rid_all_sorted_list, 0, sizeof (*rid_all_sorted_list));
+  memset (rid_lo_sorted_list, 0, sizeof (*rid_lo_sorted_list));
   memset (&rid_user_assigned, 0, sizeof (rid_user_assigned));
 
   rid_all_sorted_list->cmp = router_id_cmp;
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 2350070..7e41072 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -1368,80 +1368,6 @@
   return netlink_parse_info (netlink_talk_filter, nl);
 }
 
-/* Routing table change via netlink interface. */
-static int
-netlink_route (int cmd, int family, void *dest, int length, void *gate,
-               int index, int zebra_flags, int table)
-{
-  int ret;
-  int bytelen;
-  struct sockaddr_nl snl;
-  int discard;
-
-  struct
-  {
-    struct nlmsghdr n;
-    struct rtmsg r;
-    char buf[NL_PKT_BUF_SIZE];
-  } req;
-
-  memset (&req, 0, sizeof req - NL_PKT_BUF_SIZE);
-
-  bytelen = (family == AF_INET ? 4 : 16);
-
-  req.n.nlmsg_len = NLMSG_LENGTH (sizeof (struct rtmsg));
-  req.n.nlmsg_flags = NLM_F_CREATE | NLM_F_REQUEST;
-  req.n.nlmsg_type = cmd;
-  req.r.rtm_family = family;
-  req.r.rtm_table = table;
-  req.r.rtm_dst_len = length;
-  req.r.rtm_protocol = RTPROT_ZEBRA;
-  req.r.rtm_scope = RT_SCOPE_UNIVERSE;
-
-  if ((zebra_flags & ZEBRA_FLAG_BLACKHOLE)
-      || (zebra_flags & ZEBRA_FLAG_REJECT))
-    discard = 1;
-  else
-    discard = 0;
-
-  if (cmd == RTM_NEWROUTE)
-    {
-      if (discard)
-        {
-          if (zebra_flags & ZEBRA_FLAG_BLACKHOLE)
-            req.r.rtm_type = RTN_BLACKHOLE;
-          else if (zebra_flags & ZEBRA_FLAG_REJECT)
-            req.r.rtm_type = RTN_UNREACHABLE;
-          else
-            assert (RTN_BLACKHOLE != RTN_UNREACHABLE);  /* false */
-        }
-      else
-        req.r.rtm_type = RTN_UNICAST;
-    }
-
-  if (dest)
-    addattr_l (&req.n, sizeof req, RTA_DST, dest, bytelen);
-
-  if (!discard)
-    {
-      if (gate)
-        addattr_l (&req.n, sizeof req, RTA_GATEWAY, gate, bytelen);
-      if (index > 0)
-        addattr32 (&req.n, sizeof req, RTA_OIF, index);
-    }
-
-  /* Destination netlink address. */
-  memset (&snl, 0, sizeof snl);
-  snl.nl_family = AF_NETLINK;
-
-  /* Talk to netlink socket. */
-  ret = netlink_talk (&req.n, &netlink_cmd);
-  if (ret < 0)
-    return -1;
-
-  return 0;
-}
-
 /* This function takes a nexthop as argument and adds
  * the appropriate netlink attributes to an existing
  * netlink message.
diff --git a/zebra/rt_netlink.h b/zebra/rt_netlink.h
index 0facd49..d8f9db8 100644
--- a/zebra/rt_netlink.h
+++ b/zebra/rt_netlink.h
@@ -41,6 +41,9 @@
 nl_rtproto_to_str (u_char rtproto);
 
 
+extern int interface_lookup_netlink (void);
+extern int netlink_route_read (void);
+
 #endif /* HAVE_NETLINK */
 
 #endif /* _ZEBRA_RT_NETLINK_H */
diff --git a/zebra/rt_socket.c b/zebra/rt_socket.c
index 63470ad..d8c947c 100644
--- a/zebra/rt_socket.c
+++ b/zebra/rt_socket.c
@@ -271,67 +271,6 @@
 
 /* Interface between zebra message and rtm message. */
 static int
-kernel_rtm_ipv6 (int message, struct prefix_ipv6 *dest,
-		 struct in6_addr *gate, int index, int flags)
-{
-  struct sockaddr_in6 *mask;
-  struct sockaddr_in6 sin_dest, sin_mask, sin_gate;
-
-  memset (&sin_dest, 0, sizeof (struct sockaddr_in6));
-  sin_dest.sin6_family = AF_INET6;
-#ifdef SIN6_LEN
-  sin_dest.sin6_len = sizeof (struct sockaddr_in6);
-#endif /* SIN6_LEN */
-
-  memset (&sin_mask, 0, sizeof (struct sockaddr_in6));
-
-  memset (&sin_gate, 0, sizeof (struct sockaddr_in6));
-  sin_gate.sin6_family = AF_INET6;
-#ifdef SIN6_LEN
-  sin_gate.sin6_len = sizeof (struct sockaddr_in6);
-#endif /* SIN6_LEN */
-
-  sin_dest.sin6_addr = dest->prefix;
-
-  if (gate)
-    memcpy (&sin_gate.sin6_addr, gate, sizeof (struct in6_addr));
-
-  /* Under kame set interface index to link local address. */
-#ifdef KAME
-
-#define SET_IN6_LINKLOCAL_IFINDEX(a, i) \
-  do { \
-    (a).s6_addr[2] = ((i) >> 8) & 0xff; \
-    (a).s6_addr[3] = (i) & 0xff; \
-  } while (0)
-
-  if (gate && IN6_IS_ADDR_LINKLOCAL(gate))
-    SET_IN6_LINKLOCAL_IFINDEX (sin_gate.sin6_addr, index);
-#endif /* KAME */
-
-  if (gate && dest->prefixlen == 128)
-    mask = NULL;
-  else
-    {
-      masklen2ip6 (dest->prefixlen, &sin_mask.sin6_addr);
-      sin_mask.sin6_family = AF_INET6;
-#ifdef SIN6_LEN
-      sin_mask.sin6_len = sin6_masklen (sin_mask.sin6_addr);
-#endif /* SIN6_LEN */
-      mask = &sin_mask;
-    }
-
-  return rtm_write (message, 
-		    (union sockunion *) &sin_dest,
-		    (union sockunion *) mask,
-		    gate ? (union sockunion *)&sin_gate : NULL,
-		    index,
-		    flags,
-		    0);
-}
-
-/* Interface between zebra message and rtm message. */
-static int
 kernel_rtm_ipv6_multipath (int cmd, struct prefix *p, struct rib *rib,
 			   int family)
 {
diff --git a/zebra/rtadv.c b/zebra/rtadv.c
index 21ca6da..9a3fd26 100644
--- a/zebra/rtadv.c
+++ b/zebra/rtadv.c
@@ -1201,7 +1201,8 @@
 
   if (argc > 1)
     {
-      if ((isdigit(argv[1][0])) || strncmp (argv[1], "i", 1) == 0)
+      if ((isdigit((unsigned char)argv[1][0]))
+	  || strncmp (argv[1], "i", 1) == 0)
 	{
 	  if ( strncmp (argv[1], "i", 1) == 0)
 	    rp.AdvValidLifetime = UINT32_MAX;
diff --git a/zebra/rtread_netlink.c b/zebra/rtread_netlink.c
index 066e844..7abbc59 100644
--- a/zebra/rtread_netlink.c
+++ b/zebra/rtread_netlink.c
@@ -23,8 +23,7 @@
 #include <zebra.h>
 
 #include "zebra/zserv.h"
-
-extern void netlink_route_read (void);
+#include "rt_netlink.h"
 
 void route_read (void)
 {
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 0750e6e..cc7f48f 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -78,7 +78,7 @@
 /* RPF lookup behaviour */
 static enum multicast_mode ipv4_multicast_mode = MCAST_NO_CONFIG;
 
-static void
+static void __attribute__((format (printf, 4, 5)))
 _rnode_zlog(const char *_func, struct route_node *rn, int priority,
 	    const char *msgfmt, ...)
 {
@@ -1394,8 +1394,9 @@
           if (rib != fib)
             {
               if (IS_ZEBRA_DEBUG_RIB)
-		rnode_debug (rn, "rn %p, removing rib %p", rn, rib);
-	      rib_unlink (rn, rib);
+                rnode_debug (rn, "rn %p, removing rib %p",
+                            (void *)rn, (void *)rib);
+              rib_unlink (rn, rib);
             }
           else
             del = rib;
@@ -1466,7 +1467,7 @@
     {
       if (IS_ZEBRA_DEBUG_RIB)
 	rnode_debug (rn, "Updating existing route, select %p, fib %p",
-		     select, fib);
+                     (void *)select, (void *)fib);
       if (CHECK_FLAG (select->flags, ZEBRA_FLAG_CHANGED))
         {
           if (info->safi == SAFI_UNICAST)
@@ -1511,7 +1512,7 @@
   if (fib)
     {
       if (IS_ZEBRA_DEBUG_RIB)
-	rnode_debug (rn, "Removing existing route, fib %p", fib);
+        rnode_debug (rn, "Removing existing route, fib %p", (void *)fib);
 
       if (info->safi == SAFI_UNICAST)
         zfpm_trigger_update (rn, "removing existing route");
@@ -1532,7 +1533,7 @@
   if (select)
     {
       if (IS_ZEBRA_DEBUG_RIB)
-	rnode_debug (rn, "Adding route, select %p", select);
+        rnode_debug (rn, "Adding route, select %p", (void *)select);
 
       if (info->safi == SAFI_UNICAST)
         zfpm_trigger_update (rn, "new route selected");
@@ -1550,13 +1551,13 @@
   if (del)
     {
       if (IS_ZEBRA_DEBUG_RIB)
-        rnode_debug (rn, "Deleting fib %p, rn %p", del, rn);
+        rnode_debug (rn, "Deleting fib %p, rn %p", (void *)del, (void *)rn);
       rib_unlink (rn, del);
     }
 
 end:
   if (IS_ZEBRA_DEBUG_RIB_Q)
-    rnode_debug (rn, "rn %p dequeued", rn);
+    rnode_debug (rn, "rn %p dequeued", (void *)rn);
 
   /*
    * Check if the dest can be deleted now.
@@ -1651,7 +1652,7 @@
 	{
 	  if (IS_ZEBRA_DEBUG_RIB_Q)
 	    rnode_debug (rn, "rn %p is already queued in sub-queue %u",
-			 rn, qindex);
+			 (void *)rn, qindex);
 	  continue;
 	}
 
@@ -1662,7 +1663,7 @@
 
       if (IS_ZEBRA_DEBUG_RIB_Q)
 	rnode_debug (rn, "queued rn %p into sub-queue %u",
-		     rn, qindex);
+                     (void *)rn, qindex);
     }
 }
 
@@ -1676,7 +1677,7 @@
   if (!rnode_to_ribs (rn))
     {
       zlog_debug ("%s: called for route_node (%p, %d) with no ribs",
-                  __func__, rn, rn->lock);
+                  __func__, (void *)rn, rn->lock);
       zlog_backtrace(LOG_DEBUG);
       return;
     }
@@ -1706,7 +1707,7 @@
   rib_meta_queue_add (zebra->mq, rn);
 
   if (IS_ZEBRA_DEBUG_RIB_Q)
-    rnode_debug (rn, "rn %p queued", rn);
+    rnode_debug (rn, "rn %p queued", (void *)rn);
 
   return;
 }
@@ -1807,7 +1808,7 @@
   assert (rib && rn);
   
   if (IS_ZEBRA_DEBUG_RIB)
-    rnode_debug (rn, "rn %p, rib %p", rn, rib);
+    rnode_debug (rn, "rn %p, rib %p", (void *)rn, (void *)rib);
 
   dest = rib_dest_from_rnode (rn);
   if (!dest)
@@ -1840,7 +1841,7 @@
   if (CHECK_FLAG (rib->status, RIB_ENTRY_REMOVED))
     {
       if (IS_ZEBRA_DEBUG_RIB)
-        rnode_debug (rn, "rn %p, un-removed rib %p", rn, rib);
+        rnode_debug (rn, "rn %p, un-removed rib %p", (void *)rn, (void *)rib);
 
       UNSET_FLAG (rib->status, RIB_ENTRY_REMOVED);
       return;
@@ -1865,7 +1866,7 @@
   assert (rn && rib);
 
   if (IS_ZEBRA_DEBUG_RIB)
-    rnode_debug (rn, "rn %p, rib %p", rn, rib);
+    rnode_debug (rn, "rn %p, rib %p", (void *)rn, (void *)rib);
 
   dest = rib_dest_from_rnode (rn);
 
@@ -1889,7 +1890,7 @@
 rib_delnode (struct route_node *rn, struct rib *rib)
 {
   if (IS_ZEBRA_DEBUG_RIB)
-    rnode_debug (rn, "rn %p, rib %p, removing", rn, rib);
+    rnode_debug (rn, "rn %p, rib %p, removing", (void *)rn, (void *)rib);
   SET_FLAG (rib->status, RIB_ENTRY_REMOVED);
   rib_queue_add (&zebrad, rn);
 }
@@ -1983,14 +1984,16 @@
 
   /* Link new rib to node.*/
   if (IS_ZEBRA_DEBUG_RIB)
-    zlog_debug ("%s: calling rib_addnode (%p, %p)", __func__, rn, rib);
+    zlog_debug ("%s: calling rib_addnode (%p, %p)",
+               __func__, (void *)rn, (void *)rib);
   rib_addnode (rn, rib);
   
   /* Free implicit route.*/
   if (same)
   {
     if (IS_ZEBRA_DEBUG_RIB)
-      zlog_debug ("%s: calling rib_delnode (%p, %p)", __func__, rn, rib);
+      zlog_debug ("%s: calling rib_delnode (%p, %p)",
+                 __func__, (void *)rn, (void *)rib);
     rib_delnode (rn, same);
   }
   
@@ -2012,7 +2015,8 @@
   int recursing;
 
   inet_ntop (p->family, &p->u.prefix, straddr, INET6_ADDRSTRLEN);
-  zlog_debug ("%s: dumping RIB entry %p for %s/%d", func, rib, straddr, p->prefixlen);
+  zlog_debug ("%s: dumping RIB entry %p for %s/%d", func, (void *)rib,
+              straddr, p->prefixlen);
   zlog_debug
   (
     "%s: refcnt == %lu, uptime == %lu, type == %u, table == %d",
@@ -2097,8 +2101,8 @@
     (
       "%s: rn %p, rib %p: %s, %s",
       __func__,
-      rn,
-      rib,
+      (void *)rn,
+      (void *)rib,
       (CHECK_FLAG (rib->status, RIB_ENTRY_REMOVED) ? "removed" : "NOT removed"),
       (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED) ? "selected" : "NOT selected")
     );
@@ -2210,7 +2214,7 @@
   if (IS_ZEBRA_DEBUG_RIB)
   {
     zlog_debug ("%s: called rib_addnode (%p, %p) on new RIB entry",
-      __func__, rn, rib);
+                __func__, (void *)rn, (void *)rib);
     rib_dump (p, rib);
   }
 
@@ -2220,7 +2224,7 @@
     if (IS_ZEBRA_DEBUG_RIB)
     {
       zlog_debug ("%s: calling rib_delnode (%p, %p) on existing RIB entry",
-        __func__, rn, same);
+                  __func__, (void *)rn, (void *)same);
       rib_dump (p, same);
     }
     rib_delnode (rn, same);
@@ -2771,7 +2775,7 @@
   if (IS_ZEBRA_DEBUG_RIB)
   {
     zlog_debug ("%s: called rib_addnode (%p, %p) on new RIB entry",
-      __func__, rn, rib);
+      __func__, (void *)rn, (void *)rib);
     rib_dump (p, rib);
   }
 
@@ -2781,7 +2785,7 @@
     if (IS_ZEBRA_DEBUG_RIB)
     {
       zlog_debug ("%s: calling rib_delnode (%p, %p) on existing RIB entry",
-        __func__, rn, same);
+        __func__, (void *)rn, (void *)same);
       rib_dump (p, same);
     }
     rib_delnode (rn, same);
diff --git a/zebra/zserv.c b/zebra/zserv.c
index afd722a..432c318 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -1558,7 +1558,7 @@
 
   zebra_event (ZEBRA_SERV, accept_sock, NULL);
 }
-#endif /* HAVE_TCP_ZEBRA */
+#else /* HAVE_TCP_ZEBRA */
 
 /* For sockaddr_un. */
 #include <sys/un.h>
@@ -1624,6 +1624,7 @@
 
   zebra_event (ZEBRA_SERV, sock, NULL);
 }
+#endif /* HAVE_TCP_ZEBRA */
 
 
 static void