]> git.ozlabs.org Git - ppp.git/blobdiff - pppstats/pppstats.c
pppd man page: Update header to refer to pppd 2.5.x
[ppp.git] / pppstats / pppstats.c
index 3388f7978a12acbf841c28a7ccad1bc802c1ada5..22d1154637c8f850bdad25db45dc6cc967e3280e 100644 (file)
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
+#ifndef __STDC__
+#define const
+#endif
+
 #ifndef lint
-static char rcsid[] = "$Id: pppstats.c,v 1.16 1996/09/14 05:13:25 paulus Exp $";
+static const char rcsid[] = "$Id: pppstats.c,v 1.29 2002/10/27 12:56:26 fcusack Exp $";
 #endif
 
 #include <stdio.h>
@@ -47,15 +51,34 @@ static char rcsid[] = "$Id: pppstats.c,v 1.16 1996/09/14 05:13:25 paulus Exp $";
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/ioctl.h>
-#include <net/ppp_defs.h>
 
 #ifndef STREAMS
+#if defined(__linux__) && defined(__powerpc__) \
+    && (__GLIBC__ == 2 && __GLIBC_MINOR__ == 0)
+/* kludge alert! */
+#undef __GLIBC__
+#endif
 #include <sys/socket.h>                /* *BSD, Linux, NeXT, Ultrix etc. */
+#ifndef __linux__
 #include <net/if.h>
-#include <net/if_ppp.h>
+#include <net/ppp_defs.h>
+#else
+/* Linux */
+#if __GLIBC__ >= 2
+#include <asm/types.h>         /* glibc 2 conflicts with linux/types.h */
+#include <net/if.h>
+#else
+#include <linux/types.h>
+#include <linux/if.h>
+#endif
+#include <linux/ppp_defs.h>
+#include <linux/ppp-ioctl.h>
+
+#endif /* __linux__ */
 
 #else  /* STREAMS */
 #include <sys/stropts.h>       /* SVR4, Solaris 2, SunOS 4, OSF/1, etc. */
+#include <net/ppp_defs.h>
 #include <net/pppio.h>
 
 #endif /* STREAMS */
@@ -65,19 +88,34 @@ int aflag;                  /* print absolute values, not deltas */
 int    dflag;                  /* print data rates, not bytes */
 int    interval, count;
 int    infinite;
-int    unit;
 int    s;                      /* socket or /dev/ppp file descriptor */
 int    signalled;              /* set if alarm goes off "early" */
 char   *progname;
 char   *interface;
 
-#if defined(SUNOS4)
+#if defined(SUNOS4) || defined(ULTRIX) || defined(NeXT)
 extern int optind;
 extern char *optarg;
 #endif
 
-void
-usage()
+/*
+ * 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(void);
+static void catchalarm(int);
+static void get_ppp_stats(struct ppp_stats *);
+static void get_ppp_cstats(struct ppp_comp_stats *);
+static void intpr(void);
+
+int main(int, char *argv[]);
+
+static void
+usage(void)
 {
     fprintf(stderr, "Usage: %s [-a|-d] [-v|-r|-z] [-c count] [-w wait] [interface]\n",
            progname);
@@ -88,30 +126,25 @@ usage()
  * Called if an interval expires before intpr has completed a loop.
  * Sets a flag to not wait for the alarm.
  */
-void
-catchalarm(arg)
-    int arg;
+static void
+catchalarm(int arg)
 {
     signalled = 1;
 }
 
 
 #ifndef STREAMS
-void
-get_ppp_stats(curp)
-    struct ppp_stats *curp;
+static void
+get_ppp_stats(struct ppp_stats *curp)
 {
-    struct ifpppstatsreq req;
+    struct ifreq req;
 
     memset (&req, 0, sizeof (req));
 
-#ifdef _linux_
-    req.stats_ptr = (caddr_t) &req.stats;
-#undef ifr_name
-#define ifr_name ifr__name
-#endif
+    req.ifr_data = (caddr_t) curp;
 
-    strncpy(req.ifr_name, interface, sizeof(req.ifr_name));
+    strncpy(req.ifr_name, interface, IFNAMSIZ);
+    req.ifr_name[IFNAMSIZ - 1] = 0;
     if (ioctl(s, SIOCGPPPSTATS, &req) < 0) {
        fprintf(stderr, "%s: ", progname);
        if (errno == ENOTTY)
@@ -120,25 +153,21 @@ get_ppp_stats(curp)
            perror("couldn't get PPP statistics");
        exit(1);
     }
-    *curp = req.stats;
 }
 
