X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppstats%2Fpppstats.c;h=8efe48147cf4313ee845d8ed7de941e86be8d6b1;hp=97239de90db642369352582f0ef56ab5ac608c17;hb=829ce3a1b544753fc086c75b57d779839adfa545;hpb=f2e6fbd9dc3e665b9e6f30a41cb8ef22cc856ab6 diff --git a/pppstats/pppstats.c b/pppstats/pppstats.c index 97239de..8efe481 100644 --- a/pppstats/pppstats.c +++ b/pppstats/pppstats.c @@ -26,26 +26,19 @@ */ #ifndef lint -static char rcsid[] = "$Id: pppstats.c,v 1.2 1993/12/15 05:00:47 paulus Exp $"; +static char rcsid[] = "$Id: pppstats.c,v 1.4 1994/06/08 00:38:49 paulus Exp $"; #endif -#include -#include -#include -#include -#include -#ifdef sun -#include -#endif #include #include #include #include #include -#ifndef sun -#include -#endif - +#include +#include +#include +#include +#include #include #include #include @@ -54,13 +47,48 @@ static char rcsid[] = "$Id: pppstats.c,v 1.2 1993/12/15 05:00:47 paulus Exp $"; #define VJC 1 #include + +#ifndef STREAMS #include +#endif #ifdef STREAMS +#define PPP_STATS 1 /* should be defined iff it is in ppp_if.c */ #include #include #endif +#ifdef BSD4_4 +#define KVMLIB +#endif + +#ifndef KVMLIB + +#include +#ifdef ultrix +#include +#endif + +struct pte *Sysmap; +int kmem; +char *kmemf = "/dev/kmem"; +extern off_t lseek(); + +#else /* KVMLIB */ + +char *kmemf; + +#ifdef sun +#include +kvm_t *kd; +#define KDARG kd, + +#else /* sun */ +#define KDARG +#endif /* sun */ + +#endif /* KVMLIB */ + #ifdef STREAMS struct nlist nl[] = { #define N_SOFTC 0 @@ -75,17 +103,13 @@ struct nlist nl[] = { }; #endif -#ifdef sun -kvm_t *kd; -#endif - -#ifdef sun +#ifndef BSD4_4 char *system = "/vmunix"; #else +#include char *system = _PATH_UNIX; #endif -char *kmemf; int kflag; int vflag; unsigned interval = 5; @@ -131,32 +155,78 @@ main(argc, argv) kflag++; } } +#ifndef KVMLIB + if (nlist(system, nl) < 0 || nl[0].n_type == 0) { + fprintf(stderr, "%s: no namelist\n", system); + exit(1); + } + kmem = open(kmemf, O_RDONLY); + if (kmem < 0) { + perror(kmemf); + exit(1); + } +#ifndef ultrix + if (kflag) { + off_t off; + + Sysmap = (struct pte *) + malloc((u_int)(nl[N_SYSSIZE].n_value * sizeof(struct pte))); + if (!Sysmap) { + fputs("netstat: can't get memory for Sysmap.\n", stderr); + exit(1); + } + off = nl[N_SYSMAP].n_value & ~KERNBASE; + (void)lseek(kmem, off, L_SET); + (void)read(kmem, (char *)Sysmap, + (int)(nl[N_SYSSIZE].n_value * sizeof(struct pte))); + } +#endif +#else #ifdef sun /* SunOS */ if ((kd = kvm_open(system, kmemf, (char *)0, O_RDONLY, NULL)) == NULL) { - perror("kvm_open"); - exit(1); + perror("kvm_open"); + exit(1); } #else /* BSD4.3+ */ if (kvm_openfiles(system, kmemf, (char *)0) == -1) { - fprintf(stderr, "kvm_openfiles: %s", kvm_geterr()); - exit(1); + fprintf(stderr, "kvm_openfiles: %s", kvm_geterr()); + exit(1); } #endif -#ifdef sun - if (kvm_nlist(kd, nl)) { -#else - if (kvm_nlist(nl)) { -#endif - fprintf(stderr, "pppstats: can't find symbols in nlist\n"); - exit(1); + if (kvm_nlist(KDARG nl)) { + fprintf(stderr, "pppstats: can't find symbols in nlist\n"); + exit(1); } +#endif intpr(); exit(0); } +#ifndef KVMLIB +/* + * Seek into the kernel for a value. + */ +off_t +klseek(fd, base, off) + int fd, off; + off_t base; +{ + if (kflag) { +#ifdef ultrix + base = K0_TO_PHYS(base); +#else + /* get kernel pte */ + base &= ~KERNBASE; + base = ctob(Sysmap[btop(base)].pg_pfnum) + (base & PGOFSET); +#endif + } + return (lseek(fd, base, off)); +} +#endif + usage() { fprintf(stderr,"usage: pppstats [-i interval] [-v] [unit] [system] [core]\n"); @@ -167,6 +237,16 @@ u_char signalled; /* set if alarm goes off "early" */ #define V(offset) ((line % 20)? sc->offset - osc->offset : sc->offset) +#ifdef STREAMS +#define STRUCT struct ppp_if_info +#define COMP pii_sc_comp +#define STATS pii_ifnet +#else +#define STRUCT struct ppp_softc +#define COMP sc_comp +#define STATS sc_if +#endif + /* * Print a running summary of interface statistics. * Repeat display every interval seconds, showing statistics @@ -183,97 +263,106 @@ intpr() void catchalarm(); #endif -#ifdef STREAMS -#define STRUCT struct ppp_if_info -#else -#define STRUCT struct ppp_softc -#endif - STRUCT *sc, *osc; - nl[N_SOFTC].n_value += unit * sizeof(struct ppp_softc); + nl[N_SOFTC].n_value += unit * sizeof(STRUCT); sc = (STRUCT *)malloc(sizeof(STRUCT)); osc = (STRUCT *)malloc(sizeof(STRUCT)); bzero((char *)osc, sizeof(STRUCT)); while (1) { -#ifdef sun - if (kvm_read(kd, nl[N_SOFTC].n_value, +#ifndef KVMLIB + if (klseek(kmem, (off_t)nl[N_SOFTC].n_value, 0) == -1) { + perror("kmem seek"); + exit(1); + } + if (read(kmem, (char *)sc, sizeof(STRUCT)) <= 0) { + perror("kmem read"); + exit(1); + } #else - if (kvm_read(nl[N_SOFTC].n_value, + if (kvm_read(KDARG nl[N_SOFTC].n_value, sc, + sizeof(STRUCT)) != sizeof(STRUCT)) { + perror("kvm_read"); + exit(1); + } #endif - sc, sizeof(STRUCT)) != - sizeof(STRUCT)) - perror("kvm_read"); - - (void)signal(SIGALRM, catchalarm); - signalled = 0; - (void)alarm(interval); - - if ((line % 20) == 0) { - printf("%6.6s %6.6s %6.6s %6.6s %6.6s", - "in", "pack", "comp", "uncomp", "err"); - if (vflag) - printf(" %6.6s %6.6s", "toss", "ip"); - printf(" | %6.6s %6.6s %6.6s %6.6s %6.6s", - "out", "pack", "comp", "uncomp", "ip"); - if (vflag) - printf(" %6.6s %6.6s", "search", "miss"); - putchar('\n'); - } -#ifdef STREAMS -#define COMP pii_sc_comp -#define STATS pii_ifnet -#else -#define COMP sc_comp -#define STATS sc_if -#endif + (void)signal(SIGALRM, catchalarm); + signalled = 0; + (void)alarm(interval); + + if ((line % 20) == 0) { + printf("%6.6s %6.6s %6.6s %6.6s %6.6s", + "in", "pack", "comp", "uncomp", "err"); + if (vflag) + printf(" %6.6s %6.6s", "toss", "ip"); + printf(" | %6.6s %6.6s %6.6s %6.6s %6.6s", + "out", "pack", "comp", "uncomp", "ip"); + if (vflag) + printf(" %6.6s %6.6s", "search", "miss"); + putchar('\n'); + } - printf("%6d %6d %6d %6d %6d", -#if BSD > 43 - V(STATS.if_ibytes), + printf("%6d %6d %6d %6d %6d", +#ifdef BSD4_4 + V(STATS.if_ibytes), +#else +#ifndef STREAMS + V(sc_bytesrcvd), #else - 0, +#ifdef PPP_STATS + V(pii_stats.ppp_ibytes), +#else + 0, #endif - V(STATS.if_ipackets), - V(COMP.sls_compressedin), - V(COMP.sls_uncompressedin), - V(COMP.sls_errorin)); - if (vflag) - printf(" %6d %6d", - V(COMP.sls_tossed), - V(STATS.if_ipackets) - - V(COMP.sls_compressedin) - - V(COMP.sls_uncompressedin) - - V(COMP.sls_errorin)); - printf(" | %6d %6d %6d %6d %6d", -#if BSD > 43 - V(STATS.if_obytes), +#endif +#endif + V(STATS.if_ipackets), + V(COMP.sls_compressedin), + V(COMP.sls_uncompressedin), + V(COMP.sls_errorin)); + if (vflag) + printf(" %6d %6d", + V(COMP.sls_tossed), + V(STATS.if_ipackets) - V(COMP.sls_compressedin) - + V(COMP.sls_uncompressedin) - V(COMP.sls_errorin)); + printf(" | %6d %6d %6d %6d %6d", +#ifdef BSD4_4 + V(STATS.if_obytes), +#else +#ifndef STREAMS + V(sc_bytessent), +#else +#ifdef PPP_STATS + V(pii_stats.ppp_obytes), #else - 0, + 0, #endif - V(STATS.if_opackets), - V(COMP.sls_compressed), - V(COMP.sls_packets) - V(COMP.sls_compressed), - V(STATS.if_opackets) - V(COMP.sls_packets)); - if (vflag) - printf(" %6d %6d", - V(COMP.sls_searches), - V(COMP.sls_misses)); +#endif +#endif + V(STATS.if_opackets), + V(COMP.sls_compressed), + V(COMP.sls_packets) - V(COMP.sls_compressed), + V(STATS.if_opackets) - V(COMP.sls_packets)); + if (vflag) + printf(" %6d %6d", + V(COMP.sls_searches), + V(COMP.sls_misses)); - putchar('\n'); - fflush(stdout); - line++; - oldmask = sigblock(sigmask(SIGALRM)); - if (! signalled) { - sigpause(0); - } - sigsetmask(oldmask); - signalled = 0; - (void)alarm(interval); - bcopy((char *)sc, (char *)osc, sizeof(STRUCT)); + putchar('\n'); + fflush(stdout); + line++; + + oldmask = sigblock(sigmask(SIGALRM)); + if (! signalled) { + sigpause(0); + } + sigsetmask(oldmask); + signalled = 0; + (void)alarm(interval); + bcopy((char *)sc, (char *)osc, sizeof(STRUCT)); } }