diff options
author | Shane Kerr <shane@isc.org> | 2008-01-09 23:02:42 +0000 |
---|---|---|
committer | Shane Kerr <shane@isc.org> | 2008-01-09 23:02:42 +0000 |
commit | cff9b78fca34785ccc2f291998bf0baec1963d96 (patch) | |
tree | 4bc3cd3e301831efda783a8256d2cf8d67ddaf39 | |
parent | 2c9bf1f4bffa220606caf225b1d7612014aca73e (diff) | |
download | isc-dhcp-cff9b78fca34785ccc2f291998bf0baec1963d96.tar.gz |
Build fixes for Solaris 9.
See RT ticket #17444 for more.
-rw-r--r-- | RELNOTES | 2 | ||||
-rw-r--r-- | common/socket.c | 50 | ||||
-rw-r--r-- | configure.ac | 3 | ||||
-rw-r--r-- | omapip/inet_addr.c | 8 |
4 files changed, 58 insertions, 5 deletions
@@ -108,6 +108,8 @@ suggested fixes to <dhcp-users@isc.org>. 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 8058c286..482a9f79 100644 --- a/common/socket.c +++ b/common/socket.c @@ -411,6 +411,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 * sendmsg()/recvmsg() functions rather than the simpler send()/recv() diff --git a/configure.ac b/configure.ac index da9c4aed..09723db8 100644 --- a/configure.ac +++ b/configure.ac @@ -180,6 +180,7 @@ fi AC_MSG_CHECKING([for struct lifnum]) AC_TRY_COMPILE( [ #include <sys/types.h> + #include <sys/socket.h> #include <net/if.h> ], [ 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 752b359e..c5ccc79f 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 |