xref: /openbsd-src/regress/lib/libpthread/pcap/pcap.c (revision 44609ad6069de5bc74b1288826eb9adadd880ef0)
1*44609ad6Smarc /*	$OpenBSD: pcap.c,v 1.3 2001/11/11 20:20:53 marc Exp $ */
2*44609ad6Smarc /*
3*44609ad6Smarc  *	Placed in the PUBLIC DOMAIN
4*44609ad6Smarc  */
5*44609ad6Smarc 
6*44609ad6Smarc #include <pcap.h>
7*44609ad6Smarc #include <stdlib.h>
8*44609ad6Smarc #include <stdio.h>
9*44609ad6Smarc #include <unistd.h>
10*44609ad6Smarc 
11*44609ad6Smarc #include "test.h"
12*44609ad6Smarc 
13*44609ad6Smarc #define LOOPBACK_IF	"lo0"
14*44609ad6Smarc #define SNAPLEN		96
15*44609ad6Smarc #define NO_PROMISC	0
16*44609ad6Smarc #define	PKTCNT		3
17*44609ad6Smarc 
18*44609ad6Smarc volatile int packet_count = 0;
19*44609ad6Smarc 
20*44609ad6Smarc void
21*44609ad6Smarc packet_ignore(u_char *tag, const struct pcap_pkthdr *hdr, const u_char *data)
22*44609ad6Smarc {
23*44609ad6Smarc 	packet_count += 1;
24*44609ad6Smarc }
25*44609ad6Smarc 
26*44609ad6Smarc void *
27*44609ad6Smarc pcap_thread(void *arg)
28*44609ad6Smarc {
29*44609ad6Smarc 	char errbuf[PCAP_ERRBUF_SIZE];
30*44609ad6Smarc 	pcap_t *handle;
31*44609ad6Smarc 
32*44609ad6Smarc 	SET_NAME("pcap_thread");
33*44609ad6Smarc 	handle = pcap_open_live(LOOPBACK_IF, SNAPLEN, NO_PROMISC, 0, errbuf);
34*44609ad6Smarc 	if (!handle)
35*44609ad6Smarc 		PANIC("You may need to run this test as UID 0 (root)");
36*44609ad6Smarc 	ASSERT(pcap_loop(handle, PKTCNT, packet_ignore, 0) != -1);
37*44609ad6Smarc 	return 0;
38*44609ad6Smarc }
39*44609ad6Smarc 
40*44609ad6Smarc void *
41*44609ad6Smarc ping_thread(void *arg)
42*44609ad6Smarc {
43*44609ad6Smarc 	SET_NAME("ping_thread");
44*44609ad6Smarc 	ASSERT(system("ping -c 3 127.0.0.1") == 0);
45*44609ad6Smarc 	sleep(2);
46*44609ad6Smarc 	ASSERT(packet_count == 3);
47*44609ad6Smarc 	SUCCEED;
48*44609ad6Smarc }
49*44609ad6Smarc 
50*44609ad6Smarc int
51*44609ad6Smarc main(int argc, char **argv)
52*44609ad6Smarc {
53*44609ad6Smarc 	pthread_t pcap;
54*44609ad6Smarc 	pthread_t ping;
55*44609ad6Smarc 
56*44609ad6Smarc 	CHECKr(pthread_create(&pcap, NULL, pcap_thread, NULL));
57*44609ad6Smarc 	sleep(1);
58*44609ad6Smarc 	CHECKr(pthread_create(&ping, NULL, ping_thread, NULL));
59*44609ad6Smarc 	while (1)
60*44609ad6Smarc 		;
61*44609ad6Smarc 	PANIC("while");
62*44609ad6Smarc }
63