X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=networking%2Froute.c;h=b5490ddd8d12e08710ea63133a4fa4e66f7be4bd;hb=14923db72fe6e97d9c596236841a9eb6338231db;hp=a8926f44eb628620d4423e8acfc152f11d13a874;hpb=229b3d207216b23a107e4e1ee5584412f6b9318d;p=oweals%2Fbusybox.git diff --git a/networking/route.c b/networking/route.c index a8926f44e..b5490ddd8 100644 --- a/networking/route.c +++ b/networking/route.c @@ -12,7 +12,6 @@ * * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. * - * $Id: route.c,v 1.26 2004/03/19 23:27:08 mjn3 Exp $ * * displayroute() code added by Vladimir N. Oleynik * adjustments by Larry Doolittle @@ -26,12 +25,13 @@ * remove ridiculous amounts of bloat. */ -#include "busybox.h" -#include "inet_common.h" #include #include #include +#include "libbb.h" +#include "inet_common.h" + #ifndef RTF_UP /* Keep this in sync with /usr/src/linux/include/linux/route.h */ @@ -50,7 +50,7 @@ #define RTF_REJECT 0x0200 /* Reject route */ #endif -#if defined (SIOCADDRTOLD) || defined (RTF_IRTT) /* route */ +#if defined(SIOCADDRTOLD) || defined(RTF_IRTT) /* route */ #define HAVE_NEW_ADDRT 1 #endif @@ -63,14 +63,14 @@ #endif /* The RTACTION entries must agree with tbl_verb[] below! */ -#define RTACTION_ADD 1 -#define RTACTION_DEL 2 +#define RTACTION_ADD 1 +#define RTACTION_DEL 2 /* For the various tbl_*[] arrays, the 1st byte is the offset to * the next entry and the 2nd byte is return value. */ -#define NET_FLAG 1 -#define HOST_FLAG 2 +#define NET_FLAG 1 +#define HOST_FLAG 2 /* We remap '-' to '#' to avoid problems with getopt. */ static const char tbl_hash_net_host[] = @@ -79,22 +79,22 @@ static const char tbl_hash_net_host[] = "\007\002#host" /* Since last, we can save a byte. */ ; -#define KW_TAKES_ARG 020 -#define KW_SETS_FLAG 040 +#define KW_TAKES_ARG 020 +#define KW_SETS_FLAG 040 -#define KW_IPVx_METRIC 020 -#define KW_IPVx_NETMASK 021 -#define KW_IPVx_GATEWAY 022 -#define KW_IPVx_MSS 023 -#define KW_IPVx_WINDOW 024 -#define KW_IPVx_IRTT 025 -#define KW_IPVx_DEVICE 026 +#define KW_IPVx_METRIC 020 +#define KW_IPVx_NETMASK 021 +#define KW_IPVx_GATEWAY 022 +#define KW_IPVx_MSS 023 +#define KW_IPVx_WINDOW 024 +#define KW_IPVx_IRTT 025 +#define KW_IPVx_DEVICE 026 -#define KW_IPVx_FLAG_ONLY 040 -#define KW_IPVx_REJECT 040 -#define KW_IPVx_MOD 041 -#define KW_IPVx_DYN 042 -#define KW_IPVx_REINSTATE 043 +#define KW_IPVx_FLAG_ONLY 040 +#define KW_IPVx_REJECT 040 +#define KW_IPVx_MOD 041 +#define KW_IPVx_DYN 042 +#define KW_IPVx_REINSTATE 043 static const char tbl_ipvx[] = /* 020 is the "takes an arg" bit */ @@ -167,7 +167,7 @@ static void INET_setroute(int action, char **args) } /* Clean out the RTREQ structure. */ - memset((char *) &rt, 0, sizeof(struct rtentry)); + memset(&rt, 0, sizeof(rt)); { const char *target = *args++; @@ -175,7 +175,7 @@ static void INET_setroute(int action, char **args) /* recognize x.x.x.x/mask format. */ prefix = strchr(target, '/'); - if(prefix) { + if (prefix) { int prefix_len; prefix_len = xatoul_range(prefix+1, 0, 32); @@ -194,7 +194,7 @@ static void INET_setroute(int action, char **args) if (isnet < 0) { bb_error_msg_and_die("resolving %s", target); } - if(prefix) { + if (prefix) { /* do not destroy prefix for process args */ *prefix = '/'; } @@ -297,7 +297,7 @@ static void INET_setroute(int action, char **args) #ifdef RTF_REJECT if ((rt.rt_flags & RTF_REJECT) && !rt.rt_dev) { - rt.rt_dev = "lo"; + rt.rt_dev = (char*)"lo"; } #endif @@ -334,7 +334,7 @@ static void INET_setroute(int action, char **args) if (ENABLE_FEATURE_CLEAN_UP) close(skfd); } -#ifdef CONFIG_FEATURE_IPV6 +#if ENABLE_FEATURE_IPV6 static void INET6_setroute(int action, char **args) { @@ -363,7 +363,7 @@ static void INET6_setroute(int action, char **args) } /* Clean out the RTREQ structure. */ - memset((char *) &rt, 0, sizeof(struct in6_rtmsg)); + memset(&rt, 0, sizeof(rt)); memcpy(&rt.rtmsg_dst, sa6.sin6_addr.s6_addr, sizeof(struct in6_addr)); @@ -445,7 +445,7 @@ static const unsigned int flagvals[] = { /* Must agree with flagchars[]. */ RTF_REINSTATE, RTF_DYNAMIC, RTF_MODIFIED, -#ifdef CONFIG_FEATURE_IPV6 +#if ENABLE_FEATURE_IPV6 RTF_DEFAULT, RTF_ADDRCONF, RTF_CACHE @@ -457,22 +457,18 @@ static const unsigned int flagvals[] = { /* Must agree with flagchars[]. */ static const char flagchars[] = /* Must agree with flagvals[]. */ "GHRDM" -#ifdef CONFIG_FEATURE_IPV6 +#if ENABLE_FEATURE_IPV6 "DAC" #endif ; -static -#ifndef CONFIG_FEATURE_IPV6 -__inline -#endif -void set_flags(char *flagstr, int flags) +static void set_flags(char *flagstr, int flags) { int i; *flagstr++ = 'U'; - for (i=0 ; (*flagstr = flagchars[i]) != 0 ; i++) { + for (i = 0; (*flagstr = flagchars[i]) != 0; i++) { if (flags & flagvals[i]) { ++flagstr; } @@ -480,11 +476,10 @@ void set_flags(char *flagstr, int flags) } /* also used in netstat */ -void displayroutes(int noresolve, int netstatfmt); -void displayroutes(int noresolve, int netstatfmt) +void bb_displayroutes(int noresolve, int netstatfmt) { - char devname[64], flags[16], sdest[16], sgw[16]; - unsigned long int d, g, m; + char devname[64], flags[16], *sdest, *sgw; + unsigned long d, g, m; int flgs, ref, use, metric, mtu, win, ir; struct sockaddr_in s_addr; struct in_addr mask; @@ -492,9 +487,8 @@ void displayroutes(int noresolve, int netstatfmt) FILE *fp = xfopen("/proc/net/route", "r"); printf("Kernel IP routing table\n" - "Destination Gateway Genmask" - " Flags %s Iface\n", - netstatfmt ? " MSS Window irtt" : "Metric Ref Use"); + "Destination Gateway Genmask Flags %s Iface\n", + netstatfmt ? " MSS Window irtt" : "Metric Ref Use"); if (fscanf(fp, "%*[^\n]\n") < 0) { /* Skip the first line. */ goto ERROR; /* Empty or missing line, or read error. */ @@ -508,7 +502,7 @@ void displayroutes(int noresolve, int netstatfmt) if ((r < 0) && feof(fp)) { /* EOF with no (nonspace) chars read. */ break; } - ERROR: + ERROR: bb_error_msg_and_die("fscanf"); } @@ -526,15 +520,14 @@ void displayroutes(int noresolve, int netstatfmt) memset(&s_addr, 0, sizeof(struct sockaddr_in)); s_addr.sin_family = AF_INET; s_addr.sin_addr.s_addr = d; - INET_rresolve(sdest, sizeof(sdest), &s_addr, - (noresolve | 0x8000), m); /* Default instead of *. */ - + sdest = INET_rresolve(&s_addr, (noresolve | 0x8000), m); /* 'default' instead of '*' */ s_addr.sin_addr.s_addr = g; - INET_rresolve(sgw, sizeof(sgw), &s_addr, - (noresolve | 0x4000), m); /* Host instead of net. */ - + sgw = INET_rresolve(&s_addr, (noresolve | 0x4000), m); /* Host instead of net */ mask.s_addr = m; - printf("%-16s%-16s%-16s%-6s", sdest, sgw, inet_ntoa(mask), flags); + /* "%15.15s" truncates hostnames, do we really want that? */ + printf("%-15.15s %-15.15s %-16s%-6s", sdest, sgw, inet_ntoa(mask), flags); + free(sdest); + free(sgw); if (netstatfmt) { printf("%5d %-5d %6d %s\n", mtu, win, ir, devname); } else { @@ -543,11 +536,11 @@ void displayroutes(int noresolve, int netstatfmt) } } -#ifdef CONFIG_FEATURE_IPV6 +#if ENABLE_FEATURE_IPV6 static void INET6_displayroutes(int noresolve) { - char addr6[128], naddr6[128]; + char addr6[128], *naddr6; /* In addr6x, we store both 40-byte ':'-delimited ipv6 addresses. * We read the non-delimited strings into the tail of the buffer * using fscanf and then modify the buffer by shifting forward @@ -574,7 +567,7 @@ static void INET6_displayroutes(int noresolve) if ((r < 0) && feof(fp)) { /* EOF with no (nonspace) chars read. */ break; } - ERROR: + ERROR: bb_error_msg_and_die("fscanf"); } @@ -587,7 +580,7 @@ static void INET6_displayroutes(int noresolve) do { if (!*p) { - if (i==40) { /* nul terminator for 1st address? */ + if (i == 40) { /* nul terminator for 1st address? */ addr6x[39] = 0; /* Fixup... need 0 instead of ':'. */ ++p; /* Skip and continue. */ continue; @@ -595,7 +588,7 @@ static void INET6_displayroutes(int noresolve) goto ERROR; } addr6x[i++] = *p++; - if (!((i+1)%5)) { + if (!((i+1) % 5)) { addr6x[i++] = ':'; } } while (i < 40+28+7); @@ -612,18 +605,19 @@ static void INET6_displayroutes(int noresolve) inet_pton(AF_INET6, addr6x + r, (struct sockaddr *) &snaddr6.sin6_addr); snaddr6.sin6_family = AF_INET6; - INET6_rresolve(naddr6, sizeof(naddr6), - (struct sockaddr_in6 *) &snaddr6, + naddr6 = INET6_rresolve((struct sockaddr_in6 *) &snaddr6, 0x0fff /* Apparently, upstream never resolves. */ ); if (!r) { /* 1st pass */ snprintf(addr6, sizeof(addr6), "%s/%d", naddr6, prefix_len); r += 40; + free(naddr6); } else { /* 2nd pass */ /* Print the info. */ printf("%-43s %-39s %-5s %-6d %-2d %7d %-8s\n", - addr6, naddr6, flags, metric, refcnt, use, iface); + addr6, naddr6, flags, metric, refcnt, use, iface); + free(naddr6); break; } } while (1); @@ -632,10 +626,10 @@ static void INET6_displayroutes(int noresolve) #endif -#define ROUTE_OPT_A 0x01 -#define ROUTE_OPT_n 0x02 -#define ROUTE_OPT_e 0x04 -#define ROUTE_OPT_INET6 0x08 /* Not an actual option. See below. */ +#define ROUTE_OPT_A 0x01 +#define ROUTE_OPT_n 0x02 +#define ROUTE_OPT_e 0x04 +#define ROUTE_OPT_INET6 0x08 /* Not an actual option. See below. */ /* 1st byte is offset to next entry offset. 2nd byte is return value. */ static const char tbl_verb[] = /* 2nd byte matches RTACTION_* code */ @@ -645,6 +639,7 @@ static const char tbl_verb[] = /* 2nd byte matches RTACTION_* code */ "\010\002delete" /* Since last, we can save a byte. */ ; +int route_main(int argc, char **argv); int route_main(int argc, char **argv) { unsigned opt; @@ -655,15 +650,15 @@ int route_main(int argc, char **argv) /* First, remap '-net' and '-host' to avoid getopt problems. */ p = argv; while (*++p) { - if ((strcmp(*p, "-net") == 0) || (strcmp(*p, "-host") == 0)) { + if (strcmp(*p, "-net") == 0 || strcmp(*p, "-host") == 0) { p[0][0] = '#'; } } opt = getopt32(argc, argv, "A:ne", &family); - if ((opt & ROUTE_OPT_A) && strcmp(family, "inet")) { -#ifdef CONFIG_FEATURE_IPV6 + if ((opt & ROUTE_OPT_A) && strcmp(family, "inet") != 0) { +#if ENABLE_FEATURE_IPV6 if (strcmp(family, "inet6") == 0) { opt |= ROUTE_OPT_INET6; /* Set flag for ipv6. */ } else @@ -676,12 +671,12 @@ int route_main(int argc, char **argv) /* No more args means display the routing table. */ if (!*argv) { int noresolve = (opt & ROUTE_OPT_n) ? 0x0fff : 0; -#ifdef CONFIG_FEATURE_IPV6 +#if ENABLE_FEATURE_IPV6 if (opt & ROUTE_OPT_INET6) INET6_displayroutes(noresolve); else #endif - displayroutes(noresolve, opt & ROUTE_OPT_e); + bb_displayroutes(noresolve, opt & ROUTE_OPT_e); fflush_stdout_and_exit(EXIT_SUCCESS); } @@ -692,7 +687,7 @@ int route_main(int argc, char **argv) bb_show_usage(); } -#ifdef CONFIG_FEATURE_IPV6 +#if ENABLE_FEATURE_IPV6 if (opt & ROUTE_OPT_INET6) INET6_setroute(what, argv); else