154d79085SJakub Kicinski // SPDX-License-Identifier: GPL-2.0 254d79085SJakub Kicinski #include <stdio.h> 354d79085SJakub Kicinski #include <string.h> 454d79085SJakub Kicinski 554d79085SJakub Kicinski #include <ynl.h> 654d79085SJakub Kicinski 754d79085SJakub Kicinski #include <arpa/inet.h> 854d79085SJakub Kicinski #include <net/if.h> 954d79085SJakub Kicinski 1054d79085SJakub Kicinski #include "rt-route-user.h" 1154d79085SJakub Kicinski 1254d79085SJakub Kicinski static void rt_route_print(struct rt_route_getroute_rsp *r) 1354d79085SJakub Kicinski { 1454d79085SJakub Kicinski char ifname[IF_NAMESIZE]; 1554d79085SJakub Kicinski char route_str[64]; 1654d79085SJakub Kicinski const char *route; 1754d79085SJakub Kicinski const char *name; 1854d79085SJakub Kicinski 1954d79085SJakub Kicinski /* Ignore local */ 2054d79085SJakub Kicinski if (r->_hdr.rtm_table == RT_TABLE_LOCAL) 2154d79085SJakub Kicinski return; 2254d79085SJakub Kicinski 2354d79085SJakub Kicinski if (r->_present.oif) { 2454d79085SJakub Kicinski name = if_indextoname(r->oif, ifname); 2554d79085SJakub Kicinski if (name) 2654d79085SJakub Kicinski printf("oif: %-16s ", name); 2754d79085SJakub Kicinski } 2854d79085SJakub Kicinski 29*b8ae9f70SJakub Kicinski if (r->_len.dst) { 3054d79085SJakub Kicinski route = inet_ntop(r->_hdr.rtm_family, r->dst, 3154d79085SJakub Kicinski route_str, sizeof(route_str)); 3254d79085SJakub Kicinski printf("dst: %s/%d", route, r->_hdr.rtm_dst_len); 3354d79085SJakub Kicinski } 3454d79085SJakub Kicinski 35*b8ae9f70SJakub Kicinski if (r->_len.gateway) { 3654d79085SJakub Kicinski route = inet_ntop(r->_hdr.rtm_family, r->gateway, 3754d79085SJakub Kicinski route_str, sizeof(route_str)); 3854d79085SJakub Kicinski printf("gateway: %s ", route); 3954d79085SJakub Kicinski } 4054d79085SJakub Kicinski 4154d79085SJakub Kicinski printf("\n"); 4254d79085SJakub Kicinski } 4354d79085SJakub Kicinski 4454d79085SJakub Kicinski int main(int argc, char **argv) 4554d79085SJakub Kicinski { 4654d79085SJakub Kicinski struct rt_route_getroute_req_dump *req; 4754d79085SJakub Kicinski struct rt_route_getroute_list *rsp; 4854d79085SJakub Kicinski struct ynl_error yerr; 4954d79085SJakub Kicinski struct ynl_sock *ys; 5054d79085SJakub Kicinski 5154d79085SJakub Kicinski ys = ynl_sock_create(&ynl_rt_route_family, &yerr); 5254d79085SJakub Kicinski if (!ys) { 5354d79085SJakub Kicinski fprintf(stderr, "YNL: %s\n", yerr.msg); 5454d79085SJakub Kicinski return 1; 5554d79085SJakub Kicinski } 5654d79085SJakub Kicinski 5754d79085SJakub Kicinski req = rt_route_getroute_req_dump_alloc(); 5854d79085SJakub Kicinski if (!req) 5954d79085SJakub Kicinski goto err_destroy; 6054d79085SJakub Kicinski 6154d79085SJakub Kicinski rsp = rt_route_getroute_dump(ys, req); 6254d79085SJakub Kicinski rt_route_getroute_req_dump_free(req); 6354d79085SJakub Kicinski if (!rsp) 6454d79085SJakub Kicinski goto err_close; 6554d79085SJakub Kicinski 6654d79085SJakub Kicinski if (ynl_dump_empty(rsp)) 6754d79085SJakub Kicinski fprintf(stderr, "Error: no routeesses reported\n"); 6854d79085SJakub Kicinski ynl_dump_foreach(rsp, route) 6954d79085SJakub Kicinski rt_route_print(route); 7054d79085SJakub Kicinski rt_route_getroute_list_free(rsp); 7154d79085SJakub Kicinski 7254d79085SJakub Kicinski ynl_sock_destroy(ys); 7354d79085SJakub Kicinski return 0; 7454d79085SJakub Kicinski 7554d79085SJakub Kicinski err_close: 7654d79085SJakub Kicinski fprintf(stderr, "YNL: %s\n", ys->err.msg); 7754d79085SJakub Kicinski err_destroy: 7854d79085SJakub Kicinski ynl_sock_destroy(ys); 7954d79085SJakub Kicinski return 2; 8054d79085SJakub Kicinski } 81