From d06bc699f2e3848da8ce9a7fa20ac99db630bd1b Mon Sep 17 00:00:00 2001 From: Antoine Verheijen Date: Mon, 8 Feb 2010 15:23:03 -0700 Subject: [PATCH] OpenBSD: fix lookup of network interfaces Starting with OpenBSD 4.2, the interface list returned by sysctl using NET_RT_IFLIST contains multiple versions of the data. This really messes up the rx_getAllAddr_internal() routine that returns a list of valid interfaces for the system (to the point where none are returned). This change adds a routine that cleans up the data returned by sysctl so it returns only a single (the most current) version of the data. That stops afsd (among others) from being cranky when it starts up. Change-Id: Ief1df0d2c3eb241c45b439a785ddb67d3afe992c Reviewed-on: http://gerrit.openafs.org/1274 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- src/rx/rx_getaddr.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/rx/rx_getaddr.c b/src/rx/rx_getaddr.c index 6e8c5f4..928ae17 100644 --- a/src/rx/rx_getaddr.c +++ b/src/rx/rx_getaddr.c @@ -142,6 +142,32 @@ rt_xaddrs(caddr_t cp, caddr_t cplim, struct rt_addrinfo *rtinfo) ** the buffer has to be passed in by the caller */ #if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV) +#if defined(AFS_OBSD42_ENV) +void +ifm_fixversion(char *buffer, size_t *size) { + struct if_msghdr *ifm; + char *b = buffer; + char *s, *t; + + if ((t = malloc(*size)) != NULL) { + memcpy(t, buffer, *size); + + for (s = t; s < t + *size; s += ifm->ifm_msglen) { + ifm = (struct if_msghdr *)s; + + if (ifm->ifm_version == RTM_VERSION) { + memcpy(b, ifm, ifm->ifm_msglen); + b += ifm->ifm_msglen; + } + } + + free(t); + + *size = b - buffer; + } +} +#endif + int rx_getAllAddr_internal(afs_uint32 buffer[], int maxSize, int loopbacks) { @@ -168,6 +194,9 @@ rx_getAllAddr_internal(afs_uint32 buffer[], int maxSize, int loopbacks) free(buf); return 0; } +#if defined(AFS_OBSD42_ENV) + ifm_fixversion(buf, &needed); +#endif lim = buf + needed; next = buf; while (next < lim) { @@ -254,6 +283,9 @@ rx_getAllAddrMaskMtu(afs_uint32 addrBuffer[], afs_uint32 maskBuffer[], free(buf); return 0; } +#if defined(AFS_OBSD42_ENV) + ifm_fixversion(buf, &needed); +#endif s = socket(PF_INET, SOCK_DGRAM, 0); if (s < 0) return 0; -- 1.9.4