1 /*
2 * pcaputil.c
3 *
4 * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
5 *
6 * $Id: pcaputil.c,v 1.8 2002/02/25 06:21:59 dugsong Exp $
7 */
8
9 #include "config.h"
10
11 #ifndef WIN32
12 #include <sys/param.h>
13 #include <sys/types.h>
14 #include <sys/ioctl.h>
15 #endif
16
17 #include <pcap.h>
18 #ifdef notyet
19 # include <pcap-int.h>
20 #endif
21
22 #include <stdarg.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26
27 #include "pcaputil.h"
28
29 pcap_t *
pcap_open1(char * device)30 pcap_open1(char *device)
31 {
32 char ebuf[PCAP_ERRBUF_SIZE];
33 pcap_t *pcap;
34
35 if (device == NULL) {
36 if ((device = pcap_lookupdev(ebuf)) == NULL)
37 return (NULL);
38 }
39 if ((pcap = pcap_open_live(device, 31337, 0, 10, ebuf)) == NULL)
40 return (NULL);
41
42 #ifdef BSD
43 {
44 int n = 1;
45
46 if (ioctl(pcap_fileno(pcap), BIOCIMMEDIATE, &n) < 0) {
47 pcap_close(pcap);
48 return (NULL);
49 }
50 }
51 #endif
52 return (pcap);
53 }
54
55 int
pcap_dloff(pcap_t * pd)56 pcap_dloff(pcap_t *pd)
57 {
58 int i;
59
60 i = pcap_datalink(pd);
61
62 switch (i) {
63 case DLT_EN10MB:
64 i = 14;
65 break;
66 case DLT_IEEE802:
67 i = 22;
68 break;
69 case DLT_FDDI:
70 i = 21;
71 break;
72 #ifdef DLT_LOOP
73 case DLT_LOOP:
74 #endif
75 case DLT_NULL:
76 i = 4;
77 break;
78 default:
79 i = -1;
80 break;
81 }
82 return (i);
83 }
84
85 int
pcap_filter(pcap_t * pcap,const char * fmt,...)86 pcap_filter(pcap_t *pcap, const char *fmt, ...)
87 {
88 struct bpf_program fcode;
89 char buf[BUFSIZ];
90 va_list ap;
91
92 va_start(ap, fmt);
93 vsnprintf(buf, sizeof(buf), fmt, ap);
94 va_end(ap);
95 #ifdef notyet
96 pcap_freecode(&pcap->fcode);
97 #endif
98 if (pcap_compile(pcap, &fcode, buf, 1, 0) < 0)
99 return (-1);
100
101 if (pcap_setfilter(pcap, &fcode) == -1)
102 return (-1);
103
104 return (0);
105 }
106