]>
The Tcpdump Group git mirrors - libpcap/blob - inet.c
1 /* -*- Mode: c; tab-width: 8; indent-tabs-mode: 1; c-basic-offset: 8; -*- */
3 * Copyright (c) 1994, 1995, 1996, 1997, 1998
4 * The Regents of the University of California. All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed by the Computer Systems
17 * Engineering Group at Lawrence Berkeley Laboratory.
18 * 4. Neither the name of the University nor of the Laboratory may be used
19 * to endorse or promote products derived from this software without
20 * specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 static const char rcsid
[] =
37 "@(#) $Header: /tcpdump/master/libpcap/inet.c,v 1.43 2001-10-28 02:31:49 guy Exp $ (LBL)";
44 #include <sys/param.h>
46 #include <sys/ioctl.h>
47 #include <sys/socket.h>
48 #ifdef HAVE_SYS_SOCKIO_H
49 #include <sys/sockio.h>
51 #include <sys/time.h> /* concession to AIX */
56 #include <netinet/in.h>
68 #define INT_MAX 2147483647
76 #ifdef HAVE_OS_PROTO_H
80 /* Not all systems have IFF_LOOPBACK */
82 #define ISLOOPBACK(name, flags) ((flags) & IFF_LOOPBACK)
84 #define ISLOOPBACK(name, flags) ((name)[0] == 'l' && (name)[1] == 'o' && \
85 (isdigit((unsigned char)((name)[2])) || (name)[2] == '\0'))
91 * In older BSD systems, socket addresses were fixed-length, and
92 * "sizeof (struct sockaddr)" gave the size of the structure.
93 * All addresses fit within a "struct sockaddr".
95 * In newer BSD systems, the socket address is variable-length, and
96 * there's an "sa_len" field giving the length of the structure;
97 * this allows socket addresses to be longer than 2 bytes of family
98 * and 14 bytes of data.
100 * Some commercial UNIXes use the old BSD scheme, and some might use
101 * the new BSD scheme.
103 * GNU libc uses neither scheme, but has an "SA_LEN()" macro that
104 * determines the size based on the address family.
107 #ifdef HAVE_SOCKADDR_SA_LEN
108 #define SA_LEN(addr) ((addr)->sa_len)
109 #else /* HAVE_SOCKADDR_SA_LEN */
110 #define SA_LEN(addr) (sizeof (struct sockaddr))
111 #endif /* HAVE_SOCKADDR_SA_LEN */
114 static struct sockaddr
*
115 dup_sockaddr(struct sockaddr
*sa
)
117 struct sockaddr
*newsa
;
121 if ((newsa
= malloc(size
)) == NULL
)
123 return (memcpy(newsa
, sa
, size
));
127 get_instance(char *name
)
132 if (strcmp(name
, "any") == 0) {
134 * Give the "any" device an artificially high instance
135 * number, so it shows up after all other non-loopback
141 endcp
= name
+ strlen(name
);
142 for (cp
= name
; cp
< endcp
&& !isdigit((unsigned char)*cp
); ++cp
)
145 if (isdigit((unsigned char)*cp
))
153 add_or_find_if(pcap_if_t
**curdev_ret
, pcap_if_t
**alldevs
, char *name
,
154 u_int flags
, char *errbuf
)
157 pcap_if_t
*curdev
, *prevdev
, *nextdev
;
161 * Can we open this interface for live capture?
163 p
= pcap_open_live(name
, 68, 0, 0, errbuf
);
166 * No. Don't bother including it.
167 * Don't treat this as an error, though.
175 * Is there already an entry in the list for this interface?
177 for (curdev
= *alldevs
; curdev
!= NULL
; curdev
= curdev
->next
) {
178 if (strcmp(name
, curdev
->name
) == 0)
179 break; /* yes, we found it */
181 if (curdev
== NULL
) {
183 * No, we didn't find it.
184 * Allocate a new entry.
186 curdev
= malloc(sizeof(pcap_if_t
));
187 if (curdev
== NULL
) {
188 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
189 "malloc: %s", pcap_strerror(errno
));
197 curdev
->name
= malloc(strlen(name
) + 1);
198 strcpy(curdev
->name
, name
);
199 curdev
->description
= NULL
; /* not available */
200 curdev
->addresses
= NULL
; /* list starts out as empty */
202 if (ISLOOPBACK(name
, flags
))
203 curdev
->flags
|= PCAP_IF_LOOPBACK
;
206 * Add it to the list, in the appropriate location.
207 * First, get the instance number of this interface.
209 this_instance
= get_instance(name
);
212 * Now look for the last interface with an instance number
213 * less than or equal to the new interface's instance
214 * number - except that non-loopback interfaces are
215 * arbitrarily treated as having interface numbers less
216 * than those of loopback interfaces, so the loopback
217 * interfaces are put at the end of the list.
219 * We start with "prevdev" being NULL, meaning we're before
220 * the first element in the list.
225 * Get the interface after this one.
227 if (prevdev
== NULL
) {
229 * The next element is the first element.
233 nextdev
= prevdev
->next
;
236 * Are we at the end of the list?
238 if (nextdev
== NULL
) {
240 * Yes - we have to put the new entry
247 * Is the new interface a non-loopback interface
248 * and the next interface a loopback interface?
250 if (!(curdev
->flags
& PCAP_IF_LOOPBACK
) &&
251 (nextdev
->flags
& PCAP_IF_LOOPBACK
)) {
253 * Yes, we should put the new entry
254 * before "nextdev", i.e. after "prevdev".
260 * Is the new interface's instance number less
261 * than the next interface's instance number,
262 * and is it the case that the new interface is a
263 * non-loopback interface or the next interface is
264 * a loopback interface?
266 * (The goal of both loopback tests is to make
267 * sure that we never put a loopback interface
268 * before any non-loopback interface and that we
269 * always put a non-loopback interface before all
270 * loopback interfaces.)
272 if (this_instance
< get_instance(nextdev
->name
) &&
273 (!(curdev
->flags
& PCAP_IF_LOOPBACK
) ||
274 (nextdev
->flags
& PCAP_IF_LOOPBACK
))) {
276 * Yes - we should put the new entry
277 * before "nextdev", i.e. after "prevdev".
286 * Insert before "nextdev".
288 curdev
->next
= nextdev
;
291 * Insert after "prevdev" - unless "prevdev" is null,
292 * in which case this is the first interface.
294 if (prevdev
== NULL
) {
296 * This is the first interface. Pass back a
297 * pointer to it, and put "curdev" before
302 prevdev
->next
= curdev
;
305 *curdev_ret
= curdev
;
310 add_addr_to_iflist(pcap_if_t
**alldevs
, char *name
, u_int flags
,
311 struct sockaddr
*addr
, struct sockaddr
*netmask
,
312 struct sockaddr
*broadaddr
, struct sockaddr
*dstaddr
, char *errbuf
)
315 pcap_addr_t
*curaddr
, *prevaddr
, *nextaddr
;
317 if (add_or_find_if(&curdev
, alldevs
, name
, flags
, errbuf
) == -1) {
323 if (curdev
== NULL
) {
325 * Device wasn't added because it can't be opened.
332 * "curdev" is an entry for this interface; add an entry for this
333 * address to its list of addresses.
335 * Allocate the new entry and fill it in.
337 curaddr
= malloc(sizeof(pcap_addr_t
));
338 if (curaddr
== NULL
) {
339 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
340 "malloc: %s", pcap_strerror(errno
));
344 curaddr
->next
= NULL
;
346 curaddr
->addr
= dup_sockaddr(addr
);
347 if (curaddr
->addr
== NULL
) {
348 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
349 "malloc: %s", pcap_strerror(errno
));
354 curaddr
->addr
= NULL
;
356 if (netmask
!= NULL
) {
357 curaddr
->netmask
= dup_sockaddr(netmask
);
358 if (curaddr
->netmask
== NULL
) {
359 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
360 "malloc: %s", pcap_strerror(errno
));
365 curaddr
->netmask
= NULL
;
367 if (broadaddr
!= NULL
) {
368 curaddr
->broadaddr
= dup_sockaddr(broadaddr
);
369 if (curaddr
->broadaddr
== NULL
) {
370 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
371 "malloc: %s", pcap_strerror(errno
));
376 curaddr
->broadaddr
= NULL
;
378 if (dstaddr
!= NULL
) {
379 curaddr
->dstaddr
= dup_sockaddr(dstaddr
);
380 if (curaddr
->dstaddr
== NULL
) {
381 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
382 "malloc: %s", pcap_strerror(errno
));
387 curaddr
->dstaddr
= NULL
;
390 * Find the end of the list of addresses.
392 for (prevaddr
= curdev
->addresses
; prevaddr
!= NULL
; prevaddr
= nextaddr
) {
393 nextaddr
= prevaddr
->next
;
394 if (nextaddr
== NULL
) {
396 * This is the end of the list.
402 if (prevaddr
== NULL
) {
404 * The list was empty; this is the first member.
406 curdev
->addresses
= curaddr
;
409 * "prevaddr" is the last member of the list; append
412 prevaddr
->next
= curaddr
;
419 pcap_add_if(pcap_if_t
**devlist
, char *name
, u_int flags
, char *errbuf
)
423 return (add_or_find_if(&curdev
, devlist
, name
, flags
, errbuf
));
427 * Get a list of all interfaces that are up and that we can open.
428 * Returns -1 on error, 0 otherwise.
429 * The list, as returned through "alldevsp", may be null if no interfaces
430 * were up and could be opened.
432 #ifdef HAVE_IFADDRS_H
434 pcap_findalldevs(pcap_if_t
**alldevsp
, char *errbuf
)
436 pcap_if_t
*devlist
= NULL
;
437 struct ifaddrs
*ifap
, *ifa
;
438 struct sockaddr
*broadaddr
, *dstaddr
;
442 * Get the list of interface addresses.
444 * Note: this won't return information about interfaces
445 * with no addresses; are there any such interfaces
446 * that would be capable of receiving packets?
447 * (Interfaces incapable of receiving packets aren't
448 * very interesting from libpcap's point of view.)
450 * LAN interfaces will probably have link-layer
451 * addresses; I don't know whether all implementations
452 * of "getifaddrs()" now, or in the future, will return
455 if (getifaddrs(&ifap
) != 0) {
456 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
457 "getifaddrs: %s", pcap_strerror(errno
));
460 for (ifa
= ifap
; ifa
!= NULL
; ifa
= ifa
->ifa_next
) {
462 * Is this interface up?
464 if (!(ifa
->ifa_flags
& IFF_UP
)) {
466 * No, so don't add it to the list.
472 * "ifa_broadaddr" may be non-null even on
473 * non-broadcast interfaces; "ifa_dstaddr"
474 * was, on at least one FreeBSD 4.1 system,
475 * non-null on a non-point-to-point
478 if (ifa
->ifa_flags
& IFF_BROADCAST
)
479 broadaddr
= ifa
->ifa_broadaddr
;
482 if (ifa
->ifa_flags
& IFF_POINTOPOINT
)
483 dstaddr
= ifa
->ifa_dstaddr
;
488 * Add information for this address to the list.
490 if (add_addr_to_iflist(&devlist
, ifa
->ifa_name
,
491 ifa
->ifa_flags
, ifa
->ifa_addr
, ifa
->ifa_netmask
,
492 broadaddr
, dstaddr
, errbuf
) < 0) {
502 * We haven't had any errors yet; add the "any" device,
505 if (pcap_add_if(&devlist
, "any", 0, errbuf
) < 0)
511 * We had an error; free the list we've been constructing.
513 if (devlist
!= NULL
) {
514 pcap_freealldevs(devlist
);
522 #else /* HAVE_IFADDRS_H */
523 #ifdef HAVE_PROC_NET_DEV
525 * Get from "/proc/net/dev" all interfaces listed there; if they're
526 * already in the list of interfaces we have, that won't add another
527 * instance, but if they're not, that'll add them.
529 * We don't bother getting any addresses for them; it appears you can't
530 * use SIOCGIFADDR on Linux to get IPv6 addresses for interfaces, and,
531 * although some other types of addresses can be fetched with SIOCGIFADDR,
532 * we don't bother with them for now.
534 * We also don't fail if we couldn't open "/proc/net/dev"; we just leave
535 * the list of interfaces as is.
538 scan_proc_net_dev(pcap_if_t
**devlistp
, int fd
, char *errbuf
)
544 char name
[512]; /* XXX - pick a size */
546 struct ifreq ifrflags
;
549 proc_net_f
= fopen("/proc/net/dev", "r");
550 if (proc_net_f
== NULL
)
554 fgets(linebuf
, sizeof linebuf
, proc_net_f
) != NULL
; linenum
++) {
556 * Skip the first two lines - they're headers.
564 * Skip leading white space.
566 while (*p
!= '\0' && isspace(*p
))
568 if (*p
== '\0' || *p
== '\n')
569 continue; /* blank line */
572 * Get the interface name.
575 while (*p
!= '\0' && !isspace(*p
)) {
578 * This could be the separator between a
579 * name and an alias number, or it could be
580 * the separator between a name with no
581 * alias number and the next field.
583 * If there's a colon after digits, it
584 * separates the name and the alias number,
585 * otherwise it separates the name and the
593 * That was the next field,
594 * not the alias number.
605 * Get the flags for this interface, and skip it if
608 strncpy(ifrflags
.ifr_name
, name
, sizeof(ifrflags
.ifr_name
));
609 if (ioctl(fd
, SIOCGIFFLAGS
, (char *)&ifrflags
) < 0) {
612 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
613 "SIOCGIFFLAGS: %.*s: %s",
614 (int)sizeof(ifrflags
.ifr_name
),
616 pcap_strerror(errno
));
620 if (!(ifrflags
.ifr_flags
& IFF_UP
))
624 * Add an entry for this interface, with no addresses.
626 if (pcap_add_if(devlistp
, name
, ifrflags
.ifr_flags
, errbuf
) == -1) {
636 * Well, we didn't fail for any other reason; did we
637 * fail due to an error reading the file?
639 if (ferror(proc_net_f
)) {
640 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
641 "Error reading /proc/net/dev: %s",
642 pcap_strerror(errno
));
647 (void)fclose(proc_net_f
);
650 #endif /* HAVE_PROC_NET_DEV */
653 pcap_findalldevs(pcap_if_t
**alldevsp
, char *errbuf
)
655 pcap_if_t
*devlist
= NULL
;
657 register struct ifreq
*ifrp
, *ifend
, *ifnext
;
662 struct ifreq ifrflags
, ifrnetmask
, ifrbroadaddr
, ifrdstaddr
;
663 struct sockaddr
*netmask
, *broadaddr
, *dstaddr
;
667 * Create a socket from which to fetch the list of interfaces.
669 fd
= socket(AF_INET
, SOCK_DGRAM
, 0);
671 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
672 "socket: %s", pcap_strerror(errno
));
677 * Start with an 8K buffer, and keep growing the buffer until
678 * we get the entire interface list or fail to get it for some
679 * reason other than EINVAL (which is presumed here to mean
680 * "buffer is too small").
684 buf
= malloc(buf_size
);
686 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
687 "malloc: %s", pcap_strerror(errno
));
692 ifc
.ifc_len
= buf_size
;
694 memset(buf
, 0, buf_size
);
695 if (ioctl(fd
, SIOCGIFCONF
, (char *)&ifc
) < 0
696 && errno
!= EINVAL
) {
697 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
698 "SIOCGIFCONF: %s", pcap_strerror(errno
));
703 if (ifc
.ifc_len
< buf_size
)
709 ifrp
= (struct ifreq
*)buf
;
710 ifend
= (struct ifreq
*)(buf
+ ifc
.ifc_len
);
712 for (; ifrp
< ifend
; ifrp
= ifnext
) {
713 n
= SA_LEN(&ifrp
->ifr_addr
) + sizeof(ifrp
->ifr_name
);
714 if (n
< sizeof(*ifrp
))
717 ifnext
= (struct ifreq
*)((char *)ifrp
+ n
);
720 * Get the flags for this interface, and skip it if it's
723 strncpy(ifrflags
.ifr_name
, ifrp
->ifr_name
,
724 sizeof(ifrflags
.ifr_name
));
725 if (ioctl(fd
, SIOCGIFFLAGS
, (char *)&ifrflags
) < 0) {
728 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
729 "SIOCGIFFLAGS: %.*s: %s",
730 (int)sizeof(ifrflags
.ifr_name
),
732 pcap_strerror(errno
));
736 if (!(ifrflags
.ifr_flags
& IFF_UP
))
740 * Get the netmask for this address on this interface.
742 strncpy(ifrnetmask
.ifr_name
, ifrp
->ifr_name
,
743 sizeof(ifrnetmask
.ifr_name
));
744 memcpy(&ifrnetmask
.ifr_addr
, &ifrp
->ifr_addr
,
745 sizeof(ifrnetmask
.ifr_addr
));
746 if (ioctl(fd
, SIOCGIFNETMASK
, (char *)&ifrnetmask
) < 0) {
747 if (errno
== EADDRNOTAVAIL
) {
753 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
754 "SIOCGIFNETMASK: %.*s: %s",
755 (int)sizeof(ifrnetmask
.ifr_name
),
757 pcap_strerror(errno
));
762 netmask
= &ifrnetmask
.ifr_addr
;
765 * Get the broadcast address for this address on this
766 * interface (if any).
768 if (ifrflags
.ifr_flags
& IFF_BROADCAST
) {
769 strncpy(ifrbroadaddr
.ifr_name
, ifrp
->ifr_name
,
770 sizeof(ifrbroadaddr
.ifr_name
));
771 memcpy(&ifrbroadaddr
.ifr_addr
, &ifrp
->ifr_addr
,
772 sizeof(ifrbroadaddr
.ifr_addr
));
773 if (ioctl(fd
, SIOCGIFBRDADDR
,
774 (char *)&ifrbroadaddr
) < 0) {
775 if (errno
== EADDRNOTAVAIL
) {
781 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
782 "SIOCGIFBRDADDR: %.*s: %s",
783 (int)sizeof(ifrbroadaddr
.ifr_name
),
784 ifrbroadaddr
.ifr_name
,
785 pcap_strerror(errno
));
790 broadaddr
= &ifrbroadaddr
.ifr_broadaddr
;
793 * Not a broadcast interface, so no broadcast
800 * Get the destination address for this address on this
801 * interface (if any).
803 if (ifrflags
.ifr_flags
& IFF_POINTOPOINT
) {
804 strncpy(ifrdstaddr
.ifr_name
, ifrp
->ifr_name
,
805 sizeof(ifrdstaddr
.ifr_name
));
806 memcpy(&ifrdstaddr
.ifr_addr
, &ifrp
->ifr_addr
,
807 sizeof(ifrdstaddr
.ifr_addr
));
808 if (ioctl(fd
, SIOCGIFDSTADDR
,
809 (char *)&ifrdstaddr
) < 0) {
810 if (errno
== EADDRNOTAVAIL
) {
816 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
817 "SIOCGIFDSTADDR: %.*s: %s",
818 (int)sizeof(ifrdstaddr
.ifr_name
),
820 pcap_strerror(errno
));
825 dstaddr
= &ifrdstaddr
.ifr_dstaddr
;
830 * Add information for this address to the list.
832 if (add_addr_to_iflist(&devlist
, ifrp
->ifr_name
,
833 ifrflags
.ifr_flags
, &ifrp
->ifr_addr
,
834 netmask
, broadaddr
, dstaddr
, errbuf
) < 0) {
841 #ifdef HAVE_PROC_NET_DEV
844 * We haven't had any errors yet; now read "/proc/net/dev",
845 * and add to the list of interfaces all interfaces listed
846 * there that we don't already have, because, on Linux,
847 * SIOCGIFCONF reports only interfaces with IPv4 addresses,
848 * so you need to read "/proc/net/dev" to get the names of
849 * the rest of the interfaces.
851 ret
= scan_proc_net_dev(&devlist
, fd
, errbuf
);
858 * We haven't had any errors yet; add the "any" device,
861 if (pcap_add_if(&devlist
, "any", 0, errbuf
) < 0) {
863 * Oops, we had a fatal error.
871 * We had an error; free the list we've been constructing.
873 if (devlist
!= NULL
) {
874 pcap_freealldevs(devlist
);
882 #endif /* HAVE_IFADDRS_H */
885 * Free a list of interfaces.
888 pcap_freealldevs(pcap_if_t
*alldevs
)
890 pcap_if_t
*curdev
, *nextdev
;
891 pcap_addr_t
*curaddr
, *nextaddr
;
893 for (curdev
= alldevs
; curdev
!= NULL
; curdev
= nextdev
) {
894 nextdev
= curdev
->next
;
897 * Free all addresses.
899 for (curaddr
= curdev
->addresses
; curaddr
!= NULL
; curaddr
= nextaddr
) {
900 nextaddr
= curaddr
->next
;
903 if (curaddr
->netmask
)
904 free(curaddr
->netmask
);
905 if (curaddr
->broadaddr
)
906 free(curaddr
->broadaddr
);
907 if (curaddr
->dstaddr
)
908 free(curaddr
->dstaddr
);
913 * Free the name string.
918 * Free the description string, if any.
920 if (curdev
->description
!= NULL
)
921 free(curdev
->description
);
924 * Free the interface.
931 * Return the name of a network interface attached to the system, or NULL
932 * if none can be found. The interface must be configured up; the
933 * lowest unit number is preferred; loopback is ignored.
936 pcap_lookupdev(errbuf
)
937 register char *errbuf
;
940 /* for old BSD systems, including bsdi3 */
942 #define IF_NAMESIZE IFNAMSIZ
944 static char device
[IF_NAMESIZE
+ 1];
947 if (pcap_findalldevs(&alldevs
, errbuf
) == -1)
950 if (alldevs
== NULL
|| (alldevs
->flags
& PCAP_IF_LOOPBACK
)) {
952 * There are no devices on the list, or the first device
953 * on the list is a loopback device, which means there
954 * are no non-loopback devices on the list. This means
955 * we can't return any device.
957 * XXX - why not return a loopback device? If we can't
958 * capture on it, it won't be on the list, and if it's
959 * on the list, there aren't any non-loopback devices,
960 * so why not just supply it as the default device?
962 (void)strlcpy(errbuf
, "no suitable device found",
967 * Return the name of the first device on the list.
969 (void)strlcpy(device
, alldevs
->name
, sizeof(device
));
973 pcap_freealldevs(alldevs
);
978 pcap_lookupnet(device
, netp
, maskp
, errbuf
)
979 register char *device
;
980 register bpf_u_int32
*netp
, *maskp
;
981 register char *errbuf
;
984 register struct sockaddr_in
*sin
;
988 * The pseudo-device "any" listens on all interfaces and therefore
989 * has the network address and -mask "0.0.0.0" therefore catching
990 * all traffic. Using NULL for the interface is the same as "any".
992 if (!device
|| strcmp(device
, "any") == 0) {
997 fd
= socket(AF_INET
, SOCK_DGRAM
, 0);
999 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "socket: %s",
1000 pcap_strerror(errno
));
1003 memset(&ifr
, 0, sizeof(ifr
));
1005 /* XXX Work around Linux kernel bug */
1006 ifr
.ifr_addr
.sa_family
= AF_INET
;
1008 (void)strncpy(ifr
.ifr_name
, device
, sizeof(ifr
.ifr_name
));
1009 if (ioctl(fd
, SIOCGIFADDR
, (char *)&ifr
) < 0) {
1010 if (errno
== EADDRNOTAVAIL
) {
1011 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
1012 "%s: no IPv4 address assigned", device
);
1014 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
1015 "SIOCGIFADDR: %s: %s",
1016 device
, pcap_strerror(errno
));
1021 sin
= (struct sockaddr_in
*)&ifr
.ifr_addr
;
1022 *netp
= sin
->sin_addr
.s_addr
;
1023 if (ioctl(fd
, SIOCGIFNETMASK
, (char *)&ifr
) < 0) {
1024 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
1025 "SIOCGIFNETMASK: %s: %s", device
, pcap_strerror(errno
));
1030 *maskp
= sin
->sin_addr
.s_addr
;
1032 if (IN_CLASSA(*netp
))
1033 *maskp
= IN_CLASSA_NET
;
1034 else if (IN_CLASSB(*netp
))
1035 *maskp
= IN_CLASSB_NET
;
1036 else if (IN_CLASSC(*netp
))
1037 *maskp
= IN_CLASSC_NET
;
1039 (void)snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
1040 "inet class for 0x%x unknown", *netp
);