1478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* -*- Mode: c; tab-width: 8; indent-tabs-mode: 1; c-basic-offset: 8; -*- */ 2478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 3478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Copyright (c) 1994, 1995, 1996, 1997, 1998 4478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * The Regents of the University of California. All rights reserved. 5478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 6478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Redistribution and use in source and binary forms, with or without 7478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * modification, are permitted provided that the following conditions 8478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * are met: 9478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 10478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * notice, this list of conditions and the following disclaimer. 11478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 12478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 13478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * documentation and/or other materials provided with the distribution. 14478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 3. All advertising materials mentioning features or use of this software 15478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * must display the following acknowledgement: 16478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * This product includes software developed by the Computer Systems 17478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Engineering Group at Lawrence Berkeley Laboratory. 18478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 4. Neither the name of the University nor of the Laboratory may be used 19478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * to endorse or promote products derived from this software without 20478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * specific prior written permission. 21478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 22478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * SUCH DAMAGE. 33478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 34478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 35478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef lint 36478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const char rcsid[] _U_ = 37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall "@(#) $Header: /tcpdump/master/libpcap/fad-gifc.c,v 1.12 2008-08-06 07:34:09 guy Exp $ (LBL)"; 38478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 39478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 40478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_CONFIG_H 41478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "config.h" 42478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 43478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 44478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/param.h> 45478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/ioctl.h> 46478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/socket.h> 47478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_SYS_SOCKIO_H 48478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/sockio.h> 49478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 50478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/time.h> /* concession to AIX */ 51478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct mbuf; /* Squelch compiler warnings on some platforms for */ 53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct rtentry; /* declarations in <net/if.h> */ 54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <net/if.h> 55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netinet/in.h> 56478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <ctype.h> 58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <errno.h> 59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <memory.h> 60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdio.h> 61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdlib.h> 62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <string.h> 63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <unistd.h> 64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "pcap-int.h" 66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 67478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_OS_PROTO_H 68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "os-proto.h" 69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * This is fun. 73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * In older BSD systems, socket addresses were fixed-length, and 75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * "sizeof (struct sockaddr)" gave the size of the structure. 76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * All addresses fit within a "struct sockaddr". 77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * In newer BSD systems, the socket address is variable-length, and 79478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * there's an "sa_len" field giving the length of the structure; 80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * this allows socket addresses to be longer than 2 bytes of family 81478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * and 14 bytes of data. 82478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 83478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Some commercial UNIXes use the old BSD scheme, some use the RFC 2553 84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * variant of the old BSD scheme (with "struct sockaddr_storage" rather 85478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * than "struct sockaddr"), and some use the new BSD scheme. 86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Some versions of GNU libc use neither scheme, but has an "SA_LEN()" 88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * macro that determines the size based on the address family. Other 89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * versions don't have "SA_LEN()" (as it was in drafts of RFC 2553 90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * but not in the final version). 91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We assume that a UNIX that doesn't have "getifaddrs()" and doesn't have 93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * SIOCGLIFCONF, but has SIOCGIFCONF, uses "struct sockaddr" for the 94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * address in an entry returned by SIOCGIFCONF. 95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef SA_LEN 97478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN 98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define SA_LEN(addr) ((addr)->sa_len) 99478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else /* HAVE_SOCKADDR_SA_LEN */ 100478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define SA_LEN(addr) (sizeof (struct sockaddr)) 101478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_SOCKADDR_SA_LEN */ 102478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* SA_LEN */ 103478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 105478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * This is also fun. 106478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 107478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * There is no ioctl that returns the amount of space required for all 108478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * the data that SIOCGIFCONF could return, and if a buffer is supplied 109478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * that's not large enough for all the data SIOCGIFCONF could return, 110478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * on at least some platforms it just returns the data that'd fit with 111478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * no indication that there wasn't enough room for all the data, much 112478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * less an indication of how much more room is required. 113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * The only way to ensure that we got all the data is to pass a buffer 115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * large enough that the amount of space in the buffer *not* filled in 116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * is greater than the largest possible entry. 117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We assume that's "sizeof(ifreq.ifr_name)" plus 255, under the assumption 119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * that no address is more than 255 bytes (on systems where the "sa_len" 120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * field in a "struct sockaddr" is 1 byte, e.g. newer BSDs, that's the 121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * case, and addresses are unlikely to be bigger than that in any case). 122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define MAX_SA_LEN 255 124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Get a list of all interfaces that are up and that we can open. 127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Returns -1 on error, 0 otherwise. 128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * The list, as returned through "alldevsp", may be null if no interfaces 129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * were up and could be opened. 130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * This is the implementation used on platforms that have SIOCGIFCONF but 132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * don't have any other mechanism for getting a list of interfaces. 133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * XXX - or platforms that have other, better mechanisms but for which 135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * we don't yet have code to use that mechanism; I think there's a better 136511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * way on Linux, for example, but if that better way is "getifaddrs()", 137511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * we already have that. 138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint 140511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) 141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 142478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_if_t *devlist = NULL; 143478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project register int fd; 144478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project register struct ifreq *ifrp, *ifend, *ifnext; 145478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int n; 146478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project struct ifconf ifc; 147478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project char *buf = NULL; 148478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project unsigned buf_size; 149478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#if defined (HAVE_SOLARIS) || defined (HAVE_HPUX10_20_OR_LATER) 150478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project char *p, *q; 151478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 152478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project struct ifreq ifrflags, ifrnetmask, ifrbroadaddr, ifrdstaddr; 153478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project struct sockaddr *netmask, *broadaddr, *dstaddr; 154478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project size_t netmask_size, broadaddr_size, dstaddr_size; 155478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int ret = 0; 156478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 157478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 158478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Create a socket from which to fetch the list of interfaces. 159478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 160478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fd = socket(AF_INET, SOCK_DGRAM, 0); 161478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (fd < 0) { 162478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, 163478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "socket: %s", pcap_strerror(errno)); 164478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-1); 165478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 166478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 167478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 168478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Start with an 8K buffer, and keep growing the buffer until 169478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * we have more than "sizeof(ifrp->ifr_name) + MAX_SA_LEN" 170478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * bytes left over in the buffer or we fail to get the 171478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * interface list for some reason other than EINVAL (which is 172478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * presumed here to mean "buffer is too small"). 173478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 174478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project buf_size = 8192; 175478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project for (;;) { 176478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project buf = malloc(buf_size); 177478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (buf == NULL) { 178478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, 179478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "malloc: %s", pcap_strerror(errno)); 180478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)close(fd); 181478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-1); 182478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 183478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 184478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifc.ifc_len = buf_size; 185478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifc.ifc_buf = buf; 186478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project memset(buf, 0, buf_size); 187478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ioctl(fd, SIOCGIFCONF, (char *)&ifc) < 0 188478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project && errno != EINVAL) { 189478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, 190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "SIOCGIFCONF: %s", pcap_strerror(errno)); 191478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)close(fd); 192478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project free(buf); 193478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (-1); 194478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 195478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ifc.ifc_len < buf_size && 196478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (buf_size - ifc.ifc_len) > sizeof(ifrp->ifr_name) + MAX_SA_LEN) 197478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 198478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project free(buf); 199478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project buf_size *= 2; 200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 201478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 202478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifrp = (struct ifreq *)buf; 203478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifend = (struct ifreq *)(buf + ifc.ifc_len); 204478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project for (; ifrp < ifend; ifrp = ifnext) { 206478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 207478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * XXX - what if this isn't an IPv4 address? Can 208478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * we still get the netmask, etc. with ioctls on 209478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * an IPv4 socket? 210478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 211478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * The answer is probably platform-dependent, and 212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * if the answer is "no" on more than one platform, 213478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * the way you work around it is probably platform- 214478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * dependent as well. 215478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 216478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project n = SA_LEN(&ifrp->ifr_addr) + sizeof(ifrp->ifr_name); 217478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (n < sizeof(*ifrp)) 218478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifnext = ifrp + 1; 219478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project else 220478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifnext = (struct ifreq *)((char *)ifrp + n); 221478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 222478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 223478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * XXX - The 32-bit compatibility layer for Linux on IA-64 224478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * is slightly broken. It correctly converts the structures 225478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * to and from kernel land from 64 bit to 32 bit but 226478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * doesn't update ifc.ifc_len, leaving it larger than the 227478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * amount really used. This means we read off the end 228478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * of the buffer and encounter an interface with an 229478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * "empty" name. Since this is highly unlikely to ever 230478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * occur in a valid case we can just finish looking for 231478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * interfaces if we see an empty name. 232478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 233478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (!(*ifrp->ifr_name)) 234478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 235478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 236478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 237478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Skip entries that begin with "dummy". 238478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * XXX - what are these? Is this Linux-specific? 239478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Are there platforms on which we shouldn't do this? 240478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 241478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (strncmp(ifrp->ifr_name, "dummy", 5) == 0) 242478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project continue; 243478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 244478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 245478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Get the flags for this interface, and skip it if it's 246478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * not up. 247478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 248478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project strncpy(ifrflags.ifr_name, ifrp->ifr_name, 249478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project sizeof(ifrflags.ifr_name)); 250478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifrflags) < 0) { 251478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (errno == ENXIO) 252478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project continue; 253478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, 254478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "SIOCGIFFLAGS: %.*s: %s", 255478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (int)sizeof(ifrflags.ifr_name), 256478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifrflags.ifr_name, 257478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_strerror(errno)); 258478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ret = -1; 259478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 260478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 261478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (!(ifrflags.ifr_flags & IFF_UP)) 262478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project continue; 263478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 264478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 265478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Get the netmask for this address on this interface. 266478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 267478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project strncpy(ifrnetmask.ifr_name, ifrp->ifr_name, 268478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project sizeof(ifrnetmask.ifr_name)); 269478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project memcpy(&ifrnetmask.ifr_addr, &ifrp->ifr_addr, 270478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project sizeof(ifrnetmask.ifr_addr)); 271478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ioctl(fd, SIOCGIFNETMASK, (char *)&ifrnetmask) < 0) { 272478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (errno == EADDRNOTAVAIL) { 273478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 274478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Not available. 275478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 276478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project netmask = NULL; 277478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project netmask_size = 0; 278478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 279478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, 280478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "SIOCGIFNETMASK: %.*s: %s", 281478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (int)sizeof(ifrnetmask.ifr_name), 282478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifrnetmask.ifr_name, 283478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_strerror(errno)); 284478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ret = -1; 285478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 286478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 287478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 288478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project netmask = &ifrnetmask.ifr_addr; 289478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project netmask_size = SA_LEN(netmask); 290478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 291478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 292478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 293478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Get the broadcast address for this address on this 294478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * interface (if any). 295478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 296478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ifrflags.ifr_flags & IFF_BROADCAST) { 297478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project strncpy(ifrbroadaddr.ifr_name, ifrp->ifr_name, 298478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project sizeof(ifrbroadaddr.ifr_name)); 299478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project memcpy(&ifrbroadaddr.ifr_addr, &ifrp->ifr_addr, 300478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project sizeof(ifrbroadaddr.ifr_addr)); 301478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ioctl(fd, SIOCGIFBRDADDR, 302478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (char *)&ifrbroadaddr) < 0) { 303478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (errno == EADDRNOTAVAIL) { 304478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 305478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Not available. 306478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 307478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project broadaddr = NULL; 308478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project broadaddr_size = 0; 309478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 310478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, 311478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "SIOCGIFBRDADDR: %.*s: %s", 312478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (int)sizeof(ifrbroadaddr.ifr_name), 313478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifrbroadaddr.ifr_name, 314478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_strerror(errno)); 315478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ret = -1; 316478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 317478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 318478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 319478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project broadaddr = &ifrbroadaddr.ifr_broadaddr; 320478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project broadaddr_size = SA_LEN(broadaddr); 321478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 322478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 323478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 324478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Not a broadcast interface, so no broadcast 325478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * address. 326478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 327478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project broadaddr = NULL; 328478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project broadaddr_size = 0; 329478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 330478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 331478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 332478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Get the destination address for this address on this 333478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * interface (if any). 334478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 335478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ifrflags.ifr_flags & IFF_POINTOPOINT) { 336478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project strncpy(ifrdstaddr.ifr_name, ifrp->ifr_name, 337478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project sizeof(ifrdstaddr.ifr_name)); 338478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project memcpy(&ifrdstaddr.ifr_addr, &ifrp->ifr_addr, 339478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project sizeof(ifrdstaddr.ifr_addr)); 340478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ioctl(fd, SIOCGIFDSTADDR, 341478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (char *)&ifrdstaddr) < 0) { 342478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (errno == EADDRNOTAVAIL) { 343478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 344478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Not available. 345478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 346478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dstaddr = NULL; 347478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dstaddr_size = 0; 348478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 349478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)snprintf(errbuf, PCAP_ERRBUF_SIZE, 350478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project "SIOCGIFDSTADDR: %.*s: %s", 351478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (int)sizeof(ifrdstaddr.ifr_name), 352478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifrdstaddr.ifr_name, 353478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_strerror(errno)); 354478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ret = -1; 355478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 356478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 357478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 358478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dstaddr = &ifrdstaddr.ifr_dstaddr; 359478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dstaddr_size = SA_LEN(dstaddr); 360478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 361478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } else { 362478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 363478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Not a point-to-point interface, so no destination 364478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * address. 365478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 366478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dstaddr = NULL; 367478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project dstaddr_size = 0; 368478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 369478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 370478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#if defined (HAVE_SOLARIS) || defined (HAVE_HPUX10_20_OR_LATER) 371478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 372478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * If this entry has a colon followed by a number at 373478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * the end, it's a logical interface. Those are just 374478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * the way you assign multiple IP addresses to a real 375478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * interface, so an entry for a logical interface should 376478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * be treated like the entry for the real interface; 377478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * we do that by stripping off the ":" and the number. 378478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 379478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project p = strchr(ifrp->ifr_name, ':'); 380478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (p != NULL) { 381478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 382478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We have a ":"; is it followed by a number? 383478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 384478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project q = p + 1; 385478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project while (isdigit((unsigned char)*q)) 386478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project q++; 387478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (*q == '\0') { 388478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 389478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * All digits after the ":" until the end. 390478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Strip off the ":" and everything after 391478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * it. 392478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 393478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *p = '\0'; 394478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 395478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 396478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 397478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 398478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 399478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Add information for this address to the list. 400478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 401478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (add_addr_to_iflist(&devlist, ifrp->ifr_name, 402478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ifrflags.ifr_flags, &ifrp->ifr_addr, 403478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project SA_LEN(&ifrp->ifr_addr), netmask, netmask_size, 404478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project broadaddr, broadaddr_size, dstaddr, dstaddr_size, 405478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project errbuf) < 0) { 406478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project ret = -1; 407478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 408478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 409478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 410478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project free(buf); 411478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)close(fd); 412478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 413478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (ret == -1) { 414478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project /* 415478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We had an error; free the list we've been constructing. 416478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 417478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project if (devlist != NULL) { 418478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project pcap_freealldevs(devlist); 419478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project devlist = NULL; 420478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 421478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 422478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 423478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *alldevsp = devlist; 424478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return (ret); 425478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 426