1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2003-2009 Thomas Graf <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker */
5*4dc78e53SAndroid Build Coastguard Worker
6*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
7*4dc78e53SAndroid Build Coastguard Worker
8*4dc78e53SAndroid Build Coastguard Worker #include <linux/rtnetlink.h>
9*4dc78e53SAndroid Build Coastguard Worker
10*4dc78e53SAndroid Build Coastguard Worker #include <netlink/cli/utils.h>
11*4dc78e53SAndroid Build Coastguard Worker #include <netlink/cli/route.h>
12*4dc78e53SAndroid Build Coastguard Worker #include <netlink/cli/link.h>
13*4dc78e53SAndroid Build Coastguard Worker
print_usage(void)14*4dc78e53SAndroid Build Coastguard Worker static void print_usage(void)
15*4dc78e53SAndroid Build Coastguard Worker {
16*4dc78e53SAndroid Build Coastguard Worker printf("Usage: nl-route-get <addr>\n");
17*4dc78e53SAndroid Build Coastguard Worker exit(1);
18*4dc78e53SAndroid Build Coastguard Worker }
19*4dc78e53SAndroid Build Coastguard Worker
parse_cb(struct nl_object * obj,void * arg)20*4dc78e53SAndroid Build Coastguard Worker static void parse_cb(struct nl_object *obj, void *arg)
21*4dc78e53SAndroid Build Coastguard Worker {
22*4dc78e53SAndroid Build Coastguard Worker //struct rtnl_route *route = (struct rtnl_route *) obj;
23*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params params = {
24*4dc78e53SAndroid Build Coastguard Worker .dp_fd = stdout,
25*4dc78e53SAndroid Build Coastguard Worker .dp_type = NL_DUMP_DETAILS,
26*4dc78e53SAndroid Build Coastguard Worker };
27*4dc78e53SAndroid Build Coastguard Worker
28*4dc78e53SAndroid Build Coastguard Worker nl_object_dump(obj, ¶ms);
29*4dc78e53SAndroid Build Coastguard Worker }
30*4dc78e53SAndroid Build Coastguard Worker
cb(struct nl_msg * msg,void * arg)31*4dc78e53SAndroid Build Coastguard Worker static int cb(struct nl_msg *msg, void *arg)
32*4dc78e53SAndroid Build Coastguard Worker {
33*4dc78e53SAndroid Build Coastguard Worker int err;
34*4dc78e53SAndroid Build Coastguard Worker
35*4dc78e53SAndroid Build Coastguard Worker if ((err = nl_msg_parse(msg, &parse_cb, NULL)) < 0)
36*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(err, "Unable to parse object: %s", nl_geterror(err));
37*4dc78e53SAndroid Build Coastguard Worker
38*4dc78e53SAndroid Build Coastguard Worker return 0;
39*4dc78e53SAndroid Build Coastguard Worker }
40*4dc78e53SAndroid Build Coastguard Worker
main(int argc,char * argv[])41*4dc78e53SAndroid Build Coastguard Worker int main(int argc, char *argv[])
42*4dc78e53SAndroid Build Coastguard Worker {
43*4dc78e53SAndroid Build Coastguard Worker struct nl_sock *sock;
44*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *dst;
45*4dc78e53SAndroid Build Coastguard Worker int err = 1;
46*4dc78e53SAndroid Build Coastguard Worker
47*4dc78e53SAndroid Build Coastguard Worker if (argc < 2 || !strcmp(argv[1], "-h"))
48*4dc78e53SAndroid Build Coastguard Worker print_usage();
49*4dc78e53SAndroid Build Coastguard Worker
50*4dc78e53SAndroid Build Coastguard Worker sock = nl_cli_alloc_socket();
51*4dc78e53SAndroid Build Coastguard Worker nl_cli_connect(sock, NETLINK_ROUTE);
52*4dc78e53SAndroid Build Coastguard Worker nl_cli_link_alloc_cache(sock);
53*4dc78e53SAndroid Build Coastguard Worker nl_cli_route_alloc_cache(sock, 0);
54*4dc78e53SAndroid Build Coastguard Worker
55*4dc78e53SAndroid Build Coastguard Worker dst = nl_cli_addr_parse(argv[1], AF_INET);
56*4dc78e53SAndroid Build Coastguard Worker
57*4dc78e53SAndroid Build Coastguard Worker {
58*4dc78e53SAndroid Build Coastguard Worker struct nl_msg *m;
59*4dc78e53SAndroid Build Coastguard Worker struct rtmsg rmsg = {
60*4dc78e53SAndroid Build Coastguard Worker .rtm_family = nl_addr_get_family(dst),
61*4dc78e53SAndroid Build Coastguard Worker .rtm_dst_len = nl_addr_get_prefixlen(dst),
62*4dc78e53SAndroid Build Coastguard Worker };
63*4dc78e53SAndroid Build Coastguard Worker
64*4dc78e53SAndroid Build Coastguard Worker m = nlmsg_alloc_simple(RTM_GETROUTE, 0);
65*4dc78e53SAndroid Build Coastguard Worker if (!m)
66*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(ENOMEM, "out of memory");
67*4dc78e53SAndroid Build Coastguard Worker if (nlmsg_append(m, &rmsg, sizeof(rmsg), NLMSG_ALIGNTO) < 0)
68*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(ENOMEM, "out of memory");
69*4dc78e53SAndroid Build Coastguard Worker if (nla_put_addr(m, RTA_DST, dst) < 0)
70*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(ENOMEM, "out of memory");
71*4dc78e53SAndroid Build Coastguard Worker
72*4dc78e53SAndroid Build Coastguard Worker err = nl_send_auto_complete(sock, m);
73*4dc78e53SAndroid Build Coastguard Worker nlmsg_free(m);
74*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
75*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(err, "%s", nl_geterror(err));
76*4dc78e53SAndroid Build Coastguard Worker
77*4dc78e53SAndroid Build Coastguard Worker nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, cb, NULL);
78*4dc78e53SAndroid Build Coastguard Worker
79*4dc78e53SAndroid Build Coastguard Worker if (nl_recvmsgs_default(sock) < 0)
80*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(err, "%s", nl_geterror(err));
81*4dc78e53SAndroid Build Coastguard Worker }
82*4dc78e53SAndroid Build Coastguard Worker
83*4dc78e53SAndroid Build Coastguard Worker return 0;
84*4dc78e53SAndroid Build Coastguard Worker }
85