// SPDX-License-Identifier: GPL-2.0 #include #include #include #include #include #include "rt-addr-user.h" static void rt_addr_print(struct rt_addr_getaddr_rsp *a) { char ifname[IF_NAMESIZE]; char addr_str[64]; const char *addr; const char *name; name = if_indextoname(a->_hdr.ifa_index, ifname); if (name) printf("%16s: ", name); switch (a->_len.address) { case 4: addr = inet_ntop(AF_INET, a->address, addr_str, sizeof(addr_str)); break; case 16: addr = inet_ntop(AF_INET6, a->address, addr_str, sizeof(addr_str)); break; default: addr = NULL; break; } if (addr) printf("%s", addr); else printf("[%d]", a->_len.address); printf("\n"); } int main(int argc, char **argv) { struct rt_addr_getaddr_list *rsp; struct rt_addr_getaddr_req *req; struct ynl_error yerr; struct ynl_sock *ys; ys = ynl_sock_create(&ynl_rt_addr_family, &yerr); if (!ys) { fprintf(stderr, "YNL: %s\n", yerr.msg); return 1; } req = rt_addr_getaddr_req_alloc(); if (!req) goto err_destroy; rsp = rt_addr_getaddr_dump(ys, req); rt_addr_getaddr_req_free(req); if (!rsp) goto err_close; if (ynl_dump_empty(rsp)) fprintf(stderr, "Error: no addresses reported\n"); ynl_dump_foreach(rsp, addr) rt_addr_print(addr); rt_addr_getaddr_list_free(rsp); ynl_sock_destroy(ys); return 0; err_close: fprintf(stderr, "YNL: %s\n", ys->err.msg); err_destroy: ynl_sock_destroy(ys); return 2; }