summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShane Kerr <shane@isc.org>2008-01-09 23:02:42 +0000
committerShane Kerr <shane@isc.org>2008-01-09 23:02:42 +0000
commitcff9b78fca34785ccc2f291998bf0baec1963d96 (patch)
tree4bc3cd3e301831efda783a8256d2cf8d67ddaf39
parent2c9bf1f4bffa220606caf225b1d7612014aca73e (diff)
downloadisc-dhcp-cff9b78fca34785ccc2f291998bf0baec1963d96.tar.gz
Build fixes for Solaris 9.
See RT ticket #17444 for more.
-rw-r--r--RELNOTES2
-rw-r--r--common/socket.c50
-rw-r--r--configure.ac3
-rw-r--r--omapip/inet_addr.c8
4 files changed, 58 insertions, 5 deletions
diff --git a/RELNOTES b/RELNOTES
index f60f5fa3..bac9425a 100644
--- a/RELNOTES
+++ b/RELNOTES
@@ -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