2005-01-04 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* configure.ac: Added test for broken CMSG_FIRSTHDR macro
(relevant for Solaris 8 and unpatched Solaris 9, don't know
whether other platforms are affected).
* zebra.h: Define ZCMSG_FIRSTHDR appropriately based on whether
config.h indicates HAVE_BROKEN_CMSG_FIRSTHDR (as determined
by the configure test program).
* sockopt.c: (getsockopt_cmsg_data) Use ZCMSG_FIRSTHDR instead
of CMSG_FIRSTHDR.
* rtadv.c: (rtadv_recv_packet,rtadv_send_packet) Use ZCMSG_FIRSTHDR
instead of CMSG_FIRSTHDR.
* ripd.c: (rip_recvmsg) Use ZCMSG_FIRSTHDR instead of CMSG_FIRSTHDR.
* ripngd.c: (ripng_recv_packet) Use ZCMSG_FIRSTHDR instead of
CMSG_FIRSTHDR.
diff --git a/ChangeLog b/ChangeLog
index 959ac85..ab58b58 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2005-01-04 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+ * configure.ac: Added test for broken CMSG_FIRSTHDR macro
+ (relevant for Solaris 8 and unpatched Solaris 9, don't know
+ whether other platforms are affected).
+
+2005-01-04 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
* NEWS: Note improved logging facilities.
2004-12-29 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
diff --git a/configure.ac b/configure.ac
index 608672b..95056e7 100755
--- a/configure.ac
+++ b/configure.ac
@@ -5,7 +5,7 @@
## Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
## Portions Copyright (c) 2003 Paul Jakma <paul@dishone.st>
##
-## $Id: configure.ac,v 1.81 2004/12/29 17:50:22 ajs Exp $
+## $Id: configure.ac,v 1.82 2005/01/04 16:24:43 ajs Exp $
AC_PREREQ(2.53)
AC_INIT(Quagga, 0.97.4, [http://bugzilla.quagga.net])
@@ -494,6 +494,31 @@
AC_SUBST(KERNEL_METHOD)
AC_SUBST(OTHER_METHOD)
+dnl ------------------------------------
+dnl check for broken CMSG_FIRSTHDR macro
+dnl ------------------------------------
+AC_TRY_RUN([
+#ifdef SUNOS_5
+#define _XPG4_2
+#define __EXTENSIONS__
+#endif
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+main()
+{
+ struct msghdr msg;
+ char buf[4];
+
+ msg.msg_control = buf;
+ msg.msg_controllen = 0;
+
+ if (CMSG_FIRSTHDR(&msg) != NULL)
+ exit(0);
+ exit (1);
+}],[AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)])
+
dnl ------------------------------
dnl check kernel route read method
dnl ------------------------------
diff --git a/lib/ChangeLog b/lib/ChangeLog
index d50b859..2fee461 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,11 @@
+2005-01-04 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+ * zebra.h: Define ZCMSG_FIRSTHDR appropriately based on whether
+ config.h indicates HAVE_BROKEN_CMSG_FIRSTHDR (as determined
+ by the configure test program).
+ * sockopt.c: (getsockopt_cmsg_data) Use ZCMSG_FIRSTHDR instead
+ of CMSG_FIRSTHDR.
+
2005-01-02 Hasso Tepper <hasso at quagga.net>
* command.c: Revert int -> unsigned int fixes in
diff --git a/lib/sockopt.c b/lib/sockopt.c
index d755746..81db88d 100644
--- a/lib/sockopt.c
+++ b/lib/sockopt.c
@@ -42,7 +42,7 @@
struct cmsghdr *cmsg;
void *ptr = NULL;
- for (cmsg = CMSG_FIRSTHDR(msgh);
+ for (cmsg = ZCMSG_FIRSTHDR(msgh);
cmsg != NULL;
cmsg = CMSG_NXTHDR(msgh, cmsg))
if (cmsg->cmsg_level == level && cmsg->cmsg_type)
diff --git a/lib/zebra.h b/lib/zebra.h
index 83da37c..8c2dcab 100644
--- a/lib/zebra.h
+++ b/lib/zebra.h
@@ -215,6 +215,23 @@
#endif /* BSDI_NRL */
+#ifdef HAVE_BROKEN_CMSG_FIRSTHDR
+/* This bug is present in Solaris 8 and pre-patch Solaris 9 <sys/socket.h>;
+ please refer to http://bugzilla.quagga.net/show_bug.cgi?id=142 */
+
+/* Check that msg_controllen is large enough. */
+#define ZCMSG_FIRSTHDR(mhdr) \
+ (((size_t)((mhdr)->msg_controllen) >= sizeof(struct cmsghdr)) ? \
+ CMSG_FIRSTHDR(mhdr) : (struct cmsghdr *)NULL)
+
+#warning "CMSG_FIRSTHDR is broken on this platform, using a workaround"
+
+#else /* HAVE_BROKEN_CMSG_FIRSTHDR */
+#define ZCMSG_FIRSTHDR(M) CMSG_FIRSTHDR(M)
+#endif /* HAVE_BROKEN_CMSG_FIRSTHDR */
+
+
+
/*
* RFC 3542 defines several macros for using struct cmsghdr.
* Here, we define those that are not present
diff --git a/ripd/ChangeLog b/ripd/ChangeLog
index 9d56611..1372280 100644
--- a/ripd/ChangeLog
+++ b/ripd/ChangeLog
@@ -1,3 +1,7 @@
+2005-01-04 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+ * ripd.c: (rip_recvmsg) Use ZCMSG_FIRSTHDR instead of CMSG_FIRSTHDR.
+
2004-12-15 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* ripd.c: (rip_read) Improve 2 error messages to show the source of
diff --git a/ripd/ripd.c b/ripd/ripd.c
index 0407065..c5baf8a 100644
--- a/ripd/ripd.c
+++ b/ripd/ripd.c
@@ -1632,7 +1632,7 @@
if (ret < 0)
return ret;
- for (ptr = CMSG_FIRSTHDR(&msg); ptr != NULL; ptr = CMSG_NXTHDR(&msg, ptr))
+ for (ptr = ZCMSG_FIRSTHDR(&msg); ptr != NULL; ptr = CMSG_NXTHDR(&msg, ptr))
if (ptr->cmsg_level == IPPROTO_IP && ptr->cmsg_type == IP_PKTINFO)
{
struct in_pktinfo *pktinfo;
diff --git a/ripngd/ChangeLog b/ripngd/ChangeLog
index 7f85cc4..dcd8ded 100644
--- a/ripngd/ChangeLog
+++ b/ripngd/ChangeLog
@@ -1,3 +1,8 @@
+2005-01-04 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+ * ripngd.c: (ripng_recv_packet) Use ZCMSG_FIRSTHDR instead of
+ CMSG_FIRSTHDR.
+
2004-12-16 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* ripng_nexthop.c: Replace NEXTHOP_OUT macro with NEXTHOP_OUT_PTR,
diff --git a/ripngd/ripngd.c b/ripngd/ripngd.c
index 84ed45e..34282b8 100644
--- a/ripngd/ripngd.c
+++ b/ripngd/ripngd.c
@@ -263,7 +263,7 @@
if (ret < 0)
return ret;
- for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL;
+ for (cmsgptr = ZCMSG_FIRSTHDR(&msg); cmsgptr != NULL;
cmsgptr = CMSG_NXTHDR(&msg, cmsgptr))
{
/* I want interface index which this packet comes from. */
diff --git a/zebra/ChangeLog b/zebra/ChangeLog
index 3ed8c63..e26204c 100644
--- a/zebra/ChangeLog
+++ b/zebra/ChangeLog
@@ -1,3 +1,8 @@
+2005-01-04 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+ * rtadv.c: (rtadv_recv_packet,rtadv_send_packet) Use ZCMSG_FIRSTHDR
+ instead of CMSG_FIRSTHDR.
+
2004-12-22 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* connected.c: (connected_add_ipv4) Limit warning about /32 addresses
diff --git a/zebra/rtadv.c b/zebra/rtadv.c
index 65b2f87..1238396 100644
--- a/zebra/rtadv.c
+++ b/zebra/rtadv.c
@@ -121,7 +121,7 @@
if (ret < 0)
return ret;
- for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL;
+ for (cmsgptr = ZCMSG_FIRSTHDR(&msg); cmsgptr != NULL;
cmsgptr = CMSG_NXTHDR(&msg, cmsgptr))
{
/* I want interface index which this packet comes from. */
@@ -288,7 +288,7 @@
iov.iov_base = buf;
iov.iov_len = len;
- cmsgptr = CMSG_FIRSTHDR(&msg);
+ cmsgptr = ZCMSG_FIRSTHDR(&msg);
cmsgptr->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
cmsgptr->cmsg_level = IPPROTO_IPV6;
cmsgptr->cmsg_type = IPV6_PKTINFO;