-void
-get_ppp_cstats(csp)
-    struct ppp_comp_stats *csp;
+static void
+get_ppp_cstats(struct ppp_comp_stats *csp)
 {
-    struct ifpppcstatsreq creq;
+    struct ifreq req;
+    struct ppp_comp_stats stats;
 
-    memset (&creq, 0, sizeof (creq));
+    memset (&req, 0, sizeof (req));
 
-#ifdef _linux_
-    creq.stats_ptr = (caddr_t) &creq.stats;
-#undef  ifr_name
-#define ifr_name ifr__name
-#endif
+    req.ifr_data = (caddr_t) &stats;
 
-    strncpy(creq.ifr_name, interface, sizeof(creq.ifr_name));
-    if (ioctl(s, SIOCGPPPCSTATS, &creq) < 0) {
+    strncpy(req.ifr_name, interface, IFNAMSIZ);
+    req.ifr_name[IFNAMSIZ - 1] = 0;
+    if (ioctl(s, SIOCGPPPCSTATS, &req) < 0) {
        fprintf(stderr, "%s: ", progname);
        if (errno == ENOTTY) {
            fprintf(stderr, "no kernel compression support\n");
@@ -151,29 +180,33 @@ get_ppp_cstats(csp)
        }
     }
 
-#ifdef _linux_
-    if (creq.stats.c.bytes_out == 0)
-       creq.stats.c.ratio = 0.0;
+#ifdef __linux__
+    if (stats.c.bytes_out == 0) {
+       stats.c.bytes_out = stats.c.comp_bytes + stats.c.inc_bytes;
+       stats.c.in_count = stats.c.unc_bytes;
+    }
+    if (stats.c.bytes_out == 0)
+       stats.c.ratio = 0.0;
     else
-       creq.stats.c.ratio = (double) creq.stats.c.in_count /
-                            (double) creq.stats.c.bytes_out;
+       stats.c.ratio = 256.0 * stats.c.in_count / stats.c.bytes_out;
 
-    if (creq.stats.d.bytes_out == 0)
-       creq.stats.d.ratio = 0.0;
+    if (stats.d.bytes_out == 0) {
+       stats.d.bytes_out = stats.d.comp_bytes + stats.d.inc_bytes;
+       stats.d.in_count = stats.d.unc_bytes;
+    }
+    if (stats.d.bytes_out == 0)
+       stats.d.ratio = 0.0;
     else
-       creq.stats.d.ratio = (double) creq.stats.d.in_count /
-                            (double) creq.stats.d.bytes_out;
+       stats.d.ratio = 256.0 * stats.d.in_count / stats.d.bytes_out;
 #endif
 
-    *csp = creq.stats;
+    *csp = stats;
 }
 
 #else  /* STREAMS */
 
 int
-strioctl(fd, cmd, ptr, ilen, olen)
-    int fd, cmd, ilen, olen;
-    char *ptr;
+strioctl(int fd, int cmd, char *ptr, int ilen, int olen)
 {
     struct strioctl str;
 
@@ -189,11 +222,10 @@ strioctl(fd, cmd, ptr, ilen, olen)
     return 0;
 }
 
-void
-get_ppp_stats(curp)
-    struct ppp_stats *curp;
+static void
+get_ppp_stats(struct ppp_stats *curp)
 {
-    if (strioctl(s, PPPIO_GETSTAT, curp, 0, sizeof(*curp)) < 0) {
+    if (strioctl(s, PPPIO_GETSTAT, (char*) curp, 0, sizeof(*curp)) < 0) {
        fprintf(stderr, "%s: ", progname);
        if (errno == EINVAL)
            fprintf(stderr, "kernel support missing\n");
@@ -203,11 +235,10 @@ get_ppp_stats(curp)
     }
 }
 
-void
-get_ppp_cstats(csp)
-    struct ppp_comp_stats *csp;
+static void
+get_ppp_cstats(struct ppp_comp_stats *csp)
 {
-    if (strioctl(s, PPPIO_GETCSTAT, csp, 0, sizeof(*csp)) < 0) {
+    if (strioctl(s, PPPIO_GETCSTAT, (char*) csp, 0, sizeof(*csp)) < 0) {
        fprintf(stderr, "%s: ", progname);
        if (errno == ENOTTY) {
            fprintf(stderr, "no kernel compression support\n");
@@ -238,8 +269,8 @@ get_ppp_cstats(csp)
  * collected over that interval.  Assumes that interval is non-zero.
  * First line printed is cumulative.
  */
-void
-intpr()
+static void
+intpr(void)
 {
     register int line = 0;
     sigset_t oldmask, mask;
@@ -297,26 +328,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 {
@@ -348,7 +379,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,16 +427,15 @@ intpr()
 }
 
 int
-main(argc, argv)
-    int argc;
-    char *argv[];
+main(int argc, char *argv[])
 {
     int c;
 #ifdef STREAMS
+    int unit;
     char *dev;
 #endif
 
-    interface = "ppp0";
+    interface = PPP_DRV_NAME "0";
     if ((progname = strrchr(argv[0], '/')) == NULL)
        progname = argv[0];
     else
@@ -460,11 +489,6 @@ main(argc, argv)
     if (argc > 0)
        interface = argv[0];
 
-    if (sscanf(interface, "ppp%d", &unit) != 1) {
-       fprintf(stderr, "%s: invalid interface '%s' specified\n",
-               progname, interface);
-    }
-
 #ifndef STREAMS
     {
        struct ifreq ifr;
@@ -476,11 +500,12 @@ main(argc, argv)
            exit(1);
        }
 
-#ifdef _linux_
+#ifdef __linux__
 #undef  ifr_name
 #define ifr_name ifr_ifrn.ifrn_name
 #endif
-       strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name));
+       strncpy(ifr.ifr_name, interface, IFNAMSIZ);
+       ifr.ifr_name[IFNAMSIZ - 1] = 0;
        if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
            fprintf(stderr, "%s: nonexistent interface '%s' specified\n",
                    progname, interface);
@@ -489,17 +514,22 @@ main(argc, argv)
     }
 
 #else  /* STREAMS */
+    if (sscanf(interface, PPP_DRV_NAME "%d", &unit) != 1) {
+       fprintf(stderr, "%s: invalid interface '%s' specified\n",
+               progname, interface);
+    }
+
 #ifdef __osf__
     dev = "/dev/streams/ppp";
 #else
-    dev = "/dev/ppp";
+    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) {
+    if (strioctl(s, PPPIO_ATTACH, (char*) &unit, sizeof(int), 0) < 0) {
        fprintf(stderr, "%s: ppp%d is not available\n", progname, unit);
        exit(1);
     }