inet.c (39291) | inet.c (56889) |
---|---|
1/* 2 * Copyright (c) 1994, 1995, 1996, 1997, 1998 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 19 unchanged lines hidden (view full) --- 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#ifndef lint 35static const char rcsid[] = | 1/* 2 * Copyright (c) 1994, 1995, 1996, 1997, 1998 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 19 unchanged lines hidden (view full) --- 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#ifndef lint 35static const char rcsid[] = |
36 "@(#) $Header: inet.c,v 1.22 98/01/30 17:29:34 leres Exp $ (LBL)"; | 36 "@(#) $Header: /tcpdump/master/libpcap/inet.c,v 1.24.2.1 2000/01/14 18:00:50 mcr Exp $ (LBL)"; |
37#endif 38 39#include <sys/param.h> 40#include <sys/file.h> 41#include <sys/ioctl.h> 42#include <sys/socket.h> 43#ifdef HAVE_SYS_SOCKIO_H 44#include <sys/sockio.h> --- 39 unchanged lines hidden (view full) --- 84char * 85pcap_lookupdev(errbuf) 86 register char *errbuf; 87{ 88 register int fd, minunit, n; 89 register char *cp; 90 register struct ifreq *ifrp, *ifend, *ifnext, *mp; 91 struct ifconf ifc; | 37#endif 38 39#include <sys/param.h> 40#include <sys/file.h> 41#include <sys/ioctl.h> 42#include <sys/socket.h> 43#ifdef HAVE_SYS_SOCKIO_H 44#include <sys/sockio.h> --- 39 unchanged lines hidden (view full) --- 84char * 85pcap_lookupdev(errbuf) 86 register char *errbuf; 87{ 88 register int fd, minunit, n; 89 register char *cp; 90 register struct ifreq *ifrp, *ifend, *ifnext, *mp; 91 struct ifconf ifc; |
92 struct ifreq ibuf[16], ifr; | 92 char *buf; 93 struct ifreq ifr; |
93 static char device[sizeof(ifrp->ifr_name) + 1]; | 94 static char device[sizeof(ifrp->ifr_name) + 1]; |
95 unsigned buf_size; |
|
94 95 fd = socket(AF_INET, SOCK_DGRAM, 0); 96 if (fd < 0) { 97 (void)sprintf(errbuf, "socket: %s", pcap_strerror(errno)); 98 return (NULL); 99 } | 96 97 fd = socket(AF_INET, SOCK_DGRAM, 0); 98 if (fd < 0) { 99 (void)sprintf(errbuf, "socket: %s", pcap_strerror(errno)); 100 return (NULL); 101 } |
100 ifc.ifc_len = sizeof ibuf; 101 ifc.ifc_buf = (caddr_t)ibuf; | |
102 | 102 |
103 memset((char *)ibuf, 0, sizeof(ibuf)); 104 if (ioctl(fd, SIOCGIFCONF, (char *)&ifc) < 0 || 105 ifc.ifc_len < sizeof(struct ifreq)) { 106 (void)sprintf(errbuf, "SIOCGIFCONF: %s", pcap_strerror(errno)); 107 (void)close(fd); 108 return (NULL); | 103 buf_size = 8192; 104 105 for (;;) { 106 buf = malloc (buf_size); 107 if (buf == NULL) { 108 close (fd); 109 (void)sprintf(errbuf, "out of memory"); 110 return (NULL); 111 } 112 113 ifc.ifc_len = buf_size; 114 ifc.ifc_buf = buf; 115 memset (buf, 0, buf_size); 116 if (ioctl(fd, SIOCGIFCONF, (char *)&ifc) < 0) { 117 free (buf); 118 (void)sprintf(errbuf, "SIOCGIFCONF: %s", 119 pcap_strerror(errno)); 120 (void)close(fd); 121 return (NULL); 122 } 123 if (ifc.ifc_len < buf_size) 124 break; 125 free (buf); 126 buf_size *= 2; |
109 } | 127 } |
110 ifrp = ibuf; 111 ifend = (struct ifreq *)((char *)ibuf + ifc.ifc_len); | |
112 | 128 |
129 ifrp = (struct ifreq *)buf; 130 ifend = (struct ifreq *)(buf + ifc.ifc_len); 131 |
|
113 mp = NULL; 114 minunit = 666; 115 for (; ifrp < ifend; ifrp = ifnext) { 116#ifdef HAVE_SOCKADDR_SA_LEN 117 n = ifrp->ifr_addr.sa_len + sizeof(ifrp->ifr_name); 118 if (n < sizeof(*ifrp)) 119 ifnext = ifrp + 1; 120 else --- 12 unchanged lines hidden (view full) --- 133 strncpy(ifr.ifr_name, ifrp->ifr_name, sizeof(ifr.ifr_name)); 134 if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifr) < 0) { 135 if (errno == ENXIO) 136 continue; 137 (void)sprintf(errbuf, "SIOCGIFFLAGS: %.*s: %s", 138 (int)sizeof(ifr.ifr_name), ifr.ifr_name, 139 pcap_strerror(errno)); 140 (void)close(fd); | 132 mp = NULL; 133 minunit = 666; 134 for (; ifrp < ifend; ifrp = ifnext) { 135#ifdef HAVE_SOCKADDR_SA_LEN 136 n = ifrp->ifr_addr.sa_len + sizeof(ifrp->ifr_name); 137 if (n < sizeof(*ifrp)) 138 ifnext = ifrp + 1; 139 else --- 12 unchanged lines hidden (view full) --- 152 strncpy(ifr.ifr_name, ifrp->ifr_name, sizeof(ifr.ifr_name)); 153 if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifr) < 0) { 154 if (errno == ENXIO) 155 continue; 156 (void)sprintf(errbuf, "SIOCGIFFLAGS: %.*s: %s", 157 (int)sizeof(ifr.ifr_name), ifr.ifr_name, 158 pcap_strerror(errno)); 159 (void)close(fd); |
160 free (buf); |
|
141 return (NULL); 142 } 143 144 /* Must be up and not the loopback */ 145 if ((ifr.ifr_flags & IFF_UP) == 0 || ISLOOPBACK(&ifr)) 146 continue; 147 148 for (cp = ifrp->ifr_name; !isdigit(*cp); ++cp) 149 continue; 150 n = atoi(cp); 151 if (n < minunit) { 152 minunit = n; 153 mp = ifrp; 154 } 155 } | 161 return (NULL); 162 } 163 164 /* Must be up and not the loopback */ 165 if ((ifr.ifr_flags & IFF_UP) == 0 || ISLOOPBACK(&ifr)) 166 continue; 167 168 for (cp = ifrp->ifr_name; !isdigit(*cp); ++cp) 169 continue; 170 n = atoi(cp); 171 if (n < minunit) { 172 minunit = n; 173 mp = ifrp; 174 } 175 } |
176 free(buf); |
|
156 (void)close(fd); 157 if (mp == NULL) { 158 (void)strcpy(errbuf, "no suitable device found"); 159 return (NULL); 160 } 161 162 (void)strncpy(device, mp->ifr_name, sizeof(device) - 1); 163 device[sizeof(device) - 1] = '\0'; --- 17 unchanged lines hidden (view full) --- 181 } 182 memset(&ifr, 0, sizeof(ifr)); 183#ifdef linux 184 /* XXX Work around Linux kernel bug */ 185 ifr.ifr_addr.sa_family = AF_INET; 186#endif 187 (void)strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name)); 188 if (ioctl(fd, SIOCGIFADDR, (char *)&ifr) < 0) { | 177 (void)close(fd); 178 if (mp == NULL) { 179 (void)strcpy(errbuf, "no suitable device found"); 180 return (NULL); 181 } 182 183 (void)strncpy(device, mp->ifr_name, sizeof(device) - 1); 184 device[sizeof(device) - 1] = '\0'; --- 17 unchanged lines hidden (view full) --- 202 } 203 memset(&ifr, 0, sizeof(ifr)); 204#ifdef linux 205 /* XXX Work around Linux kernel bug */ 206 ifr.ifr_addr.sa_family = AF_INET; 207#endif 208 (void)strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name)); 209 if (ioctl(fd, SIOCGIFADDR, (char *)&ifr) < 0) { |
189 (void)sprintf(errbuf, "SIOCGIFADDR: %s: %s", 190 device, pcap_strerror(errno)); | 210 if (errno == EADDRNOTAVAIL) { 211 (void)sprintf(errbuf, "%s: no IPv4 address assigned", 212 device); 213 } else { 214 (void)sprintf(errbuf, "SIOCGIFADDR: %s: %s", 215 device, pcap_strerror(errno)); 216 } |
191 (void)close(fd); 192 return (-1); 193 } 194 sin = (struct sockaddr_in *)&ifr.ifr_addr; 195 *netp = sin->sin_addr.s_addr; 196 if (ioctl(fd, SIOCGIFNETMASK, (char *)&ifr) < 0) { 197 (void)sprintf(errbuf, "SIOCGIFNETMASK: %s: %s", 198 device, pcap_strerror(errno)); --- 21 unchanged lines hidden --- | 217 (void)close(fd); 218 return (-1); 219 } 220 sin = (struct sockaddr_in *)&ifr.ifr_addr; 221 *netp = sin->sin_addr.s_addr; 222 if (ioctl(fd, SIOCGIFNETMASK, (char *)&ifr) < 0) { 223 (void)sprintf(errbuf, "SIOCGIFNETMASK: %s: %s", 224 device, pcap_strerror(errno)); --- 21 unchanged lines hidden --- |