you can use libnl , which is a library for communicating with the kernel via NETLINK sockets.
a simple example for getting the default route would be (please add error checking and required headers)
void cb_route (struct nl_object *cb, void *arg) {
struct rtnl_route *route = (struct rtnl_route*) cb;
struct nl_addr *tmp_addr;
tmp_addr = rtnl_route_get_gateway(route);
len = nl_addr_get_len(tmp_addr);
memcpy(arg, nl_addr_get_binary_addr(tmp_addr), len);
}
int get_route () {
struct nl_handle *nlh;
struct nl_cache *route_cache;
struct rtnl_route *filter;
struct nl_addr *dst;
char *gw = malloc(16);
char n = '0';
nlh = nl_handle_alloc();
if (!nlh)
return -1;
nl_connect(nlh, NETLINK_ROUTE);
route_cache = rtnl_route_alloc_cache();
if (nl_cache_is_empty(route_cache))
return 0;
dst = nl_addr_build(AF_INET, &n, 0);
filter = rtnl_route_alloc();
rtnl_route_set_scope(filter, RT_SCOPE_UNIVERSE);
rtnl_route_set_family(filter, AF_INET);
rtnl_route_set_table(filter, RT_TABLE_MAIN);
rtnl_route_set_dst(filter, dst);
nl_cache_foreach_filter(route_cache, (struct nl_object*) filter, cb_filter_route, gw);
return 0;
}
source
share