1 #include <netlink/netlink.h>
2 #include <netlink/cache.h>
3 #include <netlink/cli/utils.h>
4 #include <signal.h>
5
6 #include <netlink-private/cache-api.h>
7
8 #include <linux/netlink.h>
9
10 static int quit = 0;
11
12 static struct nl_dump_params dp = {
13 .dp_type = NL_DUMP_LINE,
14 };
15
16
change_cb(struct nl_cache * cache,struct nl_object * obj,int action,void * data)17 static void change_cb(struct nl_cache *cache, struct nl_object *obj,
18 int action, void *data)
19 {
20 if (action == NL_ACT_NEW)
21 printf("NEW ");
22 else if (action == NL_ACT_DEL)
23 printf("DEL ");
24 else if (action == NL_ACT_CHANGE)
25 printf("CHANGE ");
26
27 nl_object_dump(obj, &dp);
28 }
29
sigint(int arg)30 static void sigint(int arg)
31 {
32 quit = 1;
33 }
34
main(int argc,char * argv[])35 int main(int argc, char *argv[])
36 {
37 struct nl_cache_mngr *mngr;
38 struct nl_cache *cache;
39 int err, i;
40
41 dp.dp_fd = stdout;
42
43 signal(SIGINT, sigint);
44
45 err = nl_cache_mngr_alloc(NULL, NETLINK_ROUTE, NL_AUTO_PROVIDE, &mngr);
46 if (err < 0)
47 nl_cli_fatal(err, "Unable to allocate cache manager: %s",
48 nl_geterror(err));
49
50 for (i = 1; i < argc; i++) {
51 err = nl_cache_mngr_add(mngr, argv[i], &change_cb, NULL, &cache);
52 if (err < 0)
53 nl_cli_fatal(err, "Unable to add cache %s: %s",
54 argv[i], nl_geterror(err));
55 }
56
57 while (!quit) {
58 int err = nl_cache_mngr_poll(mngr, 1000);
59 if (err < 0 && err != -NLE_INTR)
60 nl_cli_fatal(err, "Polling failed: %s", nl_geterror(err));
61
62 nl_cache_mngr_info(mngr, &dp);
63 }
64
65 nl_cache_mngr_free(mngr);
66
67 return 0;
68 }
69