1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <arpa/inet.h>
5 
6 #include <libmnl/libmnl.h>
7 #include <libnetfilter_conntrack/libnetfilter_conntrack.h>
8 
data_cb(const struct nlmsghdr * nlh,void * data)9 static int data_cb(const struct nlmsghdr *nlh, void *data)
10 {
11 	struct nf_conntrack *ct;
12 	uint32_t type = NFCT_T_UNKNOWN;
13 	char buf[4096];
14 
15 	switch(nlh->nlmsg_type & 0xFF) {
16 	case IPCTNL_MSG_CT_NEW:
17 		if (nlh->nlmsg_flags & (NLM_F_CREATE|NLM_F_EXCL))
18 			type = NFCT_T_NEW;
19 		else
20 			type = NFCT_T_UPDATE;
21 		break;
22 	case IPCTNL_MSG_CT_DELETE:
23 		type = NFCT_T_DESTROY;
24 		break;
25 	}
26 
27 	ct = nfct_new();
28 	if (ct == NULL)
29 		return MNL_CB_OK;
30 
31 	nfct_nlmsg_parse(nlh, ct);
32 
33 	nfct_snprintf(buf, sizeof(buf), ct,
34 			type, NFCT_O_DEFAULT, 0);
35 	printf("%s\n", buf);
36 
37 	nfct_destroy(ct);
38 
39 	return MNL_CB_OK;
40 }
41 
main(void)42 int main(void)
43 {
44 	struct mnl_socket *nl;
45 	char buf[MNL_SOCKET_BUFFER_SIZE];
46 	int ret;
47 
48 	nl = mnl_socket_open(NETLINK_NETFILTER);
49 	if (nl == NULL) {
50 		perror("mnl_socket_open");
51 		exit(EXIT_FAILURE);
52 	}
53 
54 	if (mnl_socket_bind(nl, NF_NETLINK_CONNTRACK_NEW |
55 				NF_NETLINK_CONNTRACK_UPDATE |
56 				NF_NETLINK_CONNTRACK_DESTROY,
57 				MNL_SOCKET_AUTOPID) < 0) {
58 		perror("mnl_socket_bind");
59 		exit(EXIT_FAILURE);
60 	}
61 
62 	while (1) {
63 		ret = mnl_socket_recvfrom(nl, buf, sizeof(buf));
64 		if (ret == -1) {
65 			perror("mnl_socket_recvfrom");
66 			exit(EXIT_FAILURE);
67 		}
68 
69 		ret = mnl_cb_run(buf, ret, 0, 0, data_cb, NULL);
70 		if (ret == -1) {
71 			perror("mnl_cb_run");
72 			exit(EXIT_FAILURE);
73 		}
74 	}
75 
76 	mnl_socket_close(nl);
77 
78 	return 0;
79 }
80