xref: /linux/tools/net/ynl/samples/rt-addr.c (revision 1b98f357dadd6ea613a435fbaef1a5dd7b35fd21)
129d34a4dSJakub Kicinski // SPDX-License-Identifier: GPL-2.0
229d34a4dSJakub Kicinski #include <stdio.h>
329d34a4dSJakub Kicinski #include <string.h>
429d34a4dSJakub Kicinski 
529d34a4dSJakub Kicinski #include <ynl.h>
629d34a4dSJakub Kicinski 
729d34a4dSJakub Kicinski #include <arpa/inet.h>
829d34a4dSJakub Kicinski #include <net/if.h>
929d34a4dSJakub Kicinski 
1029d34a4dSJakub Kicinski #include "rt-addr-user.h"
1129d34a4dSJakub Kicinski 
1229d34a4dSJakub Kicinski static void rt_addr_print(struct rt_addr_getaddr_rsp *a)
1329d34a4dSJakub Kicinski {
1429d34a4dSJakub Kicinski 	char ifname[IF_NAMESIZE];
1529d34a4dSJakub Kicinski 	char addr_str[64];
1629d34a4dSJakub Kicinski 	const char *addr;
1729d34a4dSJakub Kicinski 	const char *name;
1829d34a4dSJakub Kicinski 
1929d34a4dSJakub Kicinski 	name = if_indextoname(a->_hdr.ifa_index, ifname);
2029d34a4dSJakub Kicinski 	if (name)
2129d34a4dSJakub Kicinski 		printf("%16s: ", name);
2229d34a4dSJakub Kicinski 
23*b8ae9f70SJakub Kicinski 	switch (a->_len.address) {
2429d34a4dSJakub Kicinski 	case 4:
2529d34a4dSJakub Kicinski 		addr = inet_ntop(AF_INET, a->address,
2629d34a4dSJakub Kicinski 				 addr_str, sizeof(addr_str));
2729d34a4dSJakub Kicinski 		break;
2829d34a4dSJakub Kicinski 	case 16:
2929d34a4dSJakub Kicinski 		addr = inet_ntop(AF_INET6, a->address,
3029d34a4dSJakub Kicinski 				 addr_str, sizeof(addr_str));
3129d34a4dSJakub Kicinski 		break;
3229d34a4dSJakub Kicinski 	default:
3329d34a4dSJakub Kicinski 		addr = NULL;
3429d34a4dSJakub Kicinski 		break;
3529d34a4dSJakub Kicinski 	}
3629d34a4dSJakub Kicinski 	if (addr)
3729d34a4dSJakub Kicinski 		printf("%s", addr);
3829d34a4dSJakub Kicinski 	else
39*b8ae9f70SJakub Kicinski 		printf("[%d]", a->_len.address);
4029d34a4dSJakub Kicinski 
4129d34a4dSJakub Kicinski 	printf("\n");
4229d34a4dSJakub Kicinski }
4329d34a4dSJakub Kicinski 
4429d34a4dSJakub Kicinski int main(int argc, char **argv)
4529d34a4dSJakub Kicinski {
4629d34a4dSJakub Kicinski 	struct rt_addr_getaddr_list *rsp;
4729d34a4dSJakub Kicinski 	struct rt_addr_getaddr_req *req;
4829d34a4dSJakub Kicinski 	struct ynl_error yerr;
4929d34a4dSJakub Kicinski 	struct ynl_sock *ys;
5029d34a4dSJakub Kicinski 
5129d34a4dSJakub Kicinski 	ys = ynl_sock_create(&ynl_rt_addr_family, &yerr);
5229d34a4dSJakub Kicinski 	if (!ys) {
5329d34a4dSJakub Kicinski 		fprintf(stderr, "YNL: %s\n", yerr.msg);
5429d34a4dSJakub Kicinski 		return 1;
5529d34a4dSJakub Kicinski 	}
5629d34a4dSJakub Kicinski 
5729d34a4dSJakub Kicinski 	req = rt_addr_getaddr_req_alloc();
5829d34a4dSJakub Kicinski 	if (!req)
5929d34a4dSJakub Kicinski 		goto err_destroy;
6029d34a4dSJakub Kicinski 
6129d34a4dSJakub Kicinski 	rsp = rt_addr_getaddr_dump(ys, req);
6229d34a4dSJakub Kicinski 	rt_addr_getaddr_req_free(req);
6329d34a4dSJakub Kicinski 	if (!rsp)
6429d34a4dSJakub Kicinski 		goto err_close;
6529d34a4dSJakub Kicinski 
6629d34a4dSJakub Kicinski 	if (ynl_dump_empty(rsp))
6729d34a4dSJakub Kicinski 		fprintf(stderr, "Error: no addresses reported\n");
6829d34a4dSJakub Kicinski 	ynl_dump_foreach(rsp, addr)
6929d34a4dSJakub Kicinski 		rt_addr_print(addr);
7029d34a4dSJakub Kicinski 	rt_addr_getaddr_list_free(rsp);
7129d34a4dSJakub Kicinski 
7229d34a4dSJakub Kicinski 	ynl_sock_destroy(ys);
7329d34a4dSJakub Kicinski 	return 0;
7429d34a4dSJakub Kicinski 
7529d34a4dSJakub Kicinski err_close:
7629d34a4dSJakub Kicinski 	fprintf(stderr, "YNL: %s\n", ys->err.msg);
7729d34a4dSJakub Kicinski err_destroy:
7829d34a4dSJakub Kicinski 	ynl_sock_destroy(ys);
7929d34a4dSJakub Kicinski 	return 2;
8029d34a4dSJakub Kicinski }
81