/* * Try to get a description for a given device, and then look for that * device in the specified list of devices. * * If we find it, then, if the specified address isn't null, add it to * the list of addresses for the device and return 0. * * If we don't find it, check whether we can open it: * * If that fails with PCAP_ERROR_NO_SUCH_DEVICE or * PCAP_ERROR_IFACE_NOT_UP, don't attempt to add an entry for * it, as that probably means it exists but doesn't support * packet capture. * * Otherwise, attempt to add an entry for it, with the specified * ifnet flags and description, and, if that succeeds, add the * specified address to its list of addresses if that address is * non-null, set *curdev_ret to point to the new entry, and * return 0, otherwise return PCAP_ERROR and set errbuf to an * error message. * * (We can get called with a null address because we might get a list * of interface name/address combinations from the underlying OS, with * the address being absent in some cases, rather than a list of * interfaces with each interface having a list of addresses, so this * call may be the only call made to add to the list, and we want to * add interfaces even if they have no addresses.) */ int add_addr_to_iflist(pcap_if_t **alldevs, const char *name, u_int flags, struct sockaddr *addr, size_t addr_size, struct sockaddr *netmask, size_t netmask_size, struct sockaddr *broadaddr, size_t broadaddr_size, struct sockaddr *dstaddr, size_t dstaddr_size, char *errbuf) { char *description; pcap_if_t *curdev; description = get_if_description(name); if (add_or_find_if(&curdev, alldevs, name, flags, description, errbuf) == -1) { free(description); /* * Error - give up. */ return (-1); } free(description); if (curdev == NULL) { /* * Device wasn't added because it can't be opened. * Not a fatal error. */ return (0); } if (addr == NULL) { /* * There's no address to add; this entry just meant * "here's a new interface". */ return (0); } /* * "curdev" is an entry for this interface, and we have an * address for it; add an entry for that address to the * interface's list of addresses. * * Allocate the new entry and fill it in. */ return (add_addr_to_dev(curdev, addr, addr_size, netmask, netmask_size, broadaddr, broadaddr_size, dstaddr, dstaddr_size, errbuf)); }
static int pcap_add_if_win32(pcap_if_t **devlist, char *name, const char *desc, char *errbuf) { pcap_if_t *curdev; npf_if_addr if_addrs[MAX_NETWORK_ADDRESSES]; LONG if_addr_size; int res = 0; if_addr_size = MAX_NETWORK_ADDRESSES; /* * Add an entry for this interface, with no addresses. */ if (add_or_find_if(&curdev, devlist, name, 0, desc, errbuf) == -1) { /* * Failure. */ return (-1); } /* * Get the list of addresses for the interface. */ if (!PacketGetNetInfoEx((void *)name, if_addrs, &if_addr_size)) { /* * Failure. * * We don't return an error, because this can happen with * NdisWan interfaces, and we want to supply them even * if we can't supply their addresses. * * We return an entry with an empty address list. */ return (0); } /* * Now add the addresses. */ while (if_addr_size-- > 0) { /* * "curdev" is an entry for this interface; add an entry for * this address to its list of addresses. */ if(curdev == NULL) break; res = add_addr_to_dev(curdev, (struct sockaddr *)&if_addrs[if_addr_size].IPAddress, sizeof (struct sockaddr_storage), (struct sockaddr *)&if_addrs[if_addr_size].SubnetMask, sizeof (struct sockaddr_storage), (struct sockaddr *)&if_addrs[if_addr_size].Broadcast, sizeof (struct sockaddr_storage), NULL, 0, errbuf); if (res == -1) { /* * Failure. */ break; } } return (res); }