]> git.ozlabs.org Git - ppp.git/blobdiff - pppstats/pppstats.c
Fixed bugs with regards to using other device names than "ppp", use
[ppp.git] / pppstats / pppstats.c
index d3fa15f5e6725de1753134430122c1b8109063c1..a0d3d7f5b6d00f6968ff5c5d9f99b25d5ba43a0d 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.17 1996/09/26 06:16:51 paulus Exp $";
+static const char rcsid[] = "$Id: pppstats.c,v 1.28 2000/04/24 02:54:18 masputra Exp $";
 #endif
 
 #include <stdio.h>
@@ -47,15 +51,34 @@ static char rcsid[] = "$Id: pppstats.c,v 1.17 1996/09/26 06:16:51 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/ppp_defs.h>
 #include <net/if_ppp.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/if_ppp.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 */
@@ -71,12 +94,28 @@ int signalled;              /* set if alarm goes off "early" */
 char   *progname;
 char   *interface;
 
-#if defined(SUNOS4) || defined(ULTRIX)
+#if defined(SUNOS4) || defined(ULTRIX) || defined(NeXT)
 extern int optind;
 extern char *optarg;
 #endif
 
-void
+/*
+ * 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",
@@ -88,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;
 {
@@ -97,7 +136,7 @@ catchalarm(arg)
 
 
 #ifndef STREAMS
-void
+static void
 get_ppp_stats(curp)
     struct ppp_stats *curp;
 {
@@ -123,7 +162,7 @@ get_ppp_stats(curp)
     *curp = req.stats;
 }
 
-void
+static void
 get_ppp_cstats(csp)
     struct ppp_comp_stats *csp;
 {
@@ -152,17 +191,25 @@ get_ppp_cstats(csp)
     }
 
 #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;
@@ -189,7 +236,7 @@ strioctl(fd, cmd, ptr, ilen, olen)
     return 0;
 }
 
-void
+static void
 get_ppp_stats(curp)
     struct ppp_stats *curp;
 {
@@ -203,7 +250,7 @@ get_ppp_stats(curp)
     }
 }
 
-void
+static void
 get_ppp_cstats(csp)
     struct ppp_comp_stats *csp;
 {
@@ -238,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;
@@ -297,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 {
@@ -348,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)
@@ -406,7 +452,7 @@ main(argc, argv)
     char *dev;
 #endif
 
-    interface = "ppp0";
+    interface = PPP_DRV_NAME "0";
     if ((progname = strrchr(argv[0], '/')) == NULL)
        progname = argv[0];
     else
@@ -460,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);
     }
@@ -492,7 +538,7 @@ main(argc, argv)
 #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);