diff options
Diffstat (limited to 'pcap-snit.c')
-rw-r--r-- | pcap-snit.c | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/pcap-snit.c b/pcap-snit.c index e6232c2e8420..79349456bbac 100644 --- a/pcap-snit.c +++ b/pcap-snit.c @@ -130,11 +130,11 @@ pcap_read_snit(pcap_t *p, int cnt, pcap_handler callback, u_char *user) if (cc < 0) { if (errno == EWOULDBLOCK) return (0); - snprintf(p->errbuf, sizeof(p->errbuf), "pcap_read: %s", + pcap_snprintf(p->errbuf, sizeof(p->errbuf), "pcap_read: %s", pcap_strerror(errno)); return (-1); } - bp = p->buffer; + bp = (u_char *)p->buffer; } else bp = p->bp; @@ -211,7 +211,7 @@ static int pcap_inject_snit(pcap_t *p, const void *buf, size_t size) { struct strbuf ctl, data; - + /* * XXX - can we just do * @@ -223,7 +223,7 @@ pcap_inject_snit(pcap_t *p, const void *buf, size_t size) data.len = size; ret = putmsg(p->fd, &ctl, &data); if (ret == -1) { - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "send: %s", + pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "send: %s", pcap_strerror(errno)); return (-1); } @@ -247,7 +247,7 @@ nit_setflags(pcap_t *p) si.ic_len = sizeof(zero); si.ic_dp = (char *)&zero; if (ioctl(p->fd, I_STR, (char *)&si) < 0) { - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSCHUNK: %s", + pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSCHUNK: %s", pcap_strerror(errno)); return (-1); } @@ -260,7 +260,7 @@ nit_setflags(pcap_t *p) si.ic_len = sizeof(timeout); si.ic_dp = (char *)&timeout; if (ioctl(p->fd, I_STR, (char *)&si) < 0) { - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSTIME: %s", + pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSTIME: %s", pcap_strerror(errno)); return (-1); } @@ -272,7 +272,7 @@ nit_setflags(pcap_t *p) si.ic_len = sizeof(flags); si.ic_dp = (char *)&flags; if (ioctl(p->fd, I_STR, (char *)&si) < 0) { - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSFLAGS: %s", + pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSFLAGS: %s", pcap_strerror(errno)); return (-1); } @@ -286,7 +286,7 @@ pcap_activate_snit(pcap_t *p) struct ifreq ifr; /* interface request struct */ int chunksize = CHUNKSIZE; int fd; - static char dev[] = "/dev/nit"; + static const char dev[] = "/dev/nit"; if (p->opt.rfmon) { /* @@ -320,19 +320,19 @@ pcap_activate_snit(pcap_t *p) if (fd < 0 && errno == EACCES) p->fd = fd = open(dev, O_RDONLY); if (fd < 0) { - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "%s: %s", dev, + pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "%s: %s", dev, pcap_strerror(errno)); goto bad; } /* arrange to get discrete messages from the STREAM and use NIT_BUF */ if (ioctl(fd, I_SRDOPT, (char *)RMSGD) < 0) { - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "I_SRDOPT: %s", + pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "I_SRDOPT: %s", pcap_strerror(errno)); goto bad; } if (ioctl(fd, I_PUSH, "nbuf") < 0) { - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "push nbuf: %s", + pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "push nbuf: %s", pcap_strerror(errno)); goto bad; } @@ -342,19 +342,24 @@ pcap_activate_snit(pcap_t *p) si.ic_len = sizeof(chunksize); si.ic_dp = (char *)&chunksize; if (ioctl(fd, I_STR, (char *)&si) < 0) { - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSCHUNK: %s", + pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSCHUNK: %s", pcap_strerror(errno)); goto bad; } /* request the interface */ - strncpy(ifr.ifr_name, p->opt.source, sizeof(ifr.ifr_name)); + strncpy(ifr.ifr_name, p->opt.device, sizeof(ifr.ifr_name)); ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0'; si.ic_cmd = NIOCBIND; si.ic_len = sizeof(ifr); si.ic_dp = (char *)𝔦 if (ioctl(fd, I_STR, (char *)&si) < 0) { - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCBIND: %s: %s", + /* + * XXX - is there an error that means "no such device"? + * Is there one that means "that device doesn't support + * STREAMS NIT"? + */ + pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCBIND: %s: %s", ifr.ifr_name, pcap_strerror(errno)); goto bad; } @@ -364,7 +369,7 @@ pcap_activate_snit(pcap_t *p) si.ic_len = sizeof(p->snapshot); si.ic_dp = (char *)&p->snapshot; if (ioctl(fd, I_STR, (char *)&si) < 0) { - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSSNAP: %s", + pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSSNAP: %s", pcap_strerror(errno)); goto bad; } @@ -378,7 +383,7 @@ pcap_activate_snit(pcap_t *p) p->linktype = DLT_EN10MB; p->bufsize = BUFSPACE; - p->buffer = (u_char *)malloc(p->bufsize); + p->buffer = malloc(p->bufsize); if (p->buffer == NULL) { strlcpy(p->errbuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE); goto bad; @@ -426,11 +431,11 @@ pcap_activate_snit(pcap_t *p) } pcap_t * -pcap_create_interface(const char *device, char *ebuf) +pcap_create_interface(const char *device _U_, char *ebuf) { pcap_t *p; - p = pcap_create_common(device, ebuf, sizeof (struct pcap_snit)); + p = pcap_create_common(ebuf, sizeof (struct pcap_snit)); if (p == NULL) return (NULL); @@ -438,8 +443,18 @@ pcap_create_interface(const char *device, char *ebuf) return (p); } +/* + * XXX - there's probably a NIOCBIND error that means "that device + * doesn't support NIT"; if so, we should try an NIOCBIND and use that. + */ +static int +can_be_bound(const char *name _U_) +{ + return (1); +} + int pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf) { - return (0); + return (pcap_findalldevs_interfaces(alldevsp, errbuf, can_be_bound)); } |