diff options
author | ajs <ajs> | 2005-01-04 16:24:43 +0000 |
---|---|---|
committer | ajs <ajs> | 2005-01-04 16:24:43 +0000 |
commit | b99760ab51abf8c4c9a1f89dab0c1630a6768ff7 (patch) | |
tree | daaf8cabb567c5ff1a01368fa1382d8257b56854 | |
parent | 73a7dea305b146febb8e57176295689d6a900f1d (diff) |
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.
-rw-r--r-- | ChangeLog | 6 | ||||
-rwxr-xr-x | configure.ac | 27 | ||||
-rw-r--r-- | lib/ChangeLog | 8 | ||||
-rw-r--r-- | lib/sockopt.c | 2 | ||||
-rw-r--r-- | lib/zebra.h | 17 | ||||
-rw-r--r-- | ripd/ChangeLog | 4 | ||||
-rw-r--r-- | ripd/ripd.c | 2 | ||||
-rw-r--r-- | ripngd/ChangeLog | 5 | ||||
-rw-r--r-- | ripngd/ripngd.c | 2 | ||||
-rw-r--r-- | zebra/ChangeLog | 5 | ||||
-rw-r--r-- | zebra/rtadv.c | 4 |
11 files changed, 76 insertions, 6 deletions
@@ -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 608672b6..95056e7e 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(RT_METHOD) 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 d50b8590..2fee4611 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 d755746a..81db88d9 100644 --- a/lib/sockopt.c +++ b/lib/sockopt.c @@ -42,7 +42,7 @@ getsockopt_cmsg_data (struct msghdr *msgh, int level, int type) 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 83da37c5..8c2dcaba 100644 --- a/lib/zebra.h +++ b/lib/zebra.h @@ -215,6 +215,23 @@ typedef int socklen_t; #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 9d566119..13722805 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 04070658..c5baf8a3 100644 --- a/ripd/ripd.c +++ b/ripd/ripd.c @@ -1632,7 +1632,7 @@ rip_recvmsg (int sock, u_char *buf, int size, struct sockaddr_in *from, 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 7f85cc47..dcd8dedf 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 84ed45ee..34282b8e 100644 --- a/ripngd/ripngd.c +++ b/ripngd/ripngd.c @@ -263,7 +263,7 @@ ripng_recv_packet (int sock, u_char *buf, int bufsize, 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 3ed8c635..e26204c8 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 65b2f87c..1238396e 100644 --- a/zebra/rtadv.c +++ b/zebra/rtadv.c @@ -121,7 +121,7 @@ rtadv_recv_packet (int sock, u_char *buf, int buflen, 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 @@ rtadv_send_packet (int sock, struct interface *ifp) 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; |