--- net-tools-1.60/lib/interface.c.cycle 2003-02-11 14:29:29 +0100 +++ net-tools-1.60/lib/interface.c 2003-02-11 14:29:29 +0100 @@ -90,6 +90,7 @@ static struct interface *int_list, *int_last; static int if_readlist_proc(char *); +static int if_readlist_rep(char *, struct interface *); static struct interface *add_interface(char *name) { @@ -128,11 +129,13 @@ int for_all_interfaces(int (*doit) (struct interface *, void *), void *cookie) { struct interface *ife; + int err; if (!int_list && (if_readlist() < 0)) return -1; for (ife = int_list; ife; ife = ife->next) { - int err = doit(ife, cookie); + if_readlist_rep(ife->name, ife); + err = doit(ife, cookie); if (err) return err; } @@ -369,6 +372,42 @@ return err; } + +static int if_readlist_rep(char *target, struct interface *ife) +{ + FILE *fh; + char buf[512]; + int err; + + fh = fopen(_PATH_PROCNET_DEV, "r"); + if (!fh) { + fprintf(stderr, _("Warning: cannot open %s (%s). Limited output.\n"), + _PATH_PROCNET_DEV, strerror(errno)); + return if_readconf(); + } + fgets(buf, sizeof buf, fh); /* eat line */ + fgets(buf, sizeof buf, fh); + + procnetdev_vsn = procnetdev_version(buf); + + err = 0; + while (fgets(buf, sizeof buf, fh)) { + char *s, name[IFNAMSIZ]; + s = get_name(name, buf); + get_dev_fields(s, ife); + ife->statistics_valid = 1; + if (target && !strcmp(target,name)) + break; + } + if (ferror(fh)) { + perror(_PATH_PROCNET_DEV); + err = -1; + } + + fclose(fh); + return err; +} + int if_readlist(void) { int err = if_readlist_proc(NULL); --- net-tools-1.60/man/en_US/netstat.8.cycle 2001-01-07 13:43:57 +0100 +++ net-tools-1.60/man/en_US/netstat.8 2003-02-11 14:29:29 +0100 @@ -30,6 +30,7 @@ .RB [ \-\-program | \-p ] .RB [ \-\-verbose | \-v ] .RB [ \-\-continuous | \-c] +.RB [delay] .P .B netstat .RB { \-\-route | \-r } @@ -39,6 +40,7 @@ .RB [ \-\-numeric | \-n ] .RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] .RB [ \-\-continuous | \-c] +.RB [delay] .P .B netstat .RB { \-\-interfaces | \-i } @@ -50,12 +52,14 @@ .RB [ \-\-numeric | \-n ] .RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] .RB [ \-\-continuous | \-c] +.RB [delay] .P .B netstat .RB { \-\-groups | \-g } .RB [ \-\-numeric | \-n ] .RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] .RB [ \-\-continuous | \-c] +.RB [delay] .P .B netstat .RB { \-\-masquerade | \-M } @@ -63,12 +67,14 @@ .RB [ \-\-numeric | \-n ] .RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] .RB [ \-\-continuous | \-c] +.RB [delay] .P .B netstat .RB { \-\-statistics | -s } .RB [ \-\-tcp | \-t ] .RB [ \-\-udp | \-u ] .RB [ \-\-raw | \-w ] +.RB [delay] .P .B netstat .RB { \-\-version | \-V } @@ -170,6 +176,10 @@ Print routing information from the FIB. (This is the default.) .SS "\-C" Print routing information from the route cache. +.SS delay +Netstat will cycle printing through statistics every +.B delay +seconds. .IR UP . .P .SH OUTPUT --- net-tools-1.60/netstat.c.cycle 2003-02-11 14:29:29 +0100 +++ net-tools-1.60/netstat.c 2003-02-11 15:07:26 +0100 @@ -102,7 +102,7 @@ #endif /* prototypes for statistics.c */ -void parsesnmp(int, int, int); +int parsesnmp(int, int, int); void inittab(void); typedef enum { @@ -1440,6 +1440,8 @@ static int iface_info(void) { + static int count=0; + if (skfd < 0) { if ((skfd = sockets_open(0)) < 0) { perror("socket"); @@ -1449,20 +1451,21 @@ } if (flag_exp < 2) { ife_short = 1; - printf(_("Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n")); + if(!(count % 8)) + printf(_("Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n")); } if (for_all_interfaces(do_if_print, &flag_all) < 0) { perror(_("missing interface information")); exit(1); } - if (flag_cnt) + if (!flag_cnt) { free_interface_list(); - else { close(skfd); skfd = -1; } + count++; return 0; } @@ -1478,7 +1481,7 @@ { fprintf(stderr, _("usage: netstat [-veenNcCF] [] -r netstat {-V|--version|-h|--help}\n")); fprintf(stderr, _(" netstat [-vnNcaeol] [ ...]\n")); - fprintf(stderr, _(" netstat { [-veenNac] -i | [-cnNe] -M | -s }\n\n")); + fprintf(stderr, _(" netstat { [-veenNac] -i | [-cnNe] -M | -s } [delay]\n\n")); fprintf(stderr, _(" -r, --route display routing table\n")); fprintf(stderr, _(" -i, --interfaces display interface table\n")); @@ -1514,6 +1517,7 @@ (int argc, char *argv[]) { int i; int lop; + int reptimer = 1; struct option longopts[] = { AFTRANS_OPTS, @@ -1655,6 +1659,12 @@ flag_sta++; } + if(argc == optind + 1) { + if((reptimer = atoi(argv[optind])) <= 0) + usage(); + flag_cnt++; + } + if (flag_int + flag_rou + flag_mas + flag_sta > 1) usage(); @@ -1666,7 +1676,7 @@ flag_arg = flag_tcp + flag_udp + flag_raw + flag_unx + flag_ipx + flag_ax25 + flag_netrom + flag_igmp + flag_x25; - + if (flag_mas) { #if HAVE_FW_MASQUERADE && HAVE_AFINET #if MORE_THAN_ONE_MASQ_AF @@ -1678,7 +1688,7 @@ flag_not & FLAG_NUM_PORT, flag_exp); if (i || !flag_cnt) break; - sleep(1); + sleep(reptimer); } #else ENOSUPP("netstat.c", "FW_MASQUERADE"); @@ -1688,9 +1698,15 @@ } if (flag_sta) { + for(;;) { inittab(); - parsesnmp(flag_raw, flag_tcp, flag_udp); - exit(0); + i = parsesnmp(flag_raw, flag_tcp, flag_udp); + + if(i || !flag_cnt) + break; + sleep(reptimer); + } + return(i); } if (flag_rou) { @@ -1712,7 +1728,7 @@ i = route_info(afname, options); if (i || !flag_cnt) break; - sleep(1); + sleep(reptimer); } return (i); } @@ -1721,7 +1737,7 @@ i = iface_info(); if (!flag_cnt || i) break; - sleep(1); + sleep(reptimer); } return (i); } @@ -1847,7 +1863,7 @@ } if (!flag_cnt || i) break; - sleep(1); + sleep(reptimer); prg_cache_clear(); } return (i); --- net-tools-1.60/statistics.c.cycle 2001-02-02 19:01:23 +0100 +++ net-tools-1.60/statistics.c 2003-02-11 14:29:29 +0100 @@ -338,7 +338,7 @@ } -void parsesnmp(int flag_raw, int flag_tcp, int flag_udp) +int parsesnmp(int flag_raw, int flag_tcp, int flag_udp) { FILE *f; @@ -347,12 +347,14 @@ f = fopen("/proc/net/snmp", "r"); if (!f) { perror(_("cannot open /proc/net/snmp")); - return; + return(1); } process_fd(f); - if (ferror(f)) + if (ferror(f)) { perror("/proc/net/snmp"); + return(1); + } fclose(f); @@ -361,12 +363,14 @@ if (f) { process_fd(f); - if (ferror(f)) - perror("/proc/net/netstat"); + if (ferror(f)) { + perror("/proc/net/netstat"); + return(1); + } fclose(f); } - return; + return(0); }