From: Shane Kerr Date: Wed, 9 Jan 2008 23:02:42 +0000 (+0000) Subject: Build fixes for Solaris 9. X-Git-Tag: v4_1_0a1~26 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cff9b78fca34785ccc2f291998bf0baec1963d96;p=thirdparty%2Fdhcp.git Build fixes for Solaris 9. See RT ticket #17444 for more. --- diff --git a/RELNOTES b/RELNOTES index f60f5fa36..bac9425a7 100644 --- a/RELNOTES +++ b/RELNOTES @@ -108,6 +108,8 @@ suggested fixes to . initialization state may have been used to signal the relay agent information options sub-option code for the 'END' of the option space. +- Fixes to allow code to compile and run on Solaris 9. + Changes since 4.0.0b3 - The reverse dns name for PTR updates on IPv6 addresses has been fixed to diff --git a/common/socket.c b/common/socket.c index 8058c286a..482a9f799 100644 --- a/common/socket.c +++ b/common/socket.c @@ -410,6 +410,56 @@ ssize_t send_packet (interface, packet, raw, len, from, to, hto) #endif /* USE_SOCKET_SEND || USE_SOCKET_FALLBACK */ +#ifdef DHCPv6 +/* + * Solaris 9 is missing the CMSG_LEN and CMSG_SPACE macros, so we will + * synthesize them (based on the BIND 9 technique). + */ + +#ifndef CMSG_LEN +static size_t CMSG_LEN(size_t len) { + size_t hdrlen; + /* + * Cast NULL so that any pointer arithmetic performed by CMSG_DATA + * is correct. + */ + hdrlen = (size_t)CMSG_DATA(((struct cmsghdr *)NULL)); + return hdrlen + len; +} +#endif /* !CMSG_LEN */ + +#ifndef CMSG_SPACE +static size_t CMSG_SPACE(size_t len) { + struct msghdr msg; + struct cmsghdr *cmsgp; + + /* + * XXX: The buffer length is an ad-hoc value, but should be enough + * in a practical sense. + */ + union { + struct cmsghdr cmsg_sizer; + u_int8_t pktinfo_sizer[sizeof(struct cmsghdr) + 1024]; + } dummybuf; + + memset(&msg, 0, sizeof(msg)); + msg.msg_control = &dummybuf; + msg.msg_controllen = sizeof(dummybuf); + + cmsgp = (struct cmsghdr *)&dummybuf; + cmsgp->cmsg_len = CMSG_LEN(len); + + cmsgp = CMSG_NXTHDR(&msg, cmsgp); + if (cmsgp != NULL) { + return (char *)cmsgp - (char *)msg.msg_control; + } else { + return 0; + } +} +#endif /* !CMSG_SPACE */ + +#endif /* DHCPv6 */ + #ifdef DHCPv6 /* * For both send_packet6() and receive_packet6() we need to use the diff --git a/configure.ac b/configure.ac index da9c4aedd..09723db8f 100644 --- a/configure.ac +++ b/configure.ac @@ -180,6 +180,7 @@ fi AC_MSG_CHECKING([for struct lifnum]) AC_TRY_COMPILE( [ #include + #include #include ], [ struct lifnum a; @@ -214,7 +215,7 @@ AC_TRY_LINK( [AC_MSG_RESULT(no)]) # Look for optional headers. -AC_CHECK_HEADERS(net/if_dl.h net/if6.h regex.h) +AC_CHECK_HEADERS(sys/socket.h net/if_dl.h net/if6.h regex.h) # find an MD5 library AC_SEARCH_LIBS(MD5_Init, [crypto]) diff --git a/omapip/inet_addr.c b/omapip/inet_addr.c index 752b359e4..c5ccc79f7 100644 --- a/omapip/inet_addr.c +++ b/omapip/inet_addr.c @@ -78,14 +78,14 @@ inet_aton(cp, addr) base = 8; } while ((c = *cp) != '\0') { - if (isascii(c) && isdigit(c)) { + if (isascii(c) && isdigit((int)c)) { val = (val * base) + (c - '0'); cp++; continue; } - if (base == 16 && isascii(c) && isxdigit(c)) { + if (base == 16 && isascii(c) && isxdigit((int)c)) { val = (val << 4) + - (c + 10 - (islower(c) ? 'a' : 'A')); + (c + 10 - (islower((int)c) ? 'a' : 'A')); cp++; continue; } @@ -107,7 +107,7 @@ inet_aton(cp, addr) /* * Check for trailing characters. */ - if (*cp && (!isascii(*cp) || !isspace(*cp))) + if (*cp && (!isascii(*cp) || !isspace((int)*cp))) return (0); /* * Concoct the address according to