Merge 'patch-tracking/4/proposed/netdef-solaris' into accepted
diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c
index d413e5b..ef19bc4 100644
--- a/bgpd/bgp_attr.c
+++ b/bgpd/bgp_attr.c
@@ -1817,7 +1817,7 @@
   /* same goes for as4_aggregator */
   struct aspath *as4_path = NULL;
   as_t as4_aggregator = 0;
-  struct in_addr as4_aggregator_addr = { 0 };
+  struct in_addr as4_aggregator_addr = { .s_addr = 0 };
 
   /* Initialize bitmap. */
   memset (seen, 0, BGP_ATTR_BITMAP_SIZE);
diff --git a/bgpd/bgp_snmp.c b/bgpd/bgp_snmp.c
index 0f4aeec..6a57834 100644
--- a/bgpd/bgp_snmp.c
+++ b/bgpd/bgp_snmp.c
@@ -121,7 +121,7 @@
 oid bgp_trap_oid [] = { BGP4MIB, 0 };
 
 /* IP address 0.0.0.0. */
-static struct in_addr bgp_empty_addr = {0};
+static struct in_addr bgp_empty_addr = { .s_addr = 0 };
 
 /* Hook functions. */
 static u_char *bgpVersion (struct variable *, oid [], size_t *, int,
diff --git a/configure.ac b/configure.ac
index 747a0c6..3003e62 100755
--- a/configure.ac
+++ b/configure.ac
@@ -792,7 +792,7 @@
 	strtol strtoul strlcat strlcpy \
 	daemon snprintf vsnprintf \
 	if_nametoindex if_indextoname getifaddrs \
-	uname fcntl])
+	uname fcntl getgrouplist])
 
 AC_CHECK_FUNCS(setproctitle, ,
   [AC_CHECK_LIB(util, setproctitle, 
diff --git a/isisd/isis_dlpi.c b/isisd/isis_dlpi.c
index 0a82718..b583d10 100644
--- a/isisd/isis_dlpi.c
+++ b/isisd/isis_dlpi.c
@@ -174,7 +174,7 @@
   dl_ok_ack_t *doa = (dl_ok_ack_t *)dlpi_ctl;
 
   retv = dlpirctl (fd);
-  if (retv < DL_OK_ACK_SIZE || doa->dl_primitive != DL_OK_ACK ||
+  if (retv < (ssize_t)DL_OK_ACK_SIZE || doa->dl_primitive != DL_OK_ACK ||
     doa->dl_correct_primitive != oprim)
     {
       return -1;
@@ -196,7 +196,7 @@
   /* Info_req uses M_PCPROTO. */
   dlpisend (fd, &dir, sizeof (dir), NULL, 0, RS_HIPRI);
   retv = dlpirctl (fd);
-  if (retv < DL_INFO_ACK_SIZE || dlpi_ctl[0] != DL_INFO_ACK)
+  if (retv < (ssize_t)DL_INFO_ACK_SIZE || dlpi_ctl[0] != DL_INFO_ACK)
     return -1;
   else
     return retv;
@@ -251,7 +251,7 @@
   dlpisend (fd, &dbr, sizeof (dbr), NULL, 0, 0);
 
   retv = dlpirctl (fd);
-  if (retv < DL_BIND_ACK_SIZE || dba->dl_primitive != DL_BIND_ACK)
+  if (retv < (ssize_t)DL_BIND_ACK_SIZE || dba->dl_primitive != DL_BIND_ACK)
     return -1;
   else
     return 0;
@@ -287,12 +287,13 @@
   dlpisend (fd, &dpar, sizeof (dpar), NULL, 0, 0);
 
   retv = dlpirctl (fd);
-  if (retv < DL_PHYS_ADDR_ACK_SIZE || dpaa->dl_primitive != DL_PHYS_ADDR_ACK)
+  if (retv < (ssize_t)DL_PHYS_ADDR_ACK_SIZE
+      || dpaa->dl_primitive != DL_PHYS_ADDR_ACK)
     return -1;
 
   if (dpaa->dl_addr_offset < DL_PHYS_ADDR_ACK_SIZE ||
     dpaa->dl_addr_length != ETHERADDRL ||
-    dpaa->dl_addr_offset + dpaa->dl_addr_length > retv)
+    dpaa->dl_addr_offset + dpaa->dl_addr_length > (size_t)retv)
     return -1;
 
   bcopy((char *)dpaa + dpaa->dl_addr_offset, addr, ETHERADDRL);
@@ -302,7 +303,7 @@
 static int
 open_dlpi_dev (struct isis_circuit *circuit)
 {
-  int fd, unit, retval;
+  int fd = -1, unit, retval;
   char devpath[MAXPATHLEN];
   dl_info_ack_t *dia = (dl_info_ack_t *)dlpi_ctl;
   ssize_t acklen;
@@ -403,8 +404,8 @@
     case DL_100BT:
       break;
     default:
-      zlog_warn ("%s: unexpected mac type on %s: %d", __func__,
-	circuit->interface->name, dia->dl_mac_type);
+      zlog_warn ("%s: unexpected mac type on %s: %lld", __func__,
+	circuit->interface->name, (long long)dia->dl_mac_type);
       close (fd);
       return ISIS_WARNING;
     }
@@ -556,13 +557,13 @@
       return ISIS_WARNING;
     }
 
-  if (ctlbuf.len < DL_UNITDATA_IND_SIZE ||
+  if (ctlbuf.len < (ssize_t)DL_UNITDATA_IND_SIZE ||
     dui->dl_primitive != DL_UNITDATA_IND)
     return ISIS_WARNING;
 
   if (dui->dl_src_addr_length != ETHERADDRL + 2 ||
     dui->dl_src_addr_offset < DL_UNITDATA_IND_SIZE ||
-    dui->dl_src_addr_offset + dui->dl_src_addr_length > ctlbuf.len)
+    dui->dl_src_addr_offset + dui->dl_src_addr_length > (size_t)ctlbuf.len)
     return ISIS_WARNING;
 
   memcpy (ssnpa, (char *)dui + dui->dl_src_addr_offset +
@@ -588,9 +589,9 @@
   int buflen;
 
   buflen = stream_get_endp (circuit->snd_stream) + LLC_LEN;
-  if (buflen > sizeof (sock_buff))
+  if ((size_t)buflen > sizeof (sock_buff))
     {
-      zlog_warn ("isis_send_pdu_bcast: sock_buff size %lu is less than "
+      zlog_warn ("isis_send_pdu_bcast: sock_buff size %zu is less than "
 		 "output pdu size %d on circuit %s",
 		 sizeof (sock_buff), buflen, circuit->interface->name);
       return ISIS_WARNING;
diff --git a/isisd/topology/random.c b/isisd/topology/random.c
index c49c082..2c457c5 100644
--- a/isisd/topology/random.c
+++ b/isisd/topology/random.c
@@ -7,6 +7,7 @@
 /*                                                                   */
 /*********************************************************************/
 
+#include <zebra.h>
 #include <sys/types.h>
 #include <sys/times.h>
 
diff --git a/isisd/topology/spacyc.c b/isisd/topology/spacyc.c
index 8531447..91a4799 100644
--- a/isisd/topology/spacyc.c
+++ b/isisd/topology/spacyc.c
@@ -1,3 +1,4 @@
+#include <zebra.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
diff --git a/isisd/topology/spgrid.c b/isisd/topology/spgrid.c
index 40147fb..22cfa7b 100644
--- a/isisd/topology/spgrid.c
+++ b/isisd/topology/spgrid.c
@@ -1,11 +1,11 @@
+#include <zebra.h>
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include "random.c"
 
-#include <zebra.h>
-
 #include "thread.h"
 #include "vty.h"
 #include "log.h"
diff --git a/isisd/topology/sprand.c b/isisd/topology/sprand.c
index 28b58b3..1c1eb19 100644
--- a/isisd/topology/sprand.c
+++ b/isisd/topology/sprand.c
@@ -1,3 +1,5 @@
+#include <zebra.h>
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
diff --git a/lib/getopt.c b/lib/getopt.c
index 064909d..7a58a8a 100644
--- a/lib/getopt.c
+++ b/lib/getopt.c
@@ -30,10 +30,6 @@
 # define _NO_PROTO
 #endif
 
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
 #include <zebra.h>
 
 #if !defined __STDC__ || !__STDC__
diff --git a/lib/getopt1.c b/lib/getopt1.c
index fa76674..bd3099e 100644
--- a/lib/getopt1.c
+++ b/lib/getopt1.c
@@ -20,10 +20,6 @@
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
    USA.  */
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
 #include <zebra.h>
 #include "getopt.h"
 
diff --git a/lib/privs.c b/lib/privs.c
index ff0be2f..0ca8783 100644
--- a/lib/privs.c
+++ b/lib/privs.c
@@ -622,6 +622,41 @@
   return zprivs_null_state;
 }
 
+#ifndef HAVE_GETGROUPLIST
+/* Solaris 11 has no getgrouplist() */
+static int
+getgrouplist(const char *user, gid_t group, gid_t *groups, int *ngroups)
+{
+  struct group *grp;
+  size_t usridx;
+  int pos = 0, ret;
+
+  if (pos < *ngroups)
+    groups[pos] = group;
+  pos++;
+
+  setgrent();
+  while ((grp = getgrent()))
+    {
+      if (grp->gr_gid == group)
+        continue;
+      for (usridx = 0; grp->gr_mem[usridx] != NULL; usridx++)
+        if (!strcmp (grp->gr_mem[usridx], user))
+          {
+            if (pos < *ngroups)
+              groups[pos] = grp->gr_gid;
+            pos++;
+            break;
+          }
+    }
+  endgrent();
+
+  ret = (pos <= *ngroups) ? pos : -1;
+  *ngroups = pos;
+  return ret;
+}
+#endif /* HAVE_GETGROUPLIST */
+
 void
 zprivs_init(struct zebra_privs_t *zprivs)
 {
diff --git a/lib/stream.c b/lib/stream.c
index 9c26fea..ca1a40f 100644
--- a/lib/stream.c
+++ b/lib/stream.c
@@ -20,8 +20,8 @@
  * 02111-1307, USA.  
  */
 
-#include <stddef.h>
 #include <zebra.h>
+#include <stddef.h>
 
 #include "stream.h"
 #include "memory.h"
diff --git a/lib/workqueue.c b/lib/workqueue.c
index 9fc8931..b1a5d5b 100644
--- a/lib/workqueue.c
+++ b/lib/workqueue.c
@@ -21,7 +21,7 @@
  * 02111-1307, USA.  
  */
 
-#include <lib/zebra.h>
+#include <zebra.h>
 #include "thread.h"
 #include "memory.h"
 #include "workqueue.h"
diff --git a/lib/zebra.h b/lib/zebra.h
index 1ee5107..fe34be7 100644
--- a/lib/zebra.h
+++ b/lib/zebra.h
@@ -27,7 +27,6 @@
 
 #ifdef SUNOS_5
 #define _XPG4_2
-#define __EXTENSIONS__
 typedef unsigned int    u_int32_t;
 typedef unsigned short  u_int16_t;
 typedef unsigned char   u_int8_t;
diff --git a/ospf6d/ospf6_snmp.c b/ospf6d/ospf6_snmp.c
index ef44e4c..307d420 100644
--- a/ospf6d/ospf6_snmp.c
+++ b/ospf6d/ospf6_snmp.c
@@ -628,7 +628,7 @@
   int len;
   oid *offset;
   int offsetlen;
-  struct ospf6_area *oa;
+  struct ospf6_area *oa = NULL;
   struct listnode *node;
   struct interface *iif;
   struct ospf6_interface *oi = NULL;
diff --git a/ospfclient/Makefile.am b/ospfclient/Makefile.am
index 8a3ad21..1fca431 100644
--- a/ospfclient/Makefile.am
+++ b/ospfclient/Makefile.am
@@ -5,6 +5,7 @@
 
 lib_LTLIBRARIES = libospfapiclient.la
 libospfapiclient_la_LDFLAGS = -version-info 0:0:0
+libospfapiclient_la_LIBADD = ../ospfd/libospf.la ../lib/libzebra.la
 
 sbin_PROGRAMS = ospfclient
 
diff --git a/ospfd/Makefile.am b/ospfd/Makefile.am
index 40f2cfe..f21f507 100644
--- a/ospfd/Makefile.am
+++ b/ospfd/Makefile.am
@@ -7,6 +7,7 @@
 
 lib_LTLIBRARIES = libospf.la
 libospf_la_LDFLAGS = -version-info 0:0:0
+libospf_la_LIBADD = ../lib/libzebra.la
 
 sbin_PROGRAMS = ospfd
 
diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c
index 73111e8..9a8f1d6 100644
--- a/ospfd/ospf_packet.c
+++ b/ospfd/ospf_packet.c
@@ -644,8 +644,8 @@
   struct listnode *node;
 #ifdef WANT_OSPF_WRITE_FRAGMENT
   static u_int16_t ipid = 0;
-#endif /* WANT_OSPF_WRITE_FRAGMENT */
   u_int16_t maxdatasize;
+#endif /* WANT_OSPF_WRITE_FRAGMENT */
 #define OSPF_WRITE_IPHL_SHIFT 2
   
   ospf->t_write = NULL;
@@ -659,7 +659,6 @@
   /* seed ipid static with low order bits of time */
   if (ipid == 0)
     ipid = (time(NULL) & 0xffff);
-#endif /* WANT_OSPF_WRITE_FRAGMENT */
 
   /* convenience - max OSPF data per packet,
    * and reliability - not more data, than our
@@ -667,6 +666,7 @@
    */
   maxdatasize = MIN (oi->ifp->mtu, ospf->maxsndbuflen) -
     sizeof (struct ip);
+#endif /* WANT_OSPF_WRITE_FRAGMENT */
   
   /* Get one packet from queue. */
   op = ospf_fifo_head (oi->obuf);
diff --git a/ospfd/ospf_snmp.c b/ospfd/ospf_snmp.c
index 604766d..1636153 100644
--- a/ospfd/ospf_snmp.c
+++ b/ospfd/ospf_snmp.c
@@ -213,7 +213,7 @@
 oid ospf_trap_oid [] = { OSPF2MIB, 16, 2 }; /* Not reverse mappable! */
 
 /* IP address 0.0.0.0. */
-static struct in_addr ospf_empty_addr = {0};
+static struct in_addr ospf_empty_addr = { .s_addr = 0 };
 
 /* Hook functions. */
 static u_char *ospfGeneralGroup (struct variable *, oid *, size_t *,
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index 880edb9..69c04ec 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -20,10 +20,10 @@
   $QuaggaId: $Format:%an, %ai, %h$ $
 */
 
-#include <sys/ioctl.h>
-
 #include <zebra.h>
 
+#include <sys/ioctl.h>
+
 #include "command.h"
 #include "if.h"
 #include "prefix.h"
diff --git a/pimd/pim_igmp_join.c b/pimd/pim_igmp_join.c
index 151b2af..62e32c6 100644
--- a/pimd/pim_igmp_join.c
+++ b/pimd/pim_igmp_join.c
@@ -20,6 +20,8 @@
   $QuaggaId: $Format:%an, %ai, %h$ $
 */
 
+#include <zebra.h>
+
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <string.h>
diff --git a/pimd/pim_int.c b/pimd/pim_int.c
index 0bdd772..2080751 100644
--- a/pimd/pim_int.c
+++ b/pimd/pim_int.c
@@ -20,6 +20,8 @@
   $QuaggaId: $Format:%an, %ai, %h$ $
 */
 
+#include <zebra.h>
+
 #include <string.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
diff --git a/pimd/pim_signals.c b/pimd/pim_signals.c
index afd0259..3549331 100644
--- a/pimd/pim_signals.c
+++ b/pimd/pim_signals.c
@@ -20,9 +20,10 @@
   $QuaggaId: $Format:%an, %ai, %h$ $
 */
 
+#include <zebra.h>
+
 #include <signal.h>
 
-#include <zebra.h>
 #include "sigevent.h"
 #include "memory.h"
 #include "log.h"
diff --git a/pimd/pim_sock.c b/pimd/pim_sock.c
index 4816c56..2bb48f7 100644
--- a/pimd/pim_sock.c
+++ b/pimd/pim_sock.c
@@ -20,6 +20,7 @@
   $QuaggaId: $Format:%an, %ai, %h$ $
 */
 
+#include <zebra.h>
 #include "pim_mroute.h"
 
 #include <sys/types.h>
@@ -31,7 +32,6 @@
 #include <netdb.h>
 #include <errno.h>
 
-#include <zebra.h>
 #include "log.h"
 #include "privs.h"
 
@@ -80,9 +80,9 @@
   /* Needed to obtain destination address from recvmsg() */
   {
 #if defined(HAVE_IP_PKTINFO)
-    /* Linux IP_PKTINFO */
+    /* Linux and Solaris IP_PKTINFO */
     int opt = 1;
-    if (setsockopt(fd, SOL_IP, IP_PKTINFO, &opt, sizeof(opt))) {
+    if (setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &opt, sizeof(opt))) {
       zlog_warn("Could not set IP_PKTINFO on socket fd=%d: errno=%d: %s",
 		fd, errno, safe_strerror(errno));
     }
@@ -306,7 +306,7 @@
        cmsg = CMSG_NXTHDR(&msgh,cmsg)) {
 
 #ifdef HAVE_IP_PKTINFO
-    if ((cmsg->cmsg_level == SOL_IP) && (cmsg->cmsg_type == IP_PKTINFO)) {
+    if ((cmsg->cmsg_level == IPPROTO_IP) && (cmsg->cmsg_type == IP_PKTINFO)) {
       struct in_pktinfo *i = (struct in_pktinfo *) CMSG_DATA(cmsg);
       if (to)
 	((struct sockaddr_in *) to)->sin_addr = i->ipi_addr;
diff --git a/pimd/pim_ssmpingd.c b/pimd/pim_ssmpingd.c
index 82e0722..d564bf5 100644
--- a/pimd/pim_ssmpingd.c
+++ b/pimd/pim_ssmpingd.c
@@ -110,9 +110,9 @@
   /* Needed to obtain destination address from recvmsg() */
   {
 #if defined(HAVE_IP_PKTINFO)
-    /* Linux IP_PKTINFO */
+    /* Linux and Solaris IP_PKTINFO */
     int opt = 1;
-    if (setsockopt(fd, SOL_IP, IP_PKTINFO, &opt, sizeof(opt))) {
+    if (setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &opt, sizeof(opt))) {
       zlog_warn("%s: could not set IP_PKTINFO on socket fd=%d: errno=%d: %s",
 		__PRETTY_FUNCTION__, fd, errno, safe_strerror(errno));
     }
diff --git a/pimd/pim_static.c b/pimd/pim_static.c
index f2b8e85..e43c59a 100644
--- a/pimd/pim_static.c
+++ b/pimd/pim_static.c
@@ -20,6 +20,8 @@
   $QuaggaId: $Format:%an, %ai, %h$ $
 */
 
+#include <zebra.h>
+
 #include "pim_static.h"
 #include "pim_time.h"
 #include "pim_str.h"
@@ -40,7 +42,7 @@
 
    s_route = XCALLOC(MTYPE_PIM_STATIC_ROUTE, sizeof(*s_route));
    if (!s_route) {
-     zlog_err("PIM XCALLOC(%lu) failure", sizeof(*s_route));
+     zlog_err("PIM XCALLOC(%u) failure", sizeof(*s_route));
      return 0;
    }
    return s_route;
diff --git a/pimd/pim_str.c b/pimd/pim_str.c
index af5a184..3a8353c 100644
--- a/pimd/pim_str.c
+++ b/pimd/pim_str.c
@@ -20,12 +20,12 @@
   $QuaggaId: $Format:%an, %ai, %h$ $
 */
 
+#include <zebra.h>
+
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
 
-#include <zebra.h>
-
 #include "log.h"
 
 #include "pim_str.h"
diff --git a/pimd/pim_time.c b/pimd/pim_time.c
index 097b470..4e5832c 100644
--- a/pimd/pim_time.c
+++ b/pimd/pim_time.c
@@ -20,11 +20,12 @@
   $QuaggaId: $Format:%an, %ai, %h$ $
 */
 
+#include <zebra.h>
+
 #include <string.h>
 #include <sys/time.h>
 #include <time.h>
 
-#include <zebra.h>
 #include "log.h"
 #include "thread.h"
 
diff --git a/pimd/pim_version.c b/pimd/pim_version.c
index fe7e563..f3a5ee3 100644
--- a/pimd/pim_version.c
+++ b/pimd/pim_version.c
@@ -20,6 +20,8 @@
   $QuaggaId: $Format:%an, %ai, %h$ $
 */
 
+#include <zebra.h>
+
 #include "pim_version.h"
 
 const char * const PIMD_VERSION = PIMD_VERSION_STR;
diff --git a/tests/prng.c b/tests/prng.c
index 8d78ea5..bdcfb07 100644
--- a/tests/prng.c
+++ b/tests/prng.c
@@ -23,6 +23,8 @@
  * 02111-1307, USA.
  */
 
+#include <zebra.h>
+
 #include <assert.h>
 #include <stdlib.h>
 #include <string.h>
diff --git a/tests/test-cli.c b/tests/test-cli.c
index 3db44ee..6fab6d5 100644
--- a/tests/test-cli.c
+++ b/tests/test-cli.c
@@ -20,6 +20,8 @@
  * 02111-1307, USA.
  */
 
+#include <zebra.h>
+
 #include "common-cli.h"
 
 DUMMY_DEFUN(cmd0,  "arg ipv4 A.B.C.D");
diff --git a/tests/test-timer-correctness.c b/tests/test-timer-correctness.c
index 47c0b73..e523929 100644
--- a/tests/test-timer-correctness.c
+++ b/tests/test-timer-correctness.c
@@ -23,11 +23,11 @@
  * 02111-1307, USA.
  */
 
+#include <zebra.h>
+
 #include <stdio.h>
 #include <unistd.h>
 
-#include <zebra.h>
-
 #include "memory.h"
 #include "pqueue.h"
 #include "prng.h"
diff --git a/tests/test-timer-performance.c b/tests/test-timer-performance.c
index a529a5c..ee45ede 100644
--- a/tests/test-timer-performance.c
+++ b/tests/test-timer-performance.c
@@ -22,11 +22,12 @@
  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  * 02111-1307, USA.
  */
-#include <stdio.h>
-#include <unistd.h>
 
 #include <zebra.h>
 
+#include <stdio.h>
+#include <unistd.h>
+
 #include "thread.h"
 #include "pqueue.h"
 #include "prng.h"
diff --git a/zebra/Makefile.am b/zebra/Makefile.am
index 01779c9..96dc6f0 100644
--- a/zebra/Makefile.am
+++ b/zebra/Makefile.am
@@ -39,7 +39,8 @@
 noinst_HEADERS = \
 	connected.h ioctl.h rib.h rt.h zserv.h redistribute.h debug.h rtadv.h \
 	interface.h ipforward.h irdp.h router-id.h kernel_socket.h \
-	rt_netlink.h zebra_fpm.h zebra_fpm_private.h
+	rt_netlink.h zebra_fpm.h zebra_fpm_private.h \
+	ioctl_solaris.h
 
 zebra_LDADD = $(otherobj) ../lib/libzebra.la $(LIBCAP)
 
diff --git a/zebra/if_ioctl_solaris.c b/zebra/if_ioctl_solaris.c
index 3f33f74..50b4aca 100644
--- a/zebra/if_ioctl_solaris.c
+++ b/zebra/if_ioctl_solaris.c
@@ -33,15 +33,14 @@
 #include "vrf.h"
 
 #include "zebra/interface.h"
+#include "zebra/ioctl_solaris.h"
 #include "zebra/rib.h"
 
-void lifreq_set_name (struct lifreq *, const char *);
-int if_get_flags_direct (const char *, uint64_t *, unsigned int af);
 static int if_get_addr (struct interface *, struct sockaddr *, const char *);
 static void interface_info_ioctl (struct interface *);
 extern struct zebra_privs_t zserv_privs;
 
-int
+static int
 interface_list_ioctl (int af)
 {
   int ret;
@@ -210,7 +209,7 @@
 }
 
 /* Get interface's index by ioctl. */
-int
+static int
 if_get_index (struct interface *ifp)
 {
   int ret;
diff --git a/zebra/ioctl_solaris.c b/zebra/ioctl_solaris.c
index 16934f0..12737cb 100644
--- a/zebra/ioctl_solaris.c
+++ b/zebra/ioctl_solaris.c
@@ -32,6 +32,7 @@
 #include "zebra/rib.h"
 #include "zebra/rt.h"
 #include "zebra/interface.h"
+#include "zebra/ioctl_solaris.h"
 
 extern struct zebra_privs_t zserv_privs;
 
@@ -309,7 +310,7 @@
 void
 if_get_flags (struct interface *ifp)
 {
-  int ret4, ret6;
+  int ret4 = 0, ret6 = 0;
   uint64_t newflags = 0;
   uint64_t tmpflags;
 
@@ -410,7 +411,7 @@
   char addrbuf[PREFIX_STRLEN];
 
   zlog_warn ("Can't set %s on interface %s",
-             prefix2str(ifc->address->prefix, addrbuf, sizeof(addrbuf)),
+             prefix2str(ifc->address, addrbuf, sizeof(addrbuf)),
              ifp->name);
 
   return 0;
@@ -423,7 +424,7 @@
   char addrbuf[PREFIX_STRLEN];
 
   zlog_warn ("Can't delete %s on interface %s",
-             prefix2str(ifc->address->prefix, addrbuf, sizeof(addrbuf)),
+             prefix2str(ifc->address, addrbuf, sizeof(addrbuf)),
              ifp->name);
 
   return 0;
diff --git a/zebra/ioctl_solaris.h b/zebra/ioctl_solaris.h
new file mode 100644
index 0000000..188986b
--- /dev/null
+++ b/zebra/ioctl_solaris.h
@@ -0,0 +1,29 @@
+/*
+ * Interface looking up by ioctl () on Solaris.
+ * Copyright (C) 1999 Kunihiro Ishiguro
+ *
+ * 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 _ZEBRA_IF_IOCTL_SOLARIS_H
+#define _ZEBRA_IF_IOCTL_SOLARIS_H
+
+void lifreq_set_name (struct lifreq *, const char *);
+int if_get_flags_direct (const char *, uint64_t *, unsigned int af);
+
+#endif /* _ZEBRA_IF_IOCTL_SOLARIS_H */
diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c
index fd0d8fd..eded2bb 100644
--- a/zebra/kernel_socket.c
+++ b/zebra/kernel_socket.c
@@ -70,6 +70,12 @@
 #define ROUNDUP(a)	RT_ROUNDUP(a)
 #endif /* defined(RT_ROUNDUP) */
 
+#if defined(SUNOS_5)
+/* Solaris has struct sockaddr_in[6] definitions at 16 / 32 bytes size,
+ * so the whole concept doesn't really apply. */
+#define ROUNDUP(a)      (a)
+#endif
+
 /*
  * If ROUNDUP has not yet been defined in terms of platform-provided
  * defines, attempt to cope with heuristics.
@@ -134,6 +140,8 @@
 static inline void
 rta_copy (union sockunion *dest, caddr_t src) {
   int len;
+  if (!dest)
+    return;
 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
   len = (((struct sockaddr *)src)->sa_len > sizeof (*dest)) ?
             sizeof (*dest) : ((struct sockaddr *)src)->sa_len ;
@@ -148,8 +156,7 @@
   if ((RTMADDRS) & (RTA)) \
     { \
       int len = SAROUNDUP ((PNT)); \
-      if ( ((DEST) != NULL) && \
-           af_check (((struct sockaddr *)(PNT))->sa_family)) \
+      if (af_check (((struct sockaddr *)(PNT))->sa_family)) \
         rta_copy((DEST), (PNT)); \
       (PNT) += len; \
     }
@@ -157,8 +164,7 @@
   if ((RTMADDRS) & (RTA)) \
     { \
       int len = SAROUNDUP ((PNT)); \
-      if ((DEST) != NULL) \
-        rta_copy((DEST), (PNT)); \
+      rta_copy((DEST), (PNT)); \
       (PNT) += len; \
     }
 
@@ -732,7 +738,9 @@
       /* Unset interface index from link-local address when IPv6 stack
 	 is KAME. */
       if (IN6_IS_ADDR_LINKLOCAL (&addr.sin6.sin6_addr))
-	SET_IN6_LINKLOCAL_IFINDEX (addr.sin6.sin6_addr, 0);
+        {
+          SET_IN6_LINKLOCAL_IFINDEX (addr.sin6.sin6_addr, 0);
+        }
 
       if (ifam->ifam_type == RTM_NEWADDR)
 	connected_add_ipv6 (ifp, flags, &addr.sin6.sin6_addr, 
@@ -1152,7 +1160,8 @@
   zlog_debug ("Kernel: Len: %d Type: %s", rtm->rtm_msglen, lookup (rtm_type_str, rtm->rtm_type));
   rtm_flag_dump (rtm->rtm_flags);
   zlog_debug ("Kernel: message seq %d", rtm->rtm_seq);
-  zlog_debug ("Kernel: pid %d, rtm_addrs 0x%x", rtm->rtm_pid, rtm->rtm_addrs);
+  zlog_debug ("Kernel: pid %lld, rtm_addrs 0x%x",
+              (long long)rtm->rtm_pid, rtm->rtm_addrs);
 }
 
 /* This is pretty gross, better suggestions welcome -- mhandler */
diff --git a/zebra/rt_socket.c b/zebra/rt_socket.c
index bf21ca9..a7ef457 100644
--- a/zebra/rt_socket.c
+++ b/zebra/rt_socket.c
@@ -41,6 +41,7 @@
                       union sockunion *mask, union sockunion *gate,
                       unsigned int index, int zebra_flags, int metric);
 
+#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
 /* Adjust netmask socket length. Return value is a adjusted sin_len
    value. */
 static int
@@ -63,6 +64,7 @@
     len--;
   return len;
 }
+#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
 
 /* Interface between zebra message and rtm message. */
 static int
@@ -244,6 +246,7 @@
 
 #ifdef HAVE_IPV6
 
+#ifdef SIN6_LEN
 /* Calculate sin6_len value for netmask socket value. */
 static int
 sin6_masklen (struct in6_addr mask)
@@ -266,6 +269,7 @@
 
   return len;
 }
+#endif /* SIN6_LEN */
 
 /* Interface between zebra message and rtm message. */
 static int
@@ -368,6 +372,8 @@
 	  zlog_info ("kernel_rtm_ipv6_multipath(): nexthop %d add error=%d.",
 	    nexthop_num, error);
 	}
+#else
+      (void)error;
 #endif
 
       nexthop_num++;
diff --git a/zebra/rtread_getmsg.c b/zebra/rtread_getmsg.c
index 7fb916f..5057358 100644
--- a/zebra/rtread_getmsg.c
+++ b/zebra/rtread_getmsg.c
@@ -156,13 +156,13 @@
 
 		/* This is normal loop termination */
 		if (retval == 0 &&
-			msgdata.len >= sizeof (struct T_optmgmt_ack) &&
+			(size_t)msgdata.len >= sizeof (struct T_optmgmt_ack) &&
 			TLIack->PRIM_type == T_OPTMGMT_ACK &&
 			TLIack->MGMT_flags == T_SUCCESS &&
 			MIB2hdr->len == 0)
 			break;
 
-		if (msgdata.len >= sizeof (struct T_error_ack) &&
+		if ((size_t)msgdata.len >= sizeof (struct T_error_ack) &&
 			TLIerr->PRIM_type == T_ERROR_ACK) {
 			zlog_warn ("getmsg(ctl) returned T_ERROR_ACK: %s",
 				safe_strerror ((TLIerr->TLI_error == TSYSERR)
@@ -174,7 +174,7 @@
 		   like what GateD does in this instance, but not
 		   critical yet. */
 		if (retval != MOREDATA ||
-			msgdata.len < sizeof (struct T_optmgmt_ack) ||
+			(size_t)msgdata.len < sizeof (struct T_optmgmt_ack) ||
 			TLIack->PRIM_type != T_OPTMGMT_ACK ||
 			TLIack->MGMT_flags != T_SUCCESS) {
 			errno = ENOMSG;