diff options
Diffstat (limited to 'sbin/isakmpd/if.c')
-rw-r--r-- | sbin/isakmpd/if.c | 149 |
1 files changed, 71 insertions, 78 deletions
diff --git a/sbin/isakmpd/if.c b/sbin/isakmpd/if.c index ab6cd66bcc2..52bd4ec1905 100644 --- a/sbin/isakmpd/if.c +++ b/sbin/isakmpd/if.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if.c,v 1.18 2004/04/13 21:48:15 hshoexer Exp $ */ +/* $OpenBSD: if.c,v 1.19 2004/04/15 18:39:25 deraadt Exp $ */ /* $EOM: if.c,v 1.12 1999/10/01 13:45:20 niklas Exp $ */ /* @@ -59,96 +59,89 @@ * Return 0 if successful, -1 otherwise. */ int -siocgifconf (struct ifconf *ifcp) +siocgifconf(struct ifconf *ifcp) { - int s; - int len; - caddr_t buf, new_buf; - - /* Get a socket to ask for the network interface configurations. */ - s = monitor_socket (AF_INET, SOCK_DGRAM, 0); - if (s == -1) - { - log_error ("siocgifconf: socket (AF_INET, SOCK_DGRAM, 0) failed"); - return -1; - } - - len = sizeof (struct ifreq) * INITIAL_IFREQ_COUNT; - buf = 0; - while (1) - { - /* - * Allocate a larger buffer each time around the loop and get the - * network interfaces configurations into it. - */ - new_buf = realloc (buf, len); - if (!new_buf) - { - log_error ("siocgifconf: realloc (%p, %d) failed", buf, len); - goto err; + caddr_t buf, new_buf; + int s, len; + + /* Get a socket to ask for the network interface configurations. */ + s = monitor_socket(AF_INET, SOCK_DGRAM, 0); + if (s == -1) { + log_error("siocgifconf: socket (AF_INET, SOCK_DGRAM, 0) failed"); + return -1; } - ifcp->ifc_len = len; - ifcp->ifc_buf = buf = new_buf; - if (ioctl (s, SIOCGIFCONF, ifcp) == -1) - { - log_error ("siocgifconf: ioctl (%d, SIOCGIFCONF, ...) failed", s); - goto err; + len = sizeof(struct ifreq) * INITIAL_IFREQ_COUNT; + buf = 0; + while (1) { + /* + * Allocate a larger buffer each time around the loop and get the + * network interfaces configurations into it. + */ + new_buf = realloc(buf, len); + if (!new_buf) { + log_error("siocgifconf: realloc (%p, %d) failed", buf, len); + goto err; + } + ifcp->ifc_len = len; + ifcp->ifc_buf = buf = new_buf; + if (ioctl(s, SIOCGIFCONF, ifcp) == -1) { + log_error("siocgifconf: ioctl (%d, SIOCGIFCONF, ...) failed", s); + goto err; + } + /* + * If there is place for another ifreq we can be sure that the buffer + * was big enough, otherwise double the size and try again. + */ + if (len - ifcp->ifc_len >= sizeof(struct ifreq)) + break; + len *= 2; } - - /* - * If there is place for another ifreq we can be sure that the buffer - * was big enough, otherwise double the size and try again. - */ - if (len - ifcp->ifc_len >= sizeof (struct ifreq)) - break; - len *= 2; - } - close (s); - return 0; + close(s); + return 0; err: - if (buf) - free (buf); - ifcp->ifc_len = 0; - ifcp->ifc_buf = 0; - close (s); - return -1; + if (buf) + free(buf); + ifcp->ifc_len = 0; + ifcp->ifc_buf = 0; + close(s); + return -1; } #endif int -if_map (int (*func) (char *, struct sockaddr *, void *), void *arg) +if_map(int (*func)(char *, struct sockaddr *, void *), void *arg) { - int err = 0; + int err = 0; + #ifdef HAVE_GETIFADDRS - struct ifaddrs *ifap, *ifa; + struct ifaddrs *ifap, *ifa; - if (getifaddrs (&ifap) < 0) - return -1; + if (getifaddrs(&ifap) < 0) + return -1; - for (ifa = ifap; ifa; ifa = ifa->ifa_next) - if ((*func) (ifa->ifa_name, ifa->ifa_addr, arg) == -1) - err = -1; - freeifaddrs (ifap); + for (ifa = ifap; ifa; ifa = ifa->ifa_next) + if ((*func) (ifa->ifa_name, ifa->ifa_addr, arg) == -1) + err = -1; + freeifaddrs(ifap); #else - struct ifconf ifc; - struct ifreq *ifrp; - caddr_t limit, p; - size_t len; - - if (siocgifconf (&ifc)) - return -1; - - limit = ifc.ifc_buf + ifc.ifc_len; - for (p = ifc.ifc_buf; p < limit; p += len) - { - ifrp = (struct ifreq *)p; - if ((*func) (ifrp->ifr_name, &ifrp->ifr_addr, arg) == -1) - err = -1; - len = sizeof ifrp->ifr_name - + MAX (sysdep_sa_len (&ifrp->ifr_addr), sizeof ifrp->ifr_addr); - } - free (ifc.ifc_buf); + struct ifconf ifc; + struct ifreq *ifrp; + caddr_t limit, p; + size_t len; + + if (siocgifconf(&ifc)) + return -1; + + limit = ifc.ifc_buf + ifc.ifc_len; + for (p = ifc.ifc_buf; p < limit; p += len) { + ifrp = (struct ifreq *) p; + if ((*func) (ifrp->ifr_name, &ifrp->ifr_addr, arg) == -1) + err = -1; + len = sizeof ifrp->ifr_name + + MAX(sysdep_sa_len(&ifrp->ifr_addr), sizeof ifrp->ifr_addr); + } + free(ifc.ifc_buf); #endif - return err; + return err; } |