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