* could be opened.
*/
int
-pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf,
+pcap_findalldevs_interfaces(pcap_if_list_t *devlistp, char *errbuf,
int (*check_usable)(const char *))
{
- pcap_if_t *devlist = NULL;
struct ifaddrs *ifap, *ifa;
struct sockaddr *addr, *netmask, *broadaddr, *dstaddr;
size_t addr_size, broadaddr_size, dstaddr_size;
/*
* Add information for this address to the list.
*/
- if (add_addr_to_iflist(&devlist, ifa->ifa_name,
+ if (add_addr_to_iflist(devlistp, ifa->ifa_name,
if_flags_to_pcap_flags(ifa->ifa_name, ifa->ifa_flags),
addr, addr_size, netmask, addr_size,
broadaddr, broadaddr_size, dstaddr, dstaddr_size,
freeifaddrs(ifap);
- if (ret == -1) {
- /*
- * We had an error; free the list we've been constructing.
- */
- if (devlist != NULL) {
- pcap_freealldevs(devlist);
- devlist = NULL;
- }
- }
-
- *alldevsp = devlist;
return (ret);
}
* we already have that.
*/
int
-pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf,
+pcap_findalldevs_interfaces(pcap_if_list_t *devlistp, char *errbuf,
int (*check_usable)(const char *))
{
- pcap_if_t *devlist = NULL;
register int fd;
register struct ifreq *ifrp, *ifend, *ifnext;
size_t n;
/*
* Add information for this address to the list.
*/
- if (add_addr_to_iflist(&devlist, ifrp->ifr_name,
+ if (add_addr_to_iflist(devlistp, ifrp->ifr_name,
if_flags_to_pcap_flags(ifrp->ifr_name, ifrflags.ifr_flags),
&ifrp->ifr_addr, SA_LEN(&ifrp->ifr_addr),
netmask, netmask_size, broadaddr, broadaddr_size,
free(buf);
(void)close(fd);
- if (ret == -1) {
- /*
- * We had an error; free the list we've been constructing.
- */
- if (devlist != NULL) {
- pcap_freealldevs(devlist);
- devlist = NULL;
- }
- }
-
- *alldevsp = devlist;
return (ret);
}
* SIOCGLIFCONF rather than SIOCGIFCONF in order to get IPv6 addresses.)
*/
int
-pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf,
+pcap_findalldevs_interfaces(pcap_if_list_t *devlistp, char *errbuf,
int (*check_usable)(const char *))
{
- pcap_if_t *devlist = NULL;
register int fd4, fd6, fd;
register struct lifreq *ifrp, *ifend;
struct lifnum ifn;
/*
* Add information for this address to the list.
*/
- if (add_addr_to_iflist(&devlist, ifrp->lifr_name,
+ if (add_addr_to_iflist(devlistp, ifrp->lifr_name,
if_flags_to_pcap_flags(ifrp->lifr_name, ifrflags.lifr_flags),
(struct sockaddr *)&ifrp->lifr_addr,
sizeof (struct sockaddr_storage),
(void)close(fd6);
(void)close(fd4);
- if (ret == -1) {
- /*
- * We had an error; free the list we've been constructing.
- */
- if (devlist != NULL) {
- pcap_freealldevs(devlist);
- devlist = NULL;
- }
- }
-
- *alldevsp = devlist;
return (ret);
}
#if defined(__FreeBSD__) && defined(SIOCIFCREATE2)
static int
-finddevs_usb(pcap_if_t **alldevsp, char *errbuf)
+finddevs_usb(pcap_if_list_t *devlistp, char *errbuf)
{
DIR *usbdir;
struct dirent *usbitem;
* so we need to avoid adding multiple capture devices
* for each bus.
*/
- if (find_or_add_dev(alldevsp, name, PCAP_IF_UP, NULL, errbuf) == NULL) {
+ if (find_or_add_dev(devlistp, name, PCAP_IF_UP, NULL, errbuf) == NULL) {
free(name);
closedir(usbdir);
return (PCAP_ERROR);
#endif
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
/*
* Get the list of regular interfaces first.
*/
- if (pcap_findalldevs_interfaces(alldevsp, errbuf, check_bpf_bindable) == -1)
+ if (pcap_findalldevs_interfaces(devlistp, errbuf, check_bpf_bindable) == -1)
return (-1); /* failure */
#if defined(__FreeBSD__) && defined(SIOCIFCREATE2)
- if (finddevs_usb(alldevsp, errbuf) == -1)
+ if (finddevs_usb(devlistp, errbuf) == -1)
return (-1);
#endif
};
int
-bt_findalldevs(pcap_if_t **alldevsp, char *err_str)
+bt_findalldevs(pcap_if_list_t *devlistp, char *err_str)
{
struct hci_dev_list_req *dev_list;
struct hci_dev_req *dev_req;
pcap_snprintf(dev_name, 20, BT_IFACE"%d", dev_req->dev_id);
pcap_snprintf(dev_descr, 30, "Bluetooth adapter number %d", i);
- if (add_dev(alldevsp, dev_name, 0, dev_descr, err_str) == NULL)
+ if (add_dev(devlistp, dev_name, 0, dev_descr, err_str) == NULL)
{
ret = -1;
break;
/*
* Prototypes for Bluetooth-related functions
*/
-int bt_findalldevs(pcap_if_t **alldevsp, char *err_str);
+int bt_findalldevs(pcap_if_list_t *devlistp, char *err_str);
pcap_t *bt_create(const char *device, char *ebuf, int *is_ours);
} __attribute__((packed));
int
-bt_monitor_findalldevs(pcap_if_t **alldevsp, char *err_str)
+bt_monitor_findalldevs(pcap_if_list_t *devlistp, char *err_str)
{
int ret = 0;
- if (add_dev(alldevsp, INTERFACE_NAME, 0,
+ if (add_dev(devlistp, INTERFACE_NAME, 0,
"Bluetooth Linux Monitor", err_str) == NULL)
{
ret = -1;
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-int bt_monitor_findalldevs(pcap_if_t **alldevsp, char *err_str);
+int bt_monitor_findalldevs(pcap_if_list_t *devlistp, char *err_str);
pcap_t *bt_monitor_create(const char *device, char *ebuf, int *is_ours);
* Add all DAG devices.
*/
int
-dag_findalldevs(pcap_if_t **devlistp, char *errbuf)
+dag_findalldevs(pcap_if_list_t *devlistp, char *errbuf)
{
char name[12]; /* XXX - pick a size */
int ret = 0;
* There are no regular interfaces, just DAG interfaces.
*/
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp _U_, char *errbuf)
{
- *alldevsp = NULL;
return (0);
}
*/
pcap_t *dag_create(const char *, char *, int *);
-int dag_findalldevs(pcap_if_t **devlistp, char *errbuf);
+int dag_findalldevs(pcap_if_list_t *devlistp, char *errbuf);
}
int
-dbus_findalldevs(pcap_if_t **alldevsp, char *err_str)
+dbus_findalldevs(pcap_if_list_t *devlistp, char *err_str)
{
- if (add_dev(alldevsp, "dbus-system", 0, "D-Bus system bus", err_str) == NULL)
+ if (add_dev(devlistp, "dbus-system", 0, "D-Bus system bus", err_str) == NULL)
return -1;
- if (add_dev(alldevsp, "dbus-session", 0, "D-Bus session bus", err_str) == NULL)
+ if (add_dev(devlistp, "dbus-session", 0, "D-Bus session bus", err_str) == NULL)
return -1;
return 0;
}
pcap_t *dbus_create(const char *, char *, int *);
-int dbus_findalldevs(pcap_if_t **devlistp, char *errbuf);
+int dbus_findalldevs(pcap_if_list_t *devlistp, char *errbuf);
}
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
#ifdef HAVE_SOLARIS
int fd;
/*
* Get the list of regular interfaces first.
*/
- if (pcap_findalldevs_interfaces(alldevsp, errbuf, is_dlpi_interface) == -1)
+ if (pcap_findalldevs_interfaces(devlistp, errbuf, is_dlpi_interface) == -1)
return (-1); /* failure */
#ifdef HAVE_SOLARIS
}
for (i = 0; i < buf.nunits; i++) {
pcap_snprintf(baname, sizeof baname, "ba%u", i);
- if (add_dev(alldevsp, baname, 0, NULL, errbuf) == NULL)
+ if (add_dev(devlistp, baname, 0, NULL, errbuf) == NULL)
return (-1);
}
#endif
/*
* Get a list of all interfaces that are present and that we probe okay.
* Returns -1 on error, 0 otherwise.
- * The list, as returned through "alldevsp", may be NULL if no interfaces
- * were up and could be opened.
+ * The list may be NULL epty if no interfaces were up and could be opened.
*/
-int pcap_platform_finddevs (pcap_if_t **alldevsp, char *errbuf)
+int pcap_platform_finddevs (pcap_if_list_t *devlistp, char *errbuf)
{
struct device *dev;
+#if 0 /* Pkt drivers should have no addresses */
struct sockaddr_in sa_ll_1, sa_ll_2;
struct sockaddr *addr, *netmask, *broadaddr, *dstaddr;
- pcap_if_t *devlist = NULL;
+#endif
int ret = 0;
- size_t addr_size = sizeof(*addr);
+ int found = 0;
for (dev = (struct device*)dev_base; dev; dev = dev->next)
{
FLUSHK();
(*dev->close) (dev);
+ if (add_dev(devlistp, dev->name, dev->flags,
+ dev->long_name, errbuf) == NULL)
+ {
+ ret = -1;
+ break;
+ }
+ found = 1;
+#if 0 /* Pkt drivers should have no addresses */
memset (&sa_ll_1, 0, sizeof(sa_ll_1));
memset (&sa_ll_2, 0, sizeof(sa_ll_2));
sa_ll_1.sin_family = AF_INET;
broadaddr = (struct sockaddr*) &sa_ll_2;
memset (&sa_ll_2.sin_addr, 0xFF, sizeof(sa_ll_2.sin_addr));
- if (add_dev(&devlist, dev->name, dev->flags,
- dev->long_name, errbuf) == NULL)
- {
- ret = -1;
- break;
- }
-#if 0 /* Pkt drivers should have no addresses */
- if (add_addr_to_dev(curdev, addr, addr_size,
- netmask, addr_size, broadaddr, addr_size,
- dstaddr, addr_size, errbuf) < 0)
+ if (add_addr_to_dev(curdev, addr, sizeof(*addr),
+ netmask, sizeof(*netmask),
+ broadaddr, sizeof(*broadaddr),
+ dstaddr, sizeof(*dstaddr), errbuf) < 0)
{
ret = -1;
break;
#endif
}
- if (devlist && ret < 0)
- {
- pcap_freealldevs (devlist);
- devlist = NULL;
- }
- else
- if (!devlist)
+ if (ret == 0 && !found)
strcpy (errbuf, "No drivers found");
- *alldevsp = devlist;
return (ret);
}
/*
* Internal interfaces for "pcap_findalldevs()".
*
+ * A pcap_if_list_t * is a reference to a list of devices.
+ *
* "pcap_platform_finddevs()" is the platform-dependent routine to
* find local network interfaces.
*
* "find_or_add_dev()" checks whether a device is already in a pcap_if_list_t
* and, if not, adds an entry for it.
*/
-int pcap_platform_finddevs(pcap_if_t **, char *);
+struct pcap_if_list;
+typedef struct pcap_if_list pcap_if_list_t;
+int pcap_platform_finddevs(pcap_if_list_t *, char *);
#if !defined(_WIN32) && !defined(MSDOS)
-int pcap_findalldevs_interfaces(pcap_if_t **, char *,
+int pcap_findalldevs_interfaces(pcap_if_list_t *, char *,
int (*)(const char *));
#endif
-pcap_if_t *find_or_add_dev(pcap_if_t **, const char *, bpf_u_int32,
+pcap_if_t *find_or_add_dev(pcap_if_list_t *, const char *, bpf_u_int32,
const char *, char *);
-pcap_if_t *find_dev(pcap_if_t **, const char *);
-pcap_if_t *add_dev(pcap_if_t **, const char *, bpf_u_int32, const char *,
+pcap_if_t *find_dev(pcap_if_list_t *, const char *);
+pcap_if_t *add_dev(pcap_if_list_t *, const char *, bpf_u_int32, const char *,
char *);
int add_addr_to_dev(pcap_if_t *, struct sockaddr *, size_t,
struct sockaddr *, size_t, struct sockaddr *, size_t,
struct sockaddr *dstaddr, size_t, char *errbuf);
#ifndef _WIN32
bpf_u_int32 if_flags_to_pcap_flags(const char *, u_int);
-int add_addr_to_iflist(pcap_if_t **, const char *, bpf_u_int32,
+int add_addr_to_iflist(pcap_if_list_t *, const char *, bpf_u_int32,
struct sockaddr *, size_t, struct sockaddr *, size_t,
struct sockaddr *, size_t, struct sockaddr *, size_t, char *);
#endif
* additional network links present in the system.
*/
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
int retv = 0;
/*
* Get the list of regular interfaces first.
*/
- if (pcap_findalldevs_interfaces(alldevsp, errbuf, is_dlpi_interface) == -1)
+ if (pcap_findalldevs_interfaces(devlistp, errbuf,
+ is_dlpi_interface) == -1)
return (-1); /* failure */
/* dlpi_walk() for loopback will be added here. */
* If it isn't already in the list of devices, try to
* add it.
*/
- if (find_or_add_dev(alldevsp, entry->linkname, 0, NULL, errbuf) == NULL)
+ if (find_or_add_dev(devlistp, entry->linkname, 0, NULL,
+ errbuf) == NULL)
retv = -1;
}
done:
}
static int
-add_linux_if(pcap_if_t **devlistp, const char *ifname, int fd, char *errbuf)
+add_linux_if(pcap_if_list_t *devlistp, const char *ifname, int fd, char *errbuf)
{
const char *p;
char name[512]; /* XXX - pick a size */
* Otherwise, we return 1 if we don't get an error and -1 if we do.
*/
static int
-scan_sys_class_net(pcap_if_t **devlistp, char *errbuf)
+scan_sys_class_net(pcap_if_list_t *devlistp, char *errbuf)
{
DIR *sys_class_net_d;
int fd;
* See comments from scan_sys_class_net().
*/
static int
-scan_proc_net_dev(pcap_if_t **devlistp, char *errbuf)
+scan_proc_net_dev(pcap_if_list_t *devlistp, char *errbuf)
{
FILE *proc_net_f;
int fd;
}
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
int ret;
/*
* Get the list of regular interfaces first.
*/
- if (pcap_findalldevs_interfaces(alldevsp, errbuf, can_be_bound) == -1)
+ if (pcap_findalldevs_interfaces(devlistp, errbuf, can_be_bound) == -1)
return (-1); /* failure */
/*
* interfaces with no addresses, so you need to read "/sys/class/net"
* to get the names of the rest of the interfaces.
*/
- ret = scan_sys_class_net(alldevsp, errbuf);
+ ret = scan_sys_class_net(devlistp, errbuf);
if (ret == -1)
return (-1); /* failed */
if (ret == 0) {
/*
* No /sys/class/net; try reading /proc/net/dev instead.
*/
- if (scan_proc_net_dev(alldevsp, errbuf) == -1)
+ if (scan_proc_net_dev(devlistp, errbuf) == -1)
return (-1);
}
/*
* Add the "any" device.
*/
- if (add_dev(alldevsp, "any", PCAP_IF_UP|PCAP_IF_RUNNING,
+ if (add_dev(devlistp, "any", PCAP_IF_UP|PCAP_IF_RUNNING,
any_descr, errbuf) == NULL)
return (-1);
}
int
-netfilter_findalldevs(pcap_if_t **alldevsp, char *err_str)
+netfilter_findalldevs(pcap_if_list_t *devlistp, char *err_str)
{
int sock;
}
close(sock);
- if (add_dev(alldevsp, NFLOG_IFACE, 0, "Linux netfilter log (NFLOG) interface", err_str) == NULL)
+ if (add_dev(devlistp, NFLOG_IFACE, 0, "Linux netfilter log (NFLOG) interface", err_str) == NULL)
return -1;
- if (add_dev(alldevsp, NFQUEUE_IFACE, 0, "Linux netfilter queue (NFQUEUE) interface", err_str) == NULL)
+ if (add_dev(devlistp, NFQUEUE_IFACE, 0, "Linux netfilter queue (NFQUEUE) interface", err_str) == NULL)
return -1;
return 0;
}
/*
* Prototypes for netlink-related functions
*/
-int netfilter_findalldevs(pcap_if_t **alldevsp, char *err_str);
+int netfilter_findalldevs(pcap_if_list_t *devlistp, char *err_str);
pcap_t *netfilter_create(const char *device, char *ebuf, int *is_ours);
}
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
- return (pcap_findalldevs_interfaces(alldevsp, errbuf, can_be_bound));
+ return (pcap_findalldevs_interfaces(devlistp, errbuf, can_be_bound));
}
}
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
/*
* There are no interfaces on which we can capture.
*/
- *alldevsp = NULL;
return (0);
}
}
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
- return (pcap_findalldevs_interfaces(alldevsp, errbuf, can_be_bound));
+ return (pcap_findalldevs_interfaces(devlistp, errbuf, can_be_bound));
}
static int
int
-septel_findalldevs(pcap_if_t **devlistp, char *errbuf)
+septel_findalldevs(pcap_if_list_t *devlistp, char *errbuf)
{
if (add_dev(devlistp,"septel",0,"Intel/Septel device",errbuf) == NULL)
return -1;
* There are no regular interfaces, just Septel interfaces.
*/
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
- *alldevsp = NULL;
return (0);
}
*/
pcap_t *septel_create(const char *device, char *ebuf, int *is_ours);
-int septel_findalldevs(pcap_if_t **devlistp, char *errbuf);
+int septel_findalldevs(pcap_if_list_t *devlistp, char *errbuf);
int chassis, geoslot;
unit_t *u;
iface_t *p;
- pcap_if_t *alldevsp;
+ pcap_if_list_t devlist;
- pcap_platform_finddevs(&alldevsp, errbuf);
+ pcap_platform_finddevs(&devlist, errbuf);
for (chassis = 0; chassis <= MAX_CHASSIS; chassis++) { /* scan the table... */
for (geoslot = 0; geoslot <= MAX_GEOSLOT; geoslot++) {
u = &units[chassis][geoslot];
return (p);
}
-int pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf) {
+int pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf) {
//printf("pcap_findalldevs()\n"); // fulko
//printf("pcap_findalldevs() returning BAD after findalldevs\n"); // fulko
return -1;
}
- *alldevsp = acn_if_list;
+ devlistp->beginning = acn_if_list;
acn_if_list = 0; /* then forget our list head, because someone will call pcap_freealldevs() to empty the malloc'ed stuff */
//printf("pcap_findalldevs() returning ZERO OK\n"); // fulko
return 0;
#define MAX_DESC_LENGTH 128
int
-snf_findalldevs(pcap_if_t **devlistp, char *errbuf)
+snf_findalldevs(pcap_if_list_t *devlistp, char *errbuf)
{
pcap_if_t *dev;
struct snf_ifaddrs *ifaddrs, *ifa;
* See if there's already an entry for the device
* with the name ifa->snf_ifa_name.
*/
- dev = find_dev(alldevs, ifa->snf_ifa_name);
+ dev = find_dev(devlistp, ifa->snf_ifa_name);
if (dev != NULL) {
/*
* Yes. Update its description.
/*
* No. Add an entry for it.
*/
- dev = add_dev(alldevs, ifa->snf_ifa_name, 0, desc,
+ dev = add_dev(devlistp, ifa->snf_ifa_name, 0, desc,
errbuf);
if (dev == NULL)
return -1;
(void)pcap_snprintf(name,MAX_DESC_LENGTH,"snf%d",allports);
(void)pcap_snprintf(desc,MAX_DESC_LENGTH,"Myricom Merge Bitmask All Ports snf%d",
allports);
- if (add_dev(alldevs, name, 0, desc, errbuf) == NULL)
+ if (add_dev(devlistp, name, 0, desc, errbuf) == NULL)
return (-1);
/*
* XXX - should we give it a list of addresses with all
* There are no regular interfaces, just SNF interfaces.
*/
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
- *alldevsp = NULL;
return (0);
}
pcap_t *snf_create(const char *, char *, int *);
-int snf_findalldevs(pcap_if_t **devlistp, char *errbuf);
+int snf_findalldevs(pcap_if_list_t *devlistp, char *errbuf);
}
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
- return (pcap_findalldevs_interfaces(alldevsp, errbuf, can_be_bound));
+ return (pcap_findalldevs_interfaces(devlistp, errbuf, can_be_bound));
}
}
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
- return (pcap_findalldevs_interfaces(alldevsp, errbuf, can_be_bound));
+ return (pcap_findalldevs_interfaces(devlistp, errbuf, can_be_bound));
}
/* facility to add an USB device to the device list*/
static int
-usb_dev_add(pcap_if_t** alldevsp, int n, char *err_str)
+usb_dev_add(pcap_if_list_t *devlistp, int n, char *err_str)
{
char dev_name[10];
char dev_descr[30];
else
pcap_snprintf(dev_descr, 30, "USB bus number %d", n);
- if (add_dev(alldevsp, dev_name, 0, dev_descr, err_str) == NULL)
+ if (add_dev(devlistp, dev_name, 0, dev_descr, err_str) == NULL)
return -1;
return 0;
}
int
-usb_findalldevs(pcap_if_t **alldevsp, char *err_str)
+usb_findalldevs(pcap_if_list_t *devlistp, char *err_str)
{
char usb_mon_dir[PATH_MAX];
char *usb_mon_prefix;
if (sscanf(&name[usb_mon_prefix_len], "%d", &n) == 0)
continue; /* failed */
- ret = usb_dev_add(alldevsp, n, err_str);
+ ret = usb_dev_add(devlistp, n, err_str);
}
closedir(dir);
if (sscanf(&name[3], "%d", &n) == 0)
continue;
- ret = usb_dev_add(alldevsp, n, err_str);
+ ret = usb_dev_add(devlistp, n, err_str);
}
closedir(dir);
if (sscanf(&name[len+1], "%d", &n) != 1)
continue;
- ret = usb_dev_add(alldevsp, n, err_str);
+ ret = usb_dev_add(devlistp, n, err_str);
}
closedir(dir);
/*
* Prototypes for USB-related functions
*/
-int usb_findalldevs(pcap_if_t **alldevsp, char *err_str);
+int usb_findalldevs(pcap_if_list_t *devlistp, char *err_str);
pcap_t *usb_create(const char *device, char *ebuf, int *is_ours);
}
static int
-pcap_add_if_win32(pcap_if_t **devlist, char *name, bpf_u_int32 flags,
+pcap_add_if_win32(pcap_if_list_t *devlistp, char *name, bpf_u_int32 flags,
const char *description, char *errbuf)
{
pcap_if_t *curdev;
/*
* Add an entry for this interface, with no addresses.
*/
- curdev = add_dev(devlist, name, flags, description, errbuf);
+ curdev = add_dev(devlistp, name, flags, description, errbuf);
if (curdev == NULL) {
/*
* Failure.
}
int
-pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
- pcap_if_t *devlist = NULL;
int ret = 0;
const char *desc;
char *AdaptersName;
}
}
- if (NameLength > 0)
- AdaptersName = (char*) malloc(NameLength);
- else
- {
- *alldevsp = NULL;
+ if (NameLength <= 0)
return 0;
- }
+ AdaptersName = (char*) malloc(NameLength);
if (AdaptersName == NULL)
{
pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "Cannot allocate enough memory to list the adapters.");
/*
* Add an entry for this interface.
*/
- if (pcap_add_if_win32(&devlist, name, flags, desc,
+ if (pcap_add_if_win32(devlistp, name, flags, desc,
errbuf) == -1) {
/*
* Failure.
desc += strlen(desc) + 1;
}
- if (ret == -1) {
- /*
- * We had an error; free the list we've been constructing.
- */
- if (devlist != NULL) {
- pcap_freealldevs(devlist);
- devlist = NULL;
- }
- }
-
- *alldevsp = devlist;
free(AdaptersName);
return (ret);
}
return (p->read_op(p, 1, p->oneshot_callback, (u_char *)&s));
}
+/*
+ * Implementation of a pcap_if_list_t.
+ */
+struct pcap_if_list {
+ pcap_if_t *beginning;
+};
+
static struct capture_source_type {
- int (*findalldevs_op)(pcap_if_t **, char *);
+ int (*findalldevs_op)(pcap_if_list_t *, char *);
pcap_t *(*create_op)(const char *, char *, int *);
} capture_source_types[] = {
#ifdef HAVE_DAG_API
pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
{
size_t i;
+ pcap_if_list_t devlist;
/*
* Find all the local network interfaces on which we
* can capture.
*/
- if (pcap_platform_finddevs(alldevsp, errbuf) == -1)
+ devlist.beginning = NULL;
+ if (pcap_platform_finddevs(&devlist, errbuf) == -1) {
+ /*
+ * Failed - free all of the entries we were given
+ * before we failed.
+ */
+ if (devlist.beginning != NULL)
+ pcap_freealldevs(devlist.beginning);
+ *alldevsp = NULL;
return (-1);
+ }
/*
* Ask each of the non-local-network-interface capture
* source types what interfaces they have.
*/
for (i = 0; capture_source_types[i].findalldevs_op != NULL; i++) {
- if (capture_source_types[i].findalldevs_op(alldevsp, errbuf) == -1) {
+ if (capture_source_types[i].findalldevs_op(&devlist, errbuf) == -1) {
/*
* We had an error; free the list we've been
* constructing.
*/
- if (*alldevsp != NULL) {
- pcap_freealldevs(*alldevsp);
- *alldevsp = NULL;
- }
+ if (devlist.beginning != NULL)
+ pcap_freealldevs(devlist.beginning);
+ *alldevsp = NULL;
return (-1);
}
}
+ /*
+ * Return the first entry of the list of all devices.
+ */
+ *alldevsp = devlist.beginning;
return (0);
}
* add interfaces even if they have no addresses.)
*/
int
-add_addr_to_iflist(pcap_if_t **alldevs, const char *name, bpf_u_int32 flags,
+add_addr_to_iflist(pcap_if_list_t *alldevs, const char *name, bpf_u_int32 flags,
struct sockaddr *addr, size_t addr_size,
struct sockaddr *netmask, size_t netmask_size,
struct sockaddr *broadaddr, size_t broadaddr_size,
* return -1 and set errbuf to an error message.
*/
pcap_if_t *
-find_or_add_dev(pcap_if_t **alldevs, const char *name, bpf_u_int32 flags,
+find_or_add_dev(pcap_if_list_t *alldevs, const char *name, bpf_u_int32 flags,
const char *description, char *errbuf)
{
pcap_if_t *curdev;
* the entry for it if we find it or NULL if we don't.
*/
pcap_if_t *
-find_dev(pcap_if_t **alldevs, const char *name)
+find_dev(pcap_if_list_t *alldevs, const char *name)
{
pcap_if_t *curdev;
/*
* Is there an entry in the list for this device?
*/
- for (curdev = *alldevs; curdev != NULL; curdev = curdev->next) {
+ for (curdev = alldevs->beginning; curdev != NULL; curdev = curdev->next) {
if (strcmp(name, curdev->name) == 0) {
/*
* We found it, so, yes, there is. No need to
* If we weren't given a description, try to get one.
*/
pcap_if_t *
-add_dev(pcap_if_t **alldevs, const char *name, bpf_u_int32 flags,
+add_dev(pcap_if_list_t *alldevs, const char *name, bpf_u_int32 flags,
const char *description, char *errbuf)
{
pcap_if_t *curdev, *prevdev, *nextdev;
/*
* The next element is the first element.
*/
- nextdev = *alldevs;
+ nextdev = alldevs->beginning;
} else
nextdev = prevdev->next;
*/
if (prevdev == NULL) {
/*
- * This is the first interface. Pass back a
- * pointer to it, and put "curdev" before
- * "nextdev".
+ * This is the first interface. Make it
+ * the first element in the list of devices.
*/
- *alldevs = curdev;
+ alldevs->beginning = curdev;
} else
prevdev->next = curdev;
return (curdev);