* 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 <stdio.h>
#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 */
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",
* 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;
{
#ifndef STREAMS
-void
+static void
get_ppp_stats(curp)
struct 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
*curp = req.stats;
}
-void
+static void
get_ppp_cstats(csp)
struct ppp_comp_stats *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
}
}
-#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;
return 0;
}
-void
+static void
get_ppp_stats(curp)
struct ppp_stats *curp;
{
}
}
-void
+static void
get_ppp_cstats(csp)
struct ppp_comp_stats *csp;
{
* collected over that interval. Assumes that interval is non-zero.
* First line printed is cumulative.
*/
-void
+static void
intpr()
{
register int line = 0;
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 {
else
printf(" | %8u", V(p.ppp_obytes));
printf(" %6u %6u",
- V(p.ppp_obytes),
V(p.ppp_opackets),
V(vj.vjs_compressed));
if (!rflag)
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
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);
}
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",
}
#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) {