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