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