This patch adds -e (extended information) to route and -r/-e (show routing

tables/extended information) to netstat.
This makes them behave (more) like their GNU counterparts.
This commit is contained in:
Robert Griebl 2002-05-14 23:03:23 +00:00
parent aa385d4015
commit 820098fd61
2 changed files with 70 additions and 23 deletions

View File

@ -33,6 +33,10 @@
#include "inet_common.h" #include "inet_common.h"
#include "busybox.h" #include "busybox.h"
#ifdef CONFIG_ROUTE
extern void displayroutes(int noresolve, int netstatfmt);
#endif
#define NETSTAT_CONNECTED 0x01 #define NETSTAT_CONNECTED 0x01
#define NETSTAT_LISTENING 0x02 #define NETSTAT_LISTENING 0x02
#define NETSTAT_NUMERIC 0x04 #define NETSTAT_NUMERIC 0x04
@ -462,7 +466,8 @@ int netstat_main(int argc, char **argv)
{ {
int opt; int opt;
int new_flags=0; int new_flags=0;
while ((opt = getopt(argc, argv, "lantuwx")) != -1) int showroute = 0, extended = 0;
while ((opt = getopt(argc, argv, "laenrtuwx")) != -1)
switch (opt) { switch (opt) {
case 'l': case 'l':
flags &= ~NETSTAT_CONNECTED; flags &= ~NETSTAT_CONNECTED;
@ -474,6 +479,12 @@ int netstat_main(int argc, char **argv)
case 'n': case 'n':
flags |= NETSTAT_NUMERIC; flags |= NETSTAT_NUMERIC;
break; break;
case 'r':
showroute = 1;
break;
case 'e':
extended = 1;
break;
case 't': case 't':
new_flags |= NETSTAT_TCP; new_flags |= NETSTAT_TCP;
break; break;
@ -489,6 +500,16 @@ int netstat_main(int argc, char **argv)
default: default:
show_usage(); show_usage();
} }
if ( showroute ) {
#ifdef CONFIG_ROUTE
displayroutes ( flags & NETSTAT_NUMERIC, !extended );
return 0;
#else
printf( "-r (display routing table) is not compiled in.\n" );
return 1;
#endif
}
if (new_flags) { if (new_flags) {
flags &= ~(NETSTAT_TCP|NETSTAT_UDP|NETSTAT_RAW|NETSTAT_UNIX); flags &= ~(NETSTAT_TCP|NETSTAT_UDP|NETSTAT_RAW|NETSTAT_UNIX);
flags |= new_flags; flags |= new_flags;

View File

@ -15,7 +15,7 @@
* Foundation; either version 2 of the License, or (at * Foundation; either version 2 of the License, or (at
* your option) any later version. * your option) any later version.
* *
* $Id: route.c,v 1.14 2001/11/10 11:22:43 andersen Exp $ * $Id: route.c,v 1.15 2002/05/14 23:03:23 sandman Exp $
* *
* displayroute() code added by Vladimir N. Oleynik <dzo@simtreas.ru> * displayroute() code added by Vladimir N. Oleynik <dzo@simtreas.ru>
* adjustments by Larry Doolittle <LRDoolittle@lbl.gov> * adjustments by Larry Doolittle <LRDoolittle@lbl.gov>
@ -342,14 +342,14 @@ INET_setroute(int action, int options, char **args)
#define RTF_REJECT 0x0200 /* Reject route */ #define RTF_REJECT 0x0200 /* Reject route */
#endif #endif
static void displayroutes(int noresolve) void displayroutes(int noresolve, int netstatfmt)
{ {
char buff[256]; char buff[256];
int nl = 0 ; int nl = 0 ;
struct in_addr dest; struct in_addr dest;
struct in_addr gw; struct in_addr gw;
struct in_addr mask; struct in_addr mask;
int flgs, ref, use, metric; int flgs, ref, use, metric, mtu, win, ir;
char flags[64]; char flags[64];
unsigned long int d,g,m; unsigned long int d,g,m;
@ -369,14 +369,17 @@ static void displayroutes(int noresolve)
while(buff[ifl]!=' ' && buff[ifl]!='\t' && buff[ifl]!='\0') while(buff[ifl]!=' ' && buff[ifl]!='\t' && buff[ifl]!='\0')
ifl++; ifl++;
buff[ifl]=0; /* interface */ buff[ifl]=0; /* interface */
if(sscanf(buff+ifl+1, "%lx%lx%X%d%d%d%lx", if(sscanf(buff+ifl+1, "%lx%lx%X%d%d%d%lx%d%d%d",
&d, &g, &flgs, &ref, &use, &metric, &m)!=7) { &d, &g, &flgs, &ref, &use, &metric, &m, &mtu, &win, &ir )!=10) {
error_msg_and_die( "Unsuported kernel route format\n"); error_msg_and_die( "Unsuported kernel route format\n");
} }
if(nl==1) if(nl==1) {
printf("Kernel IP routing table\n" printf("Kernel IP routing table\n");
"Destination Gateway Genmask Flags Metric Ref Use Iface\n"); if ( netstatfmt )
printf("Destination Gateway Genmask Flags MSS Window irtt Iface\n");
else
printf("Destination Gateway Genmask Flags Metric Ref Use Iface\n");
}
ifl = 0; /* parse flags */ ifl = 0; /* parse flags */
if(flgs&RTF_UP) { if(flgs&RTF_UP) {
if(flgs&RTF_REJECT) if(flgs&RTF_REJECT)
@ -405,10 +408,18 @@ static void displayroutes(int noresolve)
numeric = noresolve | 0x4000; /* host instead of net */ numeric = noresolve | 0x4000; /* host instead of net */
s_addr.sin_addr = gw; s_addr.sin_addr = gw;
INET_rresolve(sgw, sizeof(sgw), &s_addr, numeric, m); INET_rresolve(sgw, sizeof(sgw), &s_addr, numeric, m);
printf("%-16s%-16s%-16s%-6s%-6d %-2d %7d %s\n", if ( netstatfmt ) {
sdest, sgw, printf("%-16s%-16s%-16s%-6s%5d %-5d %6d %s\n",
inet_ntoa(mask), sdest, sgw,
flags, metric, ref, use, buff); inet_ntoa(mask),
flags, mtu, win, ir, buff);
}
else {
printf("%-16s%-16s%-16s%-6s%-6d %-2d %7d %s\n",
sdest, sgw,
inet_ntoa(mask),
flags, metric, ref, use, buff);
}
} }
} }
nl++; nl++;
@ -417,25 +428,40 @@ static void displayroutes(int noresolve)
int route_main(int argc, char **argv) int route_main(int argc, char **argv)
{ {
int opt;
int what = 0; int what = 0;
argc--; if ( !argv [1] || ( argv [1][0] == '-' )) {
argv++; /* check options */
int noresolve = 0;
if (*argv == NULL || (*(argv+1)==NULL && strcmp(*argv, "-n")==0)) { int extended = 0;
displayroutes(*argv != NULL);
while ((opt = getopt(argc, argv, "ne")) > 0) {
switch (opt) {
case 'n':
noresolve = 1;
break;
case 'e':
extended = 1;
break;
default:
show_usage ( );
}
}
displayroutes ( noresolve, extended );
return EXIT_SUCCESS; return EXIT_SUCCESS;
} else { } else {
/* check verb */ /* check verb */
if (strcmp(*argv, "add")==0) if (strcmp( argv [1], "add")==0)
what = RTACTION_ADD; what = RTACTION_ADD;
else if (strcmp(*argv, "del")==0 || strcmp(*argv, "delete")==0) else if (strcmp( argv [1], "del")==0 || strcmp( argv [1], "delete")==0)
what = RTACTION_DEL; what = RTACTION_DEL;
else if (strcmp(*argv, "flush")==0) else if (strcmp( argv [1], "flush")==0)
what = RTACTION_FLUSH; what = RTACTION_FLUSH;
else else
show_usage(); show_usage();
} }
return INET_setroute(what, 0, ++argv); return INET_setroute(what, 0, argv+2 );
} }