1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <signal.h>
5 #include <errno.h>
6 
7 #include <libnetfilter_conntrack/libnetfilter_conntrack.h>
8 
9 static int events = 0;
10 static int new, update, destroy;
11 
event_cb(enum nf_conntrack_msg_type type,struct nf_conntrack * ct,void * data)12 static int event_cb(enum nf_conntrack_msg_type type,
13 		    struct nf_conntrack *ct,
14 		    void *data)
15 {
16 	if (type == NFCT_T_NEW)
17 		new++;
18 	else if (type == NFCT_T_UPDATE)
19 		update++;
20 	else if (type == NFCT_T_DESTROY)
21 		destroy++;
22 
23 	if ((++events % 10000) == 0)
24 		printf("%d events received (%d new, %d update, %d destroy)\n",
25 			events, new, update, destroy);
26 
27 	return NFCT_CB_CONTINUE;
28 }
29 
sighandler(int foo)30 static void sighandler(int foo)
31 {
32 	printf("%d events received (%d new, %d update, %d destroy)\n",
33 		events, new, update, destroy);
34 	exit(EXIT_SUCCESS);
35 }
36 
main(void)37 int main(void)
38 {
39 	int ret;
40 	struct nfct_handle *h;
41 	int on = 1;
42 
43 	signal(SIGINT, sighandler);
44 
45 	h = nfct_open(CONNTRACK, NFCT_ALL_CT_GROUPS);
46 	if (!h) {
47 		perror("nfct_open");
48 		return 0;
49 	}
50 
51 	setsockopt(nfct_fd(h), SOL_NETLINK,
52 			NETLINK_BROADCAST_SEND_ERROR, &on, sizeof(int));
53 	setsockopt(nfct_fd(h), SOL_NETLINK,
54 			NETLINK_NO_ENOBUFS, &on, sizeof(int));
55 
56 	nfct_callback_register(h, NFCT_T_ALL, event_cb, NULL);
57 
58 	printf("TEST: waiting for events...\n");
59 
60 	ret = nfct_catch(h);
61 
62 	printf("TEST: conntrack events ");
63 	if (ret == -1)
64 		printf("(%d)(%s)\n", ret, strerror(errno));
65 	else
66 		printf("(OK)\n");
67 
68 	nfct_close(h);
69 
70 	ret == -1 ? exit(EXIT_FAILURE) : exit(EXIT_SUCCESS);
71 }
72