2004-07-23 Paul Jakma <paul@dishone.st>

        * sockopt.h: Add SOPT_SIZE_CMSG_PKTINFO{_IPV{4,6}} define, for
          sizeof pktinfo as appropriate, to be used when allocating msg
          buffers. export setsockopt_pktinfo() and
          getsockopt_pktinfo_ifindex()
        * sockopt.c: (setsockopt_pktinfo_ifindex) new function to portably
          set received ifindex sock option.
          (getsockopt_pktinfo_ifindex) portably retrieve ifindex.
          (getsockopt_cmsg_data) retrieve indicated control info from
          message header.
          (getsockopt_ipv6_pktinfo_ifindex) ipv6 version of above.
          (setsockopt_ipv4_pktinfo) v4 version
          (setsockopt_pktinfo) the exported version
          (getsockopt_ipv4_pktinfo_ifindex) v4 specific version
          (getsockopt_pktinfo_ifindex) the exported version
diff --git a/lib/sockopt.h b/lib/sockopt.h
index 7fb31c1..c5d171c 100644
--- a/lib/sockopt.h
+++ b/lib/sockopt.h
@@ -31,11 +31,27 @@
 int setsockopt_ipv6_multicast_loop (int, int);
 #endif /* HAVE_IPV6 */
 
+#if defined (IP_PKTINFO)
+#define SOPT_SIZE_CMSG_PKTINFO_IPV4()  (sizeof (struct in_pktinfo))
+#elif defined (IP_RECVIF)
+#if defined (SUNOS_5)
+#define SOPT_SIZE_CMSG_PKTINFO_IPV4()  (sizeof (uint_t))
+#else
+#define SOPT_SIZE_CMSG_PKTINFO_IPV4()  (sizeof (struct sockaddr_dl))
+#endif /* SUNOS_5 */
+#endif
+
+#define SOPT_SIZE_CMSG_PKTINFO_IPV6() (sizeof (struct in6_pktinfo));
+
+#define SOPT_SIZE_CMSG_PKTINFO(af) \
+  ((af == AF_INET) ? SOPT_SIZE_CMSG_PKTINFO_IPV4() \
+                   : SOPT_SIZE_CMSG_PKTINFO_IPV6()
+
 int setsockopt_multicast_ipv4(int sock, 
 			     int optname, 
 			     struct in_addr if_addr,
 			     unsigned int mcast_addr,
 			     unsigned int ifindex);
-
-
+int setsockopt_pktinfo (int, int, int);
+int getsockopt_pktinfo_ifindex (int, struct msghdr *);
 #endif /*_ZEBRA_SOCKOPT_H */