#include <netinet/tcp.h>
#include <netinet/tcpip.h>
-#include <ctype.h>
#include <errno.h>
#include <netdb.h>
#include <stdio.h>
register u_char *p, *bp;
register int cc, n, buflen, inc;
register struct enstamp *sp;
-#ifdef LBL_ALIGN
struct enstamp stamp;
-#endif
register u_int pad;
again:
bp = pc->bp;
/*
* Loop through each packet.
+ *
+ * This assumes that a single buffer of packets will have
+ * <= INT_MAX packets, so the packet count doesn't overflow.
*/
n = 0;
pad = pc->fddipad;
}
}
if (cc < sizeof(*sp)) {
- pcap_snprintf(pc->errbuf, sizeof(pc->errbuf),
+ snprintf(pc->errbuf, sizeof(pc->errbuf),
"pf short read (%d)", cc);
return (-1);
}
-#ifdef LBL_ALIGN
if ((long)bp & 3) {
sp = &stamp;
memcpy((char *)sp, (char *)bp, sizeof(*sp));
} else
-#endif
sp = (struct enstamp *)bp;
if (sp->ens_stamplen != sizeof(*sp)) {
- pcap_snprintf(pc->errbuf, sizeof(pc->errbuf),
+ snprintf(pc->errbuf, sizeof(pc->errbuf),
"pf short stamplen (%d)",
sp->ens_stamplen);
return (-1);
* skipping that padding.
*/
if (pf->filtering_in_kernel ||
- bpf_filter(pc->fcode.bf_insns, p, sp->ens_count, buflen)) {
+ pcap_filter(pc->fcode.bf_insns, p, sp->ens_count, buflen)) {
struct pcap_pkthdr h;
pf->TotAccepted++;
h.ts = sp->ens_tstamp;
}
static int
-pcap_inject_pf(pcap_t *p, const void *buf, size_t size)
+pcap_inject_pf(pcap_t *p, const void *buf, int size)
{
int ret;
* full.
*
* "ps_ifdrop" counts packets dropped by the network
- * inteface (regardless of whether they would have passed
+ * interface (regardless of whether they would have passed
* the input filter, of course).
*
* If packet filtering is not being done in the kernel:
* the userland filter.
*
* "ps_ifdrop" counts packets dropped by the network
- * inteface (regardless of whether they would have passed
+ * interface (regardless of whether they would have passed
* the input filter, of course).
*
* These statistics don't include packets not yet read from
p->fd = pfopen(p->opt.device, O_RDONLY);
if (p->fd < 0) {
if (errno == EACCES) {
- pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+ snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
"pf open: %s: Permission denied\n"
"your system may not be properly configured; see the packetfilter(4) man page",
p->opt.device);
* framing", there's not much we can do, as that
* doesn't specify a particular type of header.
*/
- pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+ snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
"unknown data-link type %u", devparams.end_dev_type);
err = PCAP_ERROR;
goto bad;
{
pcap_t *p;
- p = pcap_create_common(ebuf, sizeof (struct pcap_pf));
+ p = PCAP_CREATE_COMMON(ebuf, struct pcap_pf);
if (p == NULL)
return (NULL);
get_if_flags(const char *name _U_, bpf_u_int32 *flags _U_, char *errbuf _U_)
{
/*
- * Nothing we can do.
+ * Nothing we can do other than mark loopback devices as "the
+ * connected/disconnected status doesn't apply".
+ *
* XXX - is there a way to find out whether an adapter has
* something plugged into it?
*/
+ if (*flags & PCAP_IF_LOOPBACK) {
+ /*
+ * Loopback devices aren't wireless, and "connected"/
+ * "disconnected" doesn't apply to them.
+ */
+ *flags |= PCAP_IF_CONNECTION_STATUS_NOT_APPLICABLE;
+ return (0);
+ }
return (0);
}