• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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