aboutsummaryrefslogtreecommitdiff
path: root/pcap-pf.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2016-06-28 02:29:46 -0700
committerGuy Harris <guy@alum.mit.edu>2016-06-28 02:30:09 -0700
commit01dabcda25ed695976e5c844cdd7fc6875a17bf6 (patch)
tree1942c269617b36aa4dcb03ce42f4cf26da8e599c /pcap-pf.c
parent71d90a93c5cb7f15e10254d6ee711f1f690b0a9c (diff)
Let the platform decide how to check capturable interfaces.
(Git's annoying policy of expecting a short one-line description of every change means that the first line isn't very explanatory.) Make pcap_findalldevs_interfaces() take as an argument a function that's used to check whether an interface can be captured on or not, rather than doing the check by trying to open the device for capturing. This lets pcap_findalldevs() find interfaces even if you don't have permission to capture on them; that way, instead of users saying "why isn't {tcpdump -D, tshark -D, dumpcap -D, Wireshark, etc.} showing me any interfaces?", they'll say "why am I getting a 'you don't have permissions' error when I try to capture on this interface?", which is a better description of the underlying problem. On some platforms, it also avoids a bunch of extra work when getting a list of interfaces.
Diffstat (limited to 'pcap-pf.c')
-rw-r--r--pcap-pf.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/pcap-pf.c b/pcap-pf.c
index 0d7a9eb7..33bb7b7c 100644
--- a/pcap-pf.c
+++ b/pcap-pf.c
@@ -321,6 +321,9 @@ pcap_activate_pf(pcap_t *p)
* its argument, even though it takes a "char *" rather than a
* "const char *" as its first argument. That appears to be
* the case, at least on Digital UNIX 4.0.
+ *
+ * XXX - is there an error that means "no such device"? Is
+ * there one that means "that device doesn't support pf"?
*/
p->fd = pfopen(p->opt.source, O_RDWR);
if (p->fd == -1 && errno == EACCES)
@@ -515,10 +518,20 @@ pcap_create_interface(const char *device, char *ebuf)
return (p);
}
+/*
+ * XXX - is there an error from pfopen() that means "no such device"?
+ * Is there one that means "that device doesn't support pf"?
+ */
+static int
+can_be_bound(const char *name _U_)
+{
+ return (1);
+}
+
int
pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
{
- return (pcap_findalldevs_interfaces(alldevsp, errbuf));
+ return (pcap_findalldevs_interfaces(alldevsp, errbuf, can_be_bound));
}
static int