144d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "../src/utils.h"
2080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf#include <signal.h>
3080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf
4080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Grafstatic int quit = 0;
544d362409d5469aed47d19e7908d19bd194493aThomas Graf
644d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic void change_cb(struct nl_cache *cache, struct nl_object *obj,
744d362409d5469aed47d19e7908d19bd194493aThomas Graf		      int action)
844d362409d5469aed47d19e7908d19bd194493aThomas Graf{
944d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_dump_params dp = {
10562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf		.dp_type = NL_DUMP_LINE,
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf		.dp_fd = stdout,
1244d362409d5469aed47d19e7908d19bd194493aThomas Graf	};
1344d362409d5469aed47d19e7908d19bd194493aThomas Graf
1444d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (action == NL_ACT_NEW)
1544d362409d5469aed47d19e7908d19bd194493aThomas Graf		printf("NEW ");
1644d362409d5469aed47d19e7908d19bd194493aThomas Graf	else if (action == NL_ACT_DEL)
1744d362409d5469aed47d19e7908d19bd194493aThomas Graf		printf("DEL ");
1844d362409d5469aed47d19e7908d19bd194493aThomas Graf	else if (action == NL_ACT_CHANGE)
1944d362409d5469aed47d19e7908d19bd194493aThomas Graf		printf("CHANGE ");
2044d362409d5469aed47d19e7908d19bd194493aThomas Graf
2144d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_object_dump(obj, &dp);
2244d362409d5469aed47d19e7908d19bd194493aThomas Graf}
2344d362409d5469aed47d19e7908d19bd194493aThomas Graf
24080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Grafstatic void sigint(int arg)
25080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf{
26080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf	quit = 1;
27080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf}
28080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf
2944d362409d5469aed47d19e7908d19bd194493aThomas Grafint main(int argc, char *argv[])
3044d362409d5469aed47d19e7908d19bd194493aThomas Graf{
3144d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_cache_mngr *mngr;
3244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_cache *lc, *nc, *ac, *rc;
33562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	struct nl_sock *sock;
34562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	int err;
3544d362409d5469aed47d19e7908d19bd194493aThomas Graf
36080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf	signal(SIGINT, sigint);
37080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf
38562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	sock = nlt_alloc_socket();
39562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	err = nl_cache_mngr_alloc(sock, NETLINK_ROUTE, NL_AUTO_PROVIDE, &mngr);
40562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	if (err < 0)
41562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf		fatal(err, "Unable to allocate cache manager: %s",
42562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf		      nl_geterror(err));
4344d362409d5469aed47d19e7908d19bd194493aThomas Graf
44562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	if ((err = nl_cache_mngr_add(mngr, "route/link", &change_cb, &lc)) < 0)
45562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf		fatal(err, "Unable to add cache route/link: %s",
46562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf		      nl_geterror(err));
4744d362409d5469aed47d19e7908d19bd194493aThomas Graf
48562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	if ((err = nl_cache_mngr_add(mngr, "route/neigh", &change_cb, &nc)) < 0)
49562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf		fatal(err, "Unable to add cache route/neigh: %s",
50562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf		      nl_geterror(err));
5144d362409d5469aed47d19e7908d19bd194493aThomas Graf
52562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	if ((err = nl_cache_mngr_add(mngr, "route/addr", &change_cb, &ac)) < 0)
53562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf		fatal(err, "Unable to add cache route/addr: %s",
54562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf		      nl_geterror(err));
5544d362409d5469aed47d19e7908d19bd194493aThomas Graf
56562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	if ((err = nl_cache_mngr_add(mngr, "route/route", &change_cb, &rc)) < 0)
57562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf		fatal(err, "Unable to add cache route/route: %s",
58562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf		      nl_geterror(err));
5944d362409d5469aed47d19e7908d19bd194493aThomas Graf
60080727d90b62418cb103f5b0fc6ccecdf8317009Thomas Graf	while (!quit) {
6144d362409d5469aed47d19e7908d19bd194493aThomas Graf		int err = nl_cache_mngr_poll(mngr, 5000);
62562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf		if (err < 0 && err != -NLE_INTR)
63562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf			fatal(err, "Polling failed: %s", nl_geterror(err));
6444d362409d5469aed47d19e7908d19bd194493aThomas Graf
6544d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
6644d362409d5469aed47d19e7908d19bd194493aThomas Graf
6744d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_cache_mngr_free(mngr);
68562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	nl_socket_free(sock);
6944d362409d5469aed47d19e7908d19bd194493aThomas Graf
7044d362409d5469aed47d19e7908d19bd194493aThomas Graf	return 0;
7144d362409d5469aed47d19e7908d19bd194493aThomas Graf}
72