• 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 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