From d18c10977e29ea1c1641909e20aeced529cf4556 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sat, 7 Nov 2015 22:19:37 -0600 Subject: More route cleanup. --- toys/pending/route.c | 67 +++++++++++++++++++++------------------------------- 1 file changed, 27 insertions(+), 40 deletions(-) (limited to 'toys/pending') diff --git a/toys/pending/route.c b/toys/pending/route.c index eb533c12..1d978b6b 100644 --- a/toys/pending/route.c +++ b/toys/pending/route.c @@ -10,19 +10,18 @@ config ROUTE bool "route" default n help - usage: route -ne [-A inet[6]] / [add|del] + usage: route [-ne] [-A inet[6]] / [add|del] Display/Edit kernel routing tables. - -n Don't resolve names - -e Display other/more information - -A inet{6} Select Address Family + -n Don't resolve names + -e Display other/more information + -A inet{6} Select Address Family */ #define FOR_route #include "toys.h" #include -#include GLOBALS( char *family; @@ -88,18 +87,17 @@ static int get_addrinfo(char *ip, struct sockaddr_in6 *sock_in6) return 0; } -//get the flag values for route command. static void get_flag_value(char *str, int flags) { - int i = 0; - static unsigned flagarray[] = { - RTF_GATEWAY, RTF_HOST, RTF_REINSTATE, RTF_DYNAMIC, - RTF_MODIFIED, RTF_DEFAULT, RTF_ADDRCONF, RTF_CACHE - }; - - *str++ = 'U'; - while ((*str = "GHRDMDAC"[i])) - if (flags & flagarray[i++]) ++str; + // RTF_* bits in order: + // UP, GATEWAY, HOST, REINSTATE, DYNAMIC, MODIFIED, DEFAULT, ADDRCONF, CACHE + int i = 0, mask = 0x105003f; + + for (; mask; mask>>=1) if (mask&1) { + if (1<rt_dev)) rt->rt_dev = *argv; - } else if (!strcmp(*argv, "reject")) { - rt->rt_flags |= RTF_REJECT; - } else if (!strcmp(*argv, "mod")) { - rt->rt_flags |= RTF_MODIFIED; - } else if (!strcmp(*argv, "dyn")) { - rt->rt_flags |= RTF_DYNAMIC; - } else if (!strcmp(*argv, "reinstate")) { - rt->rt_flags |= RTF_REINSTATE; - } else help_exit("no '%s'", *argv); + } else if (!strcmp(*argv, "reject")) rt->rt_flags |= RTF_REJECT; + else if (!strcmp(*argv, "mod")) rt->rt_flags |= RTF_MODIFIED; + else if (!strcmp(*argv, "dyn")) rt->rt_flags |= RTF_DYNAMIC; + else if (!strcmp(*argv, "reinstate")) rt->rt_flags |= RTF_REINSTATE; + else help_exit("no '%s'", *argv); argv++; } @@ -365,19 +357,18 @@ static void setroute_inet6(char **argv) { struct sockaddr_in6 sock_in6; struct in6_rtmsg rt; - char *targetip; + char *targetip, *dev_name = 0; int sockfd, action = get_action(&argv, arglist1); if (!action || !*argv) help_exit(0); memset(&sock_in6, 0, sizeof(struct sockaddr_in6)); memset(&rt, 0, sizeof(struct in6_rtmsg)); targetip = *argv++; - if (*argv) { - unsigned long plen = 0; - char *dev_name = NULL; + if (!*argv) help_exit(0); + if (!strcmp(targetip, "default")) { rt.rtmsg_flags = RTF_UP; - rt.rtmsg_dst_len = plen; + rt.rtmsg_dst_len = 0; } else { is_prefix_inet6((char **)&targetip, &rt); if (get_addrinfo(targetip, (struct sockaddr_in6 *) &sock_in6)) @@ -398,7 +389,6 @@ static void setroute_inet6(char **argv) if (action == 1) xioctl(sockfd, SIOCADDRT, &rt); else xioctl(sockfd, SIOCDELRT, &rt); xclose(sockfd); - } else help_exit(0); } /* @@ -437,16 +427,13 @@ static void display_routes6(void) &prefixlen, ipv6_src_addr+8, &metric, &use, &refcount, &flag, iface)) == 8) { - memset(flag_val, 0, 10); - if (!(flag & RTF_UP)) continue; //skip down interfaces. //ipv6_dest_addr+8: as the values are filled from the 8th location of the array. ipv6_addr_formating(ipv6_dest_addr+8, ipv6_dest_addr); ipv6_addr_formating(ipv6_src_addr+8, ipv6_src_addr); - get_flag_value(flag_val, (flag & (RTF_GATEWAY|RTF_HOST|RTF_DEFAULT| - RTF_ADDRCONF|RTF_CACHE))); + get_flag_value(flag_val, flag); if (inet_pton(AF_INET6, ipv6_dest_addr, buf) <= 0) perror_exit("inet"); if (inet_ntop(AF_INET6, buf, buf2, INET6_ADDRSTRLEN)) { sprintf(toybuf, "%s/%d", buf2, prefixlen); @@ -470,8 +457,8 @@ void route_main(void) if (!strcmp(TT.family, "inet")) display_routes(); else if (!strcmp(TT.family, "inet6")) display_routes6(); else help_exit(0); + } else { + if (!strcmp(TT.family, "inet6")) setroute_inet6(toys.optargs); + else setroute(toys.optargs); } - - if (!strcmp(TT.family, "inet6")) setroute_inet6(toys.optargs); - else setroute(toys.optargs); } -- cgit v1.2.3