X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppstats%2Fpppstats.c;h=6367988eb96bf03c588b6228ee0c0fdf115f0fbb;hp=2149f2567a4665d1b8061b82f4eeba861a0e7f11;hb=fd25394d146bb83043189608d30dd0eeb983186d;hpb=e68a45a81a5ea2466b1bd5dfbb7a392ffc163ecf diff --git a/pppstats/pppstats.c b/pppstats/pppstats.c index 2149f25..6367988 100644 --- a/pppstats/pppstats.c +++ b/pppstats/pppstats.c @@ -31,8 +31,12 @@ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ +#ifndef __STDC__ +#define const +#endif + #ifndef lint -static char rcsid[] = "$Id: pppstats.c,v 1.14 1996/07/01 05:32:57 paulus Exp $"; +static const char rcsid[] = "$Id: pppstats.c,v 1.29 2002/10/27 12:56:26 fcusack Exp $"; #endif #include @@ -47,15 +51,34 @@ static char rcsid[] = "$Id: pppstats.c,v 1.14 1996/07/01 05:32:57 paulus Exp $"; #include #include #include -#include #ifndef STREAMS +#if defined(__linux__) && defined(__powerpc__) \ + && (__GLIBC__ == 2 && __GLIBC_MINOR__ == 0) +/* kludge alert! */ +#undef __GLIBC__ +#endif #include /* *BSD, Linux, NeXT, Ultrix etc. */ +#ifndef __linux__ #include +#include #include +#else +/* Linux */ +#if __GLIBC__ >= 2 +#include /* glibc 2 conflicts with linux/types.h */ +#include +#else +#include +#include +#endif +#include +#include +#endif /* __linux__ */ #else /* STREAMS */ #include /* SVR4, Solaris 2, SunOS 4, OSF/1, etc. */ +#include #include #endif /* STREAMS */ @@ -71,7 +94,28 @@ int signalled; /* set if alarm goes off "early" */ char *progname; char *interface; -void +#if defined(SUNOS4) || defined(ULTRIX) || defined(NeXT) +extern int optind; +extern char *optarg; +#endif + +/* + * If PPP_DRV_NAME is not defined, use the legacy "ppp" as the + * device name. + */ +#if !defined(PPP_DRV_NAME) +#define PPP_DRV_NAME "ppp" +#endif /* !defined(PPP_DRV_NAME) */ + +static void usage __P((void)); +static void catchalarm __P((int)); +static void get_ppp_stats __P((struct ppp_stats *)); +static void get_ppp_cstats __P((struct ppp_comp_stats *)); +static void intpr __P((void)); + +int main __P((int, char *argv[])); + +static void usage() { fprintf(stderr, "Usage: %s [-a|-d] [-v|-r|-z] [-c count] [-w wait] [interface]\n", @@ -83,7 +127,7 @@ usage() * Called if an interval expires before intpr has completed a loop. * Sets a flag to not wait for the alarm. */ -void +static void catchalarm(arg) int arg; { @@ -92,7 +136,7 @@ catchalarm(arg) #ifndef STREAMS -void +static void get_ppp_stats(curp) struct ppp_stats *curp; { @@ -100,7 +144,7 @@ get_ppp_stats(curp) memset (&req, 0, sizeof (req)); -#ifdef _linux_ +#ifdef __linux__ req.stats_ptr = (caddr_t) &req.stats; #undef ifr_name #define ifr_name ifr__name @@ -118,7 +162,7 @@ get_ppp_stats(curp) *curp = req.stats; } -void +static void get_ppp_cstats(csp) struct ppp_comp_stats *csp; { @@ -126,7 +170,7 @@ get_ppp_cstats(csp) memset (&creq, 0, sizeof (creq)); -#ifdef _linux_ +#ifdef __linux__ creq.stats_ptr = (caddr_t) &creq.stats; #undef ifr_name #define ifr_name ifr__name @@ -146,18 +190,26 @@ get_ppp_cstats(csp) } } -#ifdef _linux_ +#ifdef __linux__ + if (creq.stats.c.bytes_out == 0) { + creq.stats.c.bytes_out = creq.stats.c.comp_bytes + creq.stats.c.inc_bytes; + creq.stats.c.in_count = creq.stats.c.unc_bytes; + } if (creq.stats.c.bytes_out == 0) creq.stats.c.ratio = 0.0; else - creq.stats.c.ratio = (double) creq.stats.c.in_count / - (double) creq.stats.c.bytes_out; + creq.stats.c.ratio = 256.0 * creq.stats.c.in_count / + creq.stats.c.bytes_out; + if (creq.stats.d.bytes_out == 0) { + creq.stats.d.bytes_out = creq.stats.d.comp_bytes + creq.stats.d.inc_bytes; + creq.stats.d.in_count = creq.stats.d.unc_bytes; + } if (creq.stats.d.bytes_out == 0) creq.stats.d.ratio = 0.0; else - creq.stats.d.ratio = (double) creq.stats.d.in_count / - (double) creq.stats.d.bytes_out; + creq.stats.d.ratio = 256.0 * creq.stats.d.in_count / + creq.stats.d.bytes_out; #endif *csp = creq.stats; @@ -184,7 +236,7 @@ strioctl(fd, cmd, ptr, ilen, olen) return 0; } -void +static void get_ppp_stats(curp) struct ppp_stats *curp; { @@ -198,7 +250,7 @@ get_ppp_stats(curp) } } -void +static void get_ppp_cstats(csp) struct ppp_comp_stats *csp; { @@ -233,7 +285,7 @@ get_ppp_cstats(csp) * collected over that interval. Assumes that interval is non-zero. * First line printed is cumulative. */ -void +static void intpr() { register int line = 0; @@ -292,26 +344,26 @@ intpr() W(d.comp_packets), KBPS(W(d.inc_bytes)), W(d.inc_packets), - ccs.d.ratio * 256.0); + ccs.d.ratio / 256.0); printf(" | %8.3f %6u %8.3f %6u %6.2f", KBPS(W(c.comp_bytes)), W(c.comp_packets), KBPS(W(c.inc_bytes)), W(c.inc_packets), - ccs.c.ratio * 256.0); + ccs.c.ratio / 256.0); } else { printf("%8u %6u %8u %6u %6.2f", W(d.comp_bytes), W(d.comp_packets), W(d.inc_bytes), W(d.inc_packets), - ccs.d.ratio * 256.0); + ccs.d.ratio / 256.0); printf(" | %8u %6u %8u %6u %6.2f", W(c.comp_bytes), W(c.comp_packets), W(c.inc_bytes), W(c.inc_packets), - ccs.c.ratio * 256.0); + ccs.c.ratio / 256.0); } } else { @@ -343,7 +395,6 @@ intpr() else printf(" | %8u", V(p.ppp_obytes)); printf(" %6u %6u", - V(p.ppp_obytes), V(p.ppp_opackets), V(vj.vjs_compressed)); if (!rflag) @@ -397,8 +448,11 @@ main(argc, argv) char *argv[]; { int c; +#ifdef STREAMS + char *dev; +#endif - interface = "ppp0"; + interface = PPP_DRV_NAME "0"; if ((progname = strrchr(argv[0], '/')) == NULL) progname = argv[0]; else @@ -452,7 +506,7 @@ main(argc, argv) if (argc > 0) interface = argv[0]; - if (sscanf(interface, "ppp%d", &unit) != 1) { + if (sscanf(interface, PPP_DRV_NAME "%d", &unit) != 1) { fprintf(stderr, "%s: invalid interface '%s' specified\n", progname, interface); } @@ -467,6 +521,11 @@ main(argc, argv) perror("couldn't create IP socket"); exit(1); } + +#ifdef __linux__ +#undef ifr_name +#define ifr_name ifr_ifrn.ifrn_name +#endif strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)); if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { fprintf(stderr, "%s: nonexistent interface '%s' specified\n", @@ -476,9 +535,14 @@ main(argc, argv) } #else /* STREAMS */ - if ((s = open("/dev/ppp", O_RDONLY)) < 0) { - fprintf(stderr, "%s: ", progname); - perror("couldn't open /dev/ppp"); +#ifdef __osf__ + dev = "/dev/streams/ppp"; +#else + dev = "/dev/" PPP_DRV_NAME; +#endif + if ((s = open(dev, O_RDONLY)) < 0) { + fprintf(stderr, "%s: couldn't open ", progname); + perror(dev); exit(1); } if (strioctl(s, PPPIO_ATTACH, &unit, sizeof(int), 0) < 0) {