// SPDX-License-Identifier: GPL-2.0 #include #include #include #include #include #include "rt-route-user.h" static void rt_route_print(struct rt_route_getroute_rsp *r) { char ifname[IF_NAMESIZE]; char route_str[64]; const char *route; const char *name; /* Ignore local */ if (r->_hdr.rtm_table == RT_TABLE_LOCAL) return; if (r->_present.oif) { name = if_indextoname(r->oif, ifname); if (name) printf("oif: %-16s ", name); } if (r->_len.dst) { route = inet_ntop(r->_hdr.rtm_family, r->dst, route_str, sizeof(route_str)); printf("dst: %s/%d", route, r->_hdr.rtm_dst_len); } if (r->_len.gateway) { route = inet_ntop(r->_hdr.rtm_family, r->gateway, route_str, sizeof(route_str)); printf("gateway: %s ", route); } printf("\n"); } int main(int argc, char **argv) { struct rt_route_getroute_req_dump *req; struct rt_route_getroute_list *rsp; struct ynl_error yerr; struct ynl_sock *ys; ys = ynl_sock_create(&ynl_rt_route_family, &yerr); if (!ys) { fprintf(stderr, "YNL: %s\n", yerr.msg); return 1; } req = rt_route_getroute_req_dump_alloc(); if (!req) goto err_destroy; rsp = rt_route_getroute_dump(ys, req); rt_route_getroute_req_dump_free(req); if (!rsp) goto err_close; if (ynl_dump_empty(rsp)) fprintf(stderr, "Error: no routeesses reported\n"); ynl_dump_foreach(rsp, route) rt_route_print(route); rt_route_getroute_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; }