home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-05-07 | 32.9 KB | 1,291 lines |
- Newsgroups: comp.sources.unix
- From: decvax!concert.net!woods%robohack (Greg A. Woods)
- Subject: v26i238: uutraf - UUCP Traffic Analysis and Reporting, Part03/04
- Sender: unix-sources-moderator@efficacy.home.vix.com
- Approved: vixie@efficacy.home.vix.com
-
- Submitted-By: decvax!concert.net!woods%robohack (Greg A. Woods)
- Posting-Number: Volume 26, Issue 238
- Archive-Name: uutraf/part03
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 3 (of 4)."
- # Contents: uutraf.c
- # Wrapped by woods@robohack on Sun Nov 8 16:38:14 1992
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'uutraf.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'uutraf.c'\"
- else
- echo shar: Extracting \"'uutraf.c'\" \(30807 characters\)
- sed "s/^X//" >'uutraf.c' <<'END_OF_FILE'
- X/*
- X * uutraf.c - generate UUCP traffic reports and summaries
- X */
- X
- X#define SID "@(#)uutraf:uutraf.c 1.2.2.8 92/10/23 10:23:03 (woods)"
- X#include <sccsid.h>
- X
- X#if defined(USE_STDDEF) || defined(_POSIX_SOURCE) || \
- X REALSTDC || (__STDC__ - 0) == 1
- X# include <stddef.h> /* should do before sysdefs.h */
- X#endif
- X#include <sysdefs.h> /* a local header for common portability */
- X#include <sys/types.h>
- X#include <time.h>
- X#include <stdio.h>
- X#include <ctype.h>
- X#include <math.h>
- X#ifdef BSD /* really only pre-4.4BSD? */
- X# include <strings.h>
- X#else
- X# include <string.h>
- X# if !REALSTDC || defined(USE_MALLOC)
- X# include <malloc.h>
- X# endif
- X# ifndef SYSVR2
- X# include <limits.h>
- X# endif
- X# include <unistd.h>
- X#endif
- X#if REALSTDC || defined(USE_STDLIB)
- X# include <stdlib.h>
- X#endif
- X#include <str.h> /* local header: STR*() macros */
- X#include <libc.h> /* local header: for older libc's */
- X#include <dlst.h> /* local header: dynamic list library */
- X#include "defs.h" /* uutraf's customization */
- X#include "uutraf.h" /* uutraf's common header */
- X#include <extern.h> /* local header: setup for external declarations */
- X#include "version.h" /* uutraf's version stuff */
- X
- X#ifndef lint
- Xstatic const char *sccsold = "@(#) original uutraf.c : rel 1.2 : mod 2/2/90";
- X#endif
- X
- X/*
- X * History:
- X * woods@robohack.UUCP - Mon Oct 12 15:11:03 EDT 1992
- X * - added version and help message
- X *
- X * rstory@shaboom.UUCP - Sat Sep 19 09:25:36 EDT 1992
- X * - added reporting of date range time stamping
- X *
- X * woods@robohack.UUCP - Thu Aug 27 00:52:14 EDT 1992
- X * - finally an ULTRIX SYSLOG to work with!
- X *
- X * woods@robohack.UUCP - Tue Aug 25 22:07:24 EDT 1992
- X * - changed some field widths to allow > CPS values
- X *
- X * woods@robohack.UUCP - Sun Feb 16 14:30:38 EST 1992
- X * - added new report style for systems by port...
- X *
- X * woods@eci386.UUCP - Mon Jul 16 10:46:06 EDT 1990
- X * - fixed compare math
- X *
- X * woods@robohack.UUCP - Sun Jul 15 18:11:48 EDT 1990
- X * - major re-write
- X * - added list library modules
- X * - added print options (and name sort option)
- X *
- X * @(#) PROJ: uutraf
- X * @(#) FILE: uutraf.c
- X * @(#) Release: 1.2
- X * @(#) Rel. Date: 2/2/90
- X * @(#) Author: Greg Hackney <hack@texbell.swbt.com>
- X */
- X
- Xforward LINK *getsys();
- Xforward PORT *getdev();
- Xforward void procfile(),
- X tsfill(),
- X zerosys(),
- X zerodev(),
- X sortrun(),
- X printrun(),
- X printsys(),
- X printdev(),
- X printsum(),
- X printtmrng(),
- X comma_fy(),
- X sortlst(),
- X usage_err();
- Xforward cmp_t cmpdev(),
- X cmpsys();
- X
- Xchar *argv0 = NULL;
- X
- Xchar *statfile = STATFILE;
- X
- X/*
- X * globals for compare routines
- X */
- Xunsigned short sort_sys_f = 0,
- X sort_dev_f = 0;
- X
- X#ifdef DEBUG
- Xint debug = 0;
- X#endif
- X
- X/* ARGSUSED */
- Xint
- Xmain(argc, argv, envp)
- X int argc;
- X char *argv[];
- X char *envp[];
- X{
- X unsigned short sortopt, /* default sort method, see defs.h */
- X sortnames,
- X printopt;
- X static SUMM trec = {0}; /* summary record */
- X llst_t *syslst, /* linked list of per-system totals */
- X *devlst; /* linked list of per-device totals */
- X int c;
- X FILE *logfile = NULL;
- X
- X sortnames = 0;
- X sortopt = 0;
- X printopt = 0;
- X devlst = syslst = (llst_t *) NULL;
- X
- X argv0 = (argv0 = strrchr(argv[0], '/')) ? argv0 + 1 : argv[0];
- X
- X while ((c = getopt(argc, argv, "HMNPSVab:c:f:hnt:sx:")) != EOF) {
- X switch (c) {
- X case 'H':
- X printopt |= HEADERS;
- X break;
- X case 'N':
- X printopt |= SYS_RPT;
- X break;
- X case 'S':
- X printopt |= SUMM_RPT;
- X break;
- X#ifdef HAVE_HDBUUCP
- X case 'P':
- X printopt |= PORT_RPT;
- X break;
- X case 'M':
- X printopt |= (SYSBYPORT_OPT | SYS_RPT);
- X break;
- X#endif
- X case 'a': /* sort in ascending vs. descending order */
- X sortopt |= REVERSE;
- X break;
- X case 'b': /* sort by bytes xmitted and/or received */
- X if (*(optarg + 1) != EOS)
- X usage_err(argv0, "-b requires a one-letter argument");
- X switch (*optarg) {
- X case 'b':
- X sortopt |= (RECEIVED | XMIT);
- X break;
- X case 'r':
- X sortopt |= RECEIVED;
- X break;
- X case 'x':
- X sortopt |= XMIT;
- X break;
- X default:
- X usage_err(argv0, "-b's argument must be one of [brx]");
- X break;
- X }
- X break;
- X case 'c': /* sort by xfer rate xmitted and/or received */
- X if (*(optarg + 1) != EOS)
- X usage_err(argv0, "-c requires a one-letter argument");
- X switch (*optarg) {
- X case 'b':
- X sortopt |= (R_CPS | X_CPS);
- X break;
- X case 'r':
- X sortopt |= R_CPS;
- X break;
- X case 'x':
- X sortopt |= X_CPS;
- X break;
- X default:
- X usage_err(argv0, "-c's argument must be one of [brx]");
- X break;
- X }
- X break;
- X case 'n':
- X sortnames = 1;
- X break;
- X case 'f': /* number of files */
- X if (*(optarg + 1) != EOS)
- X usage_err(argv0, "-f requires a one-letter argument");
- X switch (*optarg) {
- X case 'b':
- X sortopt |= (R_NUMB | X_NUMB);
- X break;
- X case 'r':
- X sortopt |= R_NUMB;
- X break;
- X case 'x':
- X sortopt |= X_NUMB;
- X break;
- X default:
- X usage_err(argv0, "-f's argument must be one of [brx]");
- X break;
- X }
- X break;
- X case 't': /* sort by accumulated time */
- X if (*(optarg + 1) != EOS)
- X usage_err(argv0, "-t requires a one-letter argument");
- X switch (*optarg) {
- X case 'b':
- X sortopt |= (R_TIME | X_TIME);
- X break;
- X case 'r':
- X sortopt |= R_TIME;
- X break;
- X case 'x':
- X sortopt |= X_TIME;
- X break;
- X default:
- X usage_err(argv0, "-t's argument must be one of [brx]");
- X break;
- X }
- X break;
- X case 's': /* Use stdin instead of normal xferstat file */
- X logfile = stdin;
- X break;
- X case 'x':
- X#ifdef DEBUG
- X debug = atoi(optarg);
- X break;
- X#else
- X (void) fprintf(stderr, "%s: debugging not compiled in.\n", argv0);
- X break;
- X#endif
- X case 'V':
- X (void) fprintf(stderr, "%s: Version %d.%d, Patchlevel %d.\n", argv0, version, subver, patchlevel);
- X break;
- X case 'h':
- X usage_err(argv0, usage);
- X break;
- X default:
- X usage_err(argv0, (char *) NULL);
- X break;
- X }
- X }
- X /*
- X * Use default sorting method if none or names was chosen
- X */
- X if (((sortopt == REVERSE) || !sortopt) && !sortnames)
- X sortopt |= DEFAULT_SORT;
- X if ((printopt == HEADERS) || !printopt)
- X printopt |= DEFAULT_RPT;
- X if (optind == argc || logfile) /* fake up the default file */
- X argv[--optind] = statfile;
- X for ( ; optind < argc; optind++) {
- X if (STREQ(argv[optind], "-")) {
- X#ifdef DEBUG
- X if (debug)
- X (void) fprintf(stderr, "%s: processing STDIN.\n", argv0);
- X#endif
- X logfile = stdin;
- X } else {
- X if (! (logfile = fopen(argv[optind], "r"))) {
- X (void) fprintf(stderr, "%s: Can't open %s for reading -- ", argv0, argv[optind]);
- X perror(optarg);
- X }
- X#ifdef DEBUG
- X if (debug)
- X (void) fprintf(stderr, "%s: processing %s.\n", argv0, argv[optind]);
- X#endif
- X }
- X procfile(logfile, &syslst, &devlst, &trec);
- X (void) fclose(logfile); /* will possibly close stdin */
- X }
- X trec.syscnt = llst_total(syslst);
- X#ifdef HAVE_HDBUUCP
- X trec.devcnt = llst_total(devlst);
- X#endif
- X sortrun(syslst, devlst, sortopt, sortopt); /* sort it */
- X printrun(syslst, devlst, &trec, printopt); /* print it out */
- X exit(0);
- X /* NOTREACHED */
- X}
- X
- Xvoid
- Xprocfile(logfile, syslstp, devlstp, trec)
- X FILE *logfile;
- X llst_t **syslstp;
- X llst_t **devlstp;
- X SUMM *trec;
- X{
- X LINK *sysp;
- X PORT *devp;
- X PORT *portp;
- X char *sys, /* points at the previous remote node name */
- X *user, /* points at the "user-id" */
- X flow[10], /* holds the direction of uucp flow */
- X buf[BUFSIZ], /* general purpose */
- X *string; /* general purpose */
- X long bytes; /* number of bytes in the uucp xfer */
- X float seconds; /* number of seconds the xfer took */
- X int mon, day, hh, mm;
- X#ifdef HAVE_HDBUUCP
- X char *dev; /* points at the device name used */
- X char mode, pchar;
- X int ss, pid, seq;
- X#else
- X long epoch;
- X#endif
- X#ifdef DEBUG
- X int i = 0;
- X#endif
- X
- X /*
- X * process each line in the logfile
- X */
- X#ifdef HAVE_HDBUUCP
- X /* From an AT&T 3b2/400 SysVr3.2 /usr/spool/uucp/.Admin/xferstats:
- X * fastlane!woods M (2/16-19:43:37) (C,5711,2) [tty33] -> 152 / 1.420 secs, 107 bytes/sec
- X * fastlane!rhl M (2/16-19:43:50) (C,5711,3) [tty33] <- 471 / 6.090 secs, 77 bytes/sec
- X *
- X * From an AIX 3.2 /var/uucp/.Admin/xfererstats:
- X * ecirs6k!uucp M (2/17-19:44:54) (C,8560,0) [notty] <- 365531 / 7.633 secs, 47888 bytes/sec
- X * ecirs6k!uucp M (2/17-22:10:19) (C,321,0) [notty] <- 32178 / 0.366 secs, 87918 bytes/sec
- X */
- X#else
- X /* From an ULTRIX 4.2 /var/spool/uucp/SYSLOG:
- X * daemon becker (8/26-0:14) (714802480) sent 348 b 0 secs, Pk: 7, Rxmt: 0
- X * daemon becker (8/26-0:14) (714802487) sent 89 b 0 secs, Pk: 3, Rxmt: 0
- X * news censor (8/25-6:00) (714736824) received 43842 b 47 secs
- X * news censor (8/25-6:00) (714736827) received 108 b 1 secs
- X */
- X#endif
- X while (fgets(buf, BUFSIZ, logfile)) {
- X#ifdef DEBUG
- X if (debug > 8)
- X (void) fprintf(stderr, "%d: %s", i, buf);
- X#endif
- X user = buf;
- X /*
- X * look for the node name
- X */
- X#ifdef HAVE_HDBUUCP
- X if (!(sys = strtok(buf, "!")))
- X#else
- X if (!(sys = strtok(buf, " ")) ||
- X !(sys = strtok((char *) NULL, " ")))
- X#endif
- X continue;
- X#ifdef DEBUG
- X if (debug > 7)
- X (void) fprintf(stderr, "System: %s, ", sys);
- X#endif
- X /*
- X * look for the junk information
- X */
- X#ifdef HAVE_HDBUUCP
- X if (!(string = strtok((char *) NULL, "[")))
- X continue;
- X if (sscanf(string, "%*s %c (%d/%d-%d:%d:%d) (%c,%d,%d)",
- X &mode, &mon, &day, &hh, &mm, &ss, &pchar, &pid, &seq) == EOF)
- X continue;
- X# ifdef DEBUG
- X if (debug > 6)
- X (void) fprintf(stderr, "mode: %c, time&pid: (%d/%d-%d:%d:%d) (%c,%d,%d)\n",
- X mode, mon, day, hh, mm, ss, pchar, pid, seq);
- X# endif
- X#else
- X if (!(string = strtok((char *) NULL, " ")))
- X continue;
- X# ifdef DEBUG
- X if (debug > 8)
- X (void) fprintf(stderr, "date&time ");
- X# endif
- X if (sscanf(string, "(%d/%d-%d:%d)", &mon, &day, &hh, &mm) == EOF)
- X continue;
- X# ifdef DEBUG
- X if (debug > 6)
- X (void) fprintf(stderr, "(%d/%d-%d:%d)", mon, day, hh, mm);
- X# endif
- X if (!(string = strtok((char *) NULL, " ")))
- X continue;
- X# ifdef DEBUG
- X if (debug > 8)
- X (void) fprintf(stderr, " epoch");
- X# endif
- X if (sscanf(string, "(%ld)", &epoch) == EOF)
- X continue;
- X# ifdef DEBUG
- X if (debug > 6)
- X (void) fprintf(stderr, " (%ld)\n", mon, day, hh, mm, epoch);
- X# endif
- X#endif
- X tsfill(trec, mon, day, hh, mm); /* should be inlined for efficiency */
- X#ifdef HAVE_HDBUUCP
- X /*
- X * look for the device name
- X */
- X if (!(dev = strtok((char *) NULL, "]")))
- X continue;
- X#endif
- X /*
- X * parse the remainder of the data string
- X */
- X if (!(string = strtok((char *) NULL, "\n")))
- X continue;
- X#ifdef HAVE_HDBUUCP
- X if (sscanf(string, "%s %ld / %f", flow, &bytes, &seconds) == EOF)
- X#else
- X# if defined(ultrix) || defined(__ultrix__) /* ???? */
- X if (sscanf(string, "%s %ld b %f secs", flow, &bytes, &seconds) == EOF)
- X# else
- X if (sscanf(string, "%s data %ld bytes %f secs", flow, &bytes, &second) == EOF)
- X# endif
- X#endif
- X continue;
- X if (!(sysp = getsys(syslstp, sys)))
- X exit(1);
- X#ifdef HAVE_HDBUUCP
- X if (!(devp = getdev(devlstp, dev)))
- X exit(1);
- X if (sysp->l_lastpid != pid) {
- X sysp->l_lastpid = pid;
- X if (mode == 'M')
- X sysp->l_out_conn++;
- X else
- X sysp->l_in_conn++;
- X }
- X if (devp->p_lastpid != pid) {
- X devp->p_lastpid = pid;
- X if (mode == 'M')
- X devp->p_out_conn++;
- X else
- X devp->p_in_conn++;
- X }
- X#endif
- X /* outgoing uucp */
- X if (STREQ(flow, OUT)
- X#ifdef pyr
- X || STREQ(flow, T_OUT) || STREQ(flow, F_OUT)
- X#endif
- X ) {
- X#ifdef DEBUG
- X if (debug > 5)
- X# ifdef HAVE_HDBUUCP
- X (void) fprintf(stderr, "%s OUTGOING %s\n", sys, dev);
- X# else
- X (void) fprintf(stderr, "%s OUTGOING\n", sys);
- X# endif
- X#endif
- X sysp->l_xmit += bytes;
- X sysp->l_xmit_time += seconds;
- X sysp->l_xmit_cnt++;
- X#ifdef HAVE_HDBUUCP
- X devp->p_xmit += bytes;
- X devp->p_xmit_time += seconds;
- X devp->p_xmit_cnt++;
- X if (!(portp = getdev(&(sysp->l_portlst), dev)))
- X exit(1);
- X portp->p_xmit += bytes;
- X portp->p_xmit_time += seconds;
- X portp->p_xmit_cnt++;
- X if (portp->p_lastpid != pid) {
- X portp->p_lastpid = pid;
- X if (mode == 'M') {
- X portp->p_out_conn++;
- X trec->num_out_conn++; /* only once! */
- X } else {
- X portp->p_in_conn++;
- X trec->num_in_conn++;
- X }
- X }
- X#endif
- X trec->bytes_xmit += bytes; /* summary totals */
- X trec->sec_xmit += seconds;
- X trec->num_xmit++;
- X } else if (STREQ(flow, IN) /* incoming uucp */
- X
- X#ifdef pyr
- X || STREQ(flow, T_IN) || STREQ(flow, F_IN)
- X#endif
- X ) {
- X#ifdef DEBUG
- X if (debug > 5)
- X# ifdef HAVE_HDBUUC
- X (void) fprintf(stderr, "%s INCOMING %s\n", sys, dev);
- X# else
- X (void) fprintf(stderr, "%s INCOMING\n", sys);
- X# endif
- X#endif
- X sysp->l_recv += bytes;
- X sysp->l_recv_time += seconds;
- X sysp->l_recv_cnt++;
- X#ifdef HAVE_HDBUUCP
- X devp->p_recv += bytes;
- X devp->p_recv_time += seconds;
- X devp->p_recv_cnt++;
- X if (!(portp = getdev(&(sysp->l_portlst), dev)))
- X exit(1);
- X portp->p_recv += bytes;
- X portp->p_recv_time += seconds;
- X portp->p_recv_cnt++;
- X if (portp->p_lastpid != pid) {
- X portp->p_lastpid = pid;
- X if (mode == 'M') {
- X portp->p_out_conn++;
- X trec->num_out_conn++;
- X } else {
- X portp->p_in_conn++;
- X trec->num_in_conn++;
- X }
- X }
- X#endif
- X trec->bytes_recv += bytes; /* summary totals */
- X trec->sec_recv += seconds;
- X trec->num_recv++;
- X }
- X#ifdef DEBUG
- X i++;
- X#endif
- X }
- X return;
- X}
- X
- X#ifdef HAVE_HDBUUCP
- XPORT *
- Xgetdev(devlstp, d) /* returns an link struct to the system name specified. */
- X llst_t **devlstp;
- X char *d;
- X{
- X llst_t *work;
- X PORT *nd;
- X PORT sd;
- X
- X extern unsigned short sort_dev_f;
- X
- X sort_dev_f = 0; /* set default comparison of name only */
- X work = *devlstp;
- X if (! work) { /* must be the first time thru */
- X#ifdef DEBUG
- X if (debug > 2)
- X (void) fprintf(stderr, "initialising devlst (%s)\n", d);
- X#endif
- X if (!(work = llst_new())) {
- X perror("getdev(): llst_new() failed");
- X return(NULL);
- X }
- X if (!(nd = (PORT *) malloc(sizeof(PORT)))) {
- X perror("getdev(): malloc(nd) failed");
- X llst_destroy(work);
- X return(NULL);
- X }
- X if (!llst_add(work, (char *) nd)) {
- X perror("getdev(): llst_add(nd) failed");
- X llst_destroy(work);
- X free(nd);
- X return(NULL);
- X }
- X *devlstp = work;
- X zerodev(nd);
- X (void) strncpy(nd->p_dname, d, sizeof(nd->p_dname) - 1);
- X return(nd);
- X }
- X zerodev(&sd);
- X (void) strncpy(sd.p_dname, d, sizeof(sd.p_dname) - 1);
- X if (!llst_find(work, (char *) &sd, cmpdev)) {
- X /*
- X * create a new link
- X */
- X#ifdef DEBUG
- X if (debug > 1)
- X (void) fprintf(stderr, "adding new device - %s\n", d);
- X#endif
- X if (!(nd = (PORT *) malloc(sizeof(PORT)))) {
- X perror("getdev(): malloc(nd2) failed");
- X return(NULL);
- X }
- X if (!llst_add(work, (char *) nd)) {
- X perror("getdev(): llst_add(nd2) failed");
- X free(nd);
- X return(NULL);
- X }
- X zerodev(nd);
- X (void) strncpy(nd->p_dname, d, sizeof(nd->p_dname) - 1);
- X }
- X return((PORT *) llst_current(work));
- X}
- X#endif
- X
- XLINK *
- Xgetsys(syslstp, s) /* returns an link struct to the system name specified. */
- X llst_t **syslstp;
- X char *s;
- X{
- X llst_t *work;
- X LINK *nd;
- X char buf[BUFSIZ];
- X LINK *sd = (LINK *) buf;
- X
- X extern unsigned short sort_sys_f;
- X
- X sort_sys_f = 0; /* set default comparison of name only */
- X work = *syslstp;
- X if (! work) { /* must be the first time thru */
- X#ifdef DEBUG
- X if (debug > 2)
- X (void) fprintf(stderr, "initialising syslst (%s)\n", s);
- X#endif
- X if (!(work = llst_new())) {
- X perror("getsys(): llst_new() failed");
- X return(NULL);
- X }
- X if (!(nd = (LINK *) malloc(sizeof(LINK) + strlen(s)))) {
- X perror("getsys(): malloc() failed");
- X llst_destroy(work);
- X return(NULL);
- X }
- X if (!llst_add(work, (char *) nd)) {
- X perror("getsys(): llst_add(nd) failed");
- X llst_destroy(work);
- X free(nd);
- X return(NULL);
- X }
- X *syslstp = work;
- X zerosys(nd);
- X (void) strcpy(nd->l_sysname, s);
- X return(nd);
- X }
- X zerosys(sd);
- X (void) strcpy(sd->l_sysname, s);
- X if (!llst_find(work, (char *) sd, cmpsys)) {
- X /*
- X * create a new link
- X */
- X#ifdef DEBUG
- X if (debug > 1)
- X (void) fprintf(stderr, "adding new system - %s\n", s);
- X#endif
- X if (!(nd = (LINK *) malloc(sizeof(LINK) + strlen(s)))) {
- X#ifdef DEBUG
- X (void) fprintf(stderr, "malloc(%d + %d)\n", sizeof(LINK), strlen(s));
- X#endif
- X perror("getsys(): malloc(nd2) failed");
- X return((LINK *) NULL);
- X }
- X if (!llst_add(work, (char *) nd)) {
- X perror("getsys(): llst_add(nd2) failed");
- X free(nd);
- X return(NULL);
- X }
- X zerosys(nd);
- X (void) strcpy(nd->l_sysname, s);
- X }
- X return((LINK *) llst_current(work));
- X}
- X
- Xvoid
- Xzerosys(l)
- X LINK *l;
- X{
- X /*
- X * added for portability vs. memset/bzero
- X */
- X l->l_recv = 0.0;
- X l->l_recv_time = 0.0;
- X l->l_recv_cnt = 0L;
- X l->l_xmit = 0.0;
- X l->l_xmit_time = 0.0;
- X l->l_xmit_cnt = 0L;
- X l->l_in_conn = 0;
- X l->l_out_conn = 0;
- X l->l_lastpid = 0;
- X l->l_portlst = NULL;
- X l->l_sysname[0] = '\0';
- X}
- X
- Xvoid
- Xzerodev(p)
- X PORT *p;
- X{
- X /*
- X * added for portability vs. memset/bzero
- X */
- X p->p_recv = 0.0;
- X p->p_recv_time = 0.0;
- X p->p_recv_cnt = 0L;
- X p->p_xmit = 0.0;
- X p->p_xmit_time = 0.0;
- X p->p_xmit_cnt = 0L;
- X p->p_in_conn = 0;
- X p->p_out_conn = 0;
- X p->p_lastpid = 0;
- X p->p_syslst = NULL;
- X p->p_dname[0] = '\0';
- X}
- X
- Xvoid
- Xtsfill(trec, mon, day, hh, mm)
- X SUMM *trec;
- X int mon;
- X int day;
- X int hh;
- X int mm;
- X{
- X static int AlreadySetFirst = FALSE;
- X
- X if (!AlreadySetFirst) {
- X#ifdef DEBUG
- X if (debug > 2)
- X (void) fprintf(stderr, "initialising trec->first_rec (%d/%d-%02d:%02d)\n", mon, day, hh, mm);
- X#endif
- X trec->first_rec.tm_mon = mon;
- X trec->first_rec.tm_mday = day;
- X trec->first_rec.tm_hour = hh;
- X trec->first_rec.tm_min = mm;
- X AlreadySetFirst = TRUE;
- X } else {
- X#ifdef DEBUG
- X if (debug > 2)
- X (void) fprintf(stderr, "initialising trec->last_rec (%d/%d-%02d:%02d)\n", mon, day, hh, mm);
- X#endif
- X trec->last_rec.tm_mon = mon;
- X trec->last_rec.tm_mday = day;
- X trec->last_rec.tm_hour = hh;
- X trec->last_rec.tm_min = mm;
- X }
- X return;
- X}
- X
- Xvoid
- Xsortrun(syslst, devlst, howsys, howdev)
- X llst_t *syslst;
- X llst_t *devlst;
- X unsigned short howsys;
- X unsigned short howdev;
- X{
- X extern cmp_t cmpdev();
- X extern cmp_t cmpsys();
- X extern unsigned short sort_sys_f;
- X extern unsigned short sort_dev_f;
- X
- X#ifdef DEBUG
- X if (debug)
- X (void) fprintf(stderr, "%s: sorting system and device lists.\n", argv0);
- X#endif
- X sort_sys_f = howsys; /* set global used by cmpsys() */
- X llst_sort(syslst, cmpsys);
- X llst_top(devlst);
- X do {
- X PORT *devp;
- X
- X if (! (devp = (PORT *) llst_current(devlst)))
- X continue;
- X llst_sort(devp->p_syslst, cmpsys);
- X } while (llst_next(devlst));
- X sort_dev_f = howdev; /* set global used by cmpdev() */
- X llst_sort(devlst, cmpdev);
- X llst_top(syslst);
- X do {
- X LINK *sysp;
- X
- X if (! (sysp = (LINK *) llst_current(syslst)))
- X continue;
- X llst_sort(sysp->l_portlst, cmpdev);
- X } while (llst_next(syslst));
- X return;
- X}
- X
- Xvoid
- Xprintrun(syslst, devlst, trec, printopt)
- X llst_t *syslst;
- X llst_t *devlst;
- X SUMM *trec;
- X unsigned short printopt;
- X{
- X#ifdef DEBUG
- X if (debug)
- X (void) fprintf(stderr, "%s: printing report.\n", argv0);
- X#endif
- X if (printopt & SYS_RPT)
- X printsys(syslst, trec, printopt);
- X#ifdef HAVE_HDBUUCP
- X if (printopt & PORT_RPT)
- X printdev(devlst, trec, printopt);
- X#endif
- X if (printopt & SUMM_RPT)
- X printsum(trec, printopt);
- X return;
- X}
- X
- X/* ARGSUSED */
- Xvoid
- Xprintsys(syslst, trec, printopt)
- X llst_t *syslst;
- X SUMM *trec;
- X unsigned short printopt;
- X{
- X LINK *sysp;
- X
- X if (printopt & HEADERS) {
- X printtmrng(trec, printopt);
- X (void) printf("%-8s ", "Remote");
- X (void) printf("%9s ", "K-Bytes");
- X (void) printf("%9s ", "K-Bytes");
- X (void) printf("%9s ", "K-Bytes");
- X (void) printf("%5s ", "Hours");
- X (void) printf("%5s ", "Hours");
- X (void) printf("%6s ", "AvCPS");
- X (void) printf("%6s ", "AvCPS");
- X (void) printf("%4s ", "#");
- X (void) printf("%4s ", "#");
- X#ifdef HAVE_HDBUUCP
- X (void) printf("%3s\n", "#");
- X#else
- X (void) putchar('\n');
- X#endif
- X
- X (void) printf("%-8s ", "SiteName");
- X (void) printf("%9s ", "Recv");
- X (void) printf("%9s ", "Xmit");
- X (void) printf("%9s ", "Total");
- X (void) printf("%5s ", "Recv");
- X (void) printf("%5s ", "Xmit");
- X (void) printf("%6s ", "Recv");
- X (void) printf("%6s ", "Xmit");
- X (void) printf("%4s ", "Recv");
- X (void) printf("%4s ", "Xmit");
- X#ifdef HAVE_HDBUUCP
- X (void) printf("%3s\n", "Con");
- X#else
- X (void) putchar('\n');
- X#endif
- X
- X (void) printf("%s ", "--------");
- X (void) printf("%s ", "---------");
- X (void) printf("%s ", "---------");
- X (void) printf("%s ", "---------");
- X (void) printf("%s ", "-----");
- X (void) printf("%s ", "-----");
- X (void) printf("%s ", "------");
- X (void) printf("%s ", "------");
- X (void) printf("%s ", "----");
- X (void) printf("%s ", "----");
- X#ifdef HAVE_HDBUUCP
- X (void) printf("%s\n", "---");
- X#else
- X (void) putchar('\n');
- X#endif
- X }
- X
- X llst_top(syslst);
- X do {
- X if (! (sysp = (LINK *) llst_current(syslst)))
- X continue;
- X (void) printf("%-9.9s", sysp->l_sysname);
- X (void) printf("%9.3f ", (double) sysp->l_recv / 1024.0);
- X (void) printf("%9.3f ", (double) sysp->l_xmit / 1024.0);
- X (void) printf("%9.3f ", (double) (sysp->l_xmit + sysp->l_recv) / 1024.0);
- X (void) printf("%5.2f ", (double) sysp->l_recv_time / 3600.0);
- X (void) printf("%5.2f ", (double) sysp->l_xmit_time / 3600.0);
- X if (sysp->l_recv_time != 0.0) /* divide by zero ? */
- X (void) printf("%6.0f ", (double) sysp->l_recv / sysp->l_recv_time);
- X else
- X (void) printf("%6.0f ", (double) 0);
- X if (sysp->l_xmit_time != 0.0) /* divide by zero ? */
- X (void) printf("%6.0f ", (double) sysp->l_xmit / sysp->l_xmit_time);
- X else
- X (void) printf("%6.0f ", (double) 0);
- X (void) printf("%4ld ", sysp->l_recv_cnt);
- X (void) printf("%4ld ", sysp->l_xmit_cnt);
- X#ifdef HAVE_HDBUUCP
- X (void) printf("%3d\n", sysp->l_in_conn + sysp->l_out_conn);
- X if (printopt & SYSBYPORT_OPT) {
- X llst_top(sysp->l_portlst);
- X do {
- X PORT *devp;
- X
- X if (! (devp = (PORT *) llst_current(sysp->l_portlst)))
- X continue;
- X (void) printf("%8.8s ", devp->p_dname);
- X (void) printf("%9.3f ", (double) devp->p_recv / 1024.0);
- X (void) printf("%9.3f ", (double) devp->p_xmit / 1024.0);
- X (void) printf("%9.3f ", (double) (devp->p_xmit + devp->p_recv) / 1024);
- X (void) printf("%5.2f ", (double) devp->p_recv_time / 3600.0);
- X (void) printf("%5.2f ", (double) devp->p_xmit_time / 3600.0);
- X if (devp->p_recv_time != 0.0) /* divide by zero ? */
- X (void) printf("%6.0f ", (double) devp->p_recv / devp->p_recv_time);
- X else
- X (void) printf("%6.0f ", (double) 0);
- X if (devp->p_xmit_time != 0.0) /* divide by zero ? */
- X (void) printf("%6.0f ", (double) devp->p_xmit / devp->p_xmit_time);
- X else
- X (void) printf("%6.0f ", (double) 0);
- X (void) printf("%4ld ", devp->p_recv_cnt);
- X (void) printf("%4ld ", devp->p_xmit_cnt);
- X (void) printf("%3d\n", devp->p_in_conn + devp->p_out_conn);
- X } while (llst_next(sysp->l_portlst));
- X putchar('\n');
- X }
- X#else
- X putchar('\n');
- X#endif
- X } while (llst_next(syslst));
- X return;
- X}
- X
- X#ifdef HAVE_HDBUUCP
- X/* ARGSUSED */
- Xvoid
- Xprintdev(devlst, trec, printopt)
- X llst_t *devlst;
- X SUMM *trec;
- X unsigned short printopt;
- X{
- X PORT *devp;
- X
- X if (printopt & HEADERS) {
- X printtmrng(trec, printopt);
- X (void) printf("%-8s ", "Port");
- X (void) printf("%9s ", "K-Bytes");
- X (void) printf("%9s ", "K-Bytes");
- X (void) printf("%9s ", "K-Bytes");
- X (void) printf("%5s ", "Hours");
- X (void) printf("%5s ", "Hours");
- X (void) printf("%6s ", "AvCPS");
- X (void) printf("%6s ", "AvCPS");
- X (void) printf("%4s ", "#");
- X (void) printf("%4s ", "#");
- X (void) printf("%3s\n", "#");
- X
- X (void) printf("%-8s ", "Name");
- X (void) printf("%9s ", "Recv");
- X (void) printf("%9s ", "Xmit");
- X (void) printf("%9s ", "Total");
- X (void) printf("%5s ", "Recv");
- X (void) printf("%5s ", "Xmit");
- X (void) printf("%6s ", "Recv");
- X (void) printf("%6s ", "Xmit");
- X (void) printf("%4s ", "Recv");
- X (void) printf("%4s ", "Xmit");
- X (void) printf("%3s\n", "Con");
- X
- X (void) printf("%s ", "--------");
- X (void) printf("%s ", "---------");
- X (void) printf("%s ", "---------");
- X (void) printf("%s ", "---------");
- X (void) printf("%s ", "-----");
- X (void) printf("%s ", "-----");
- X (void) printf("%s ", "------");
- X (void) printf("%s ", "------");
- X (void) printf("%s ", "----");
- X (void) printf("%s ", "----");
- X (void) printf("%s\n", "---");
- X }
- X
- X llst_top(devlst);
- X do {
- X if (! (devp = (PORT *) llst_current(devlst)))
- X continue;
- X (void) printf("%-9.9s", devp->p_dname);
- X (void) printf("%9.3f ", (double) devp->p_recv / 1024.0);
- X (void) printf("%9.3f ", (double) devp->p_xmit / 1024.0);
- X (void) printf("%9.3f ", (double) (devp->p_xmit + devp->p_recv) / 1024.0);
- X (void) printf("%5.2f ", (double) devp->p_recv_time / 3600.0);
- X (void) printf("%5.2f ", (double) devp->p_xmit_time / 3600.0);
- X if (devp->p_recv_time != 0.0) /* divide by zero ? */
- X (void) printf("%6.0f ", (double) devp->p_recv / devp->p_recv_time);
- X else
- X (void) printf("%6.0f ", (double) 0);
- X if (devp->p_xmit_time != 0.0) /* divide by zero ? */
- X (void) printf("%6.0f ", (double) devp->p_xmit / devp->p_xmit_time);
- X else
- X (void) printf("%6.0f ", (double) 0);
- X (void) printf("%4ld ", devp->p_recv_cnt);
- X (void) printf("%4ld ", devp->p_xmit_cnt);
- X (void) printf("%3d\n", devp->p_in_conn + devp->p_out_conn);
- X } while (llst_next(devlst));
- X return;
- X}
- X#endif
- X
- X/* ARGSUSED */
- Xvoid
- Xprintsum(trec, printopt)
- X SUMM *trec;
- X unsigned short printopt;
- X{
- X long total_secs;
- X char buf[BUFSIZ];
- X
- X if (printopt & HEADERS)
- X printtmrng(trec);
- X (void) printf("Active UUCP sites:\t");
- X (void) sprintf(buf, "%d", trec->syscnt);
- X comma_fy(buf);
- X (void) printf("%10s", buf);
- X (void) printf("\tTotal time recv:\t%4d:%02d:%02d\n",
- X (int) (trec->sec_recv / 3600.0),
- X (int) (((int) trec->sec_recv % 3600) / 60),
- X (int) ((int) trec->sec_recv % 60));
- X#ifdef HAVE_HDBUUCP
- X (void) printf("Active UUCP ports:\t");
- X (void) sprintf(buf, "%d", trec->devcnt);
- X comma_fy(buf);
- X (void) printf("%10s", buf);
- X#else
- X (void) printf("\t\t\t\t");
- X#endif
- X (void) printf("\tTotal time xmit:\t%4d:%02d:%02d\n",
- X (int) (trec->sec_xmit / 3600.0),
- X (int) (((int) trec->sec_xmit % 3600) / 60),
- X (int) ((int) trec->sec_xmit % 60));
- X#ifdef HAVE_HDBUUCP
- X (void) printf("Connections with work:\t");
- X (void) sprintf(buf, "%ld", trec->num_in_conn + trec->num_out_conn);
- X comma_fy(buf);
- X (void) printf("%10s", buf);
- X#else
- X (void) printf("\t\t\t\t");
- X#endif
- X total_secs = trec->sec_recv + trec->sec_xmit;
- X (void) printf("\tTotal UUCP time:\t%4d:%02d:%02d\n",
- X (int) (total_secs / 3600.0),
- X (int) (((long) total_secs % 3600) / 60),
- X (int) ((long) total_secs % 60));
- X (void) printf("\nTotal files rec'd:\t");
- X (void) sprintf(buf, "%ld", trec->num_recv);
- X comma_fy(buf);
- X (void) printf("%10s", buf);
- X (void) printf("\tTotal bytes rec'd:\t");
- X (void) sprintf(buf, "%ld", trec->bytes_recv);
- X comma_fy(buf);
- X (void) printf("%10s\n", buf);
- X (void) printf("Total files xmit:\t");
- X (void) sprintf(buf, "%ld", trec->num_xmit);
- X comma_fy(buf);
- X (void) printf("%10s", buf);
- X (void) printf("\tTotal bytes xmit:\t");
- X (void) sprintf(buf, "%ld", trec->bytes_xmit);
- X comma_fy(buf);
- X (void) printf("%10s\n", buf);
- X (void) printf("Total files:\t\t");
- X (void) sprintf(buf, "%ld", trec->num_xmit + trec->num_recv);
- X comma_fy(buf);
- X (void) printf("%10s", buf);
- X (void) printf("\tTotal bytes:\t\t");
- X (void) sprintf(buf, "%ld", trec->bytes_xmit + trec->bytes_recv);
- X comma_fy(buf);
- X (void) printf("%10s\n", buf);
- X return;
- X}
- X
- X/*
- X * print report header & report time range
- X */
- Xvoid
- Xprinttmrng(trec, printopt)
- X SUMM *trec;
- X int printopt;
- X{
- X static char *months[] = {
- X "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- X "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
- X };
- X static int IsAlreadyPrinted = FALSE;
- X
- X if (IsAlreadyPrinted) {
- X putchar('\n');
- X return;
- X }
- X (void) printf("%*sUUCP Traffic Report\n", 31, " ");
- X if (trec->first_rec.tm_mon && trec->last_rec.tm_mon) {
- X (void) printf("%*sFrom: %s %2d %02d:%02d To: %s %2d %02d:%02d\n\n",
- X 22, " ",
- X months[trec->first_rec.tm_mon-1],
- X trec->first_rec.tm_mday,
- X trec->first_rec.tm_hour,
- X trec->first_rec.tm_min,
- X months[trec->last_rec.tm_mon-1],
- X trec->last_rec.tm_mday,
- X trec->last_rec.tm_hour,
- X trec->last_rec.tm_min);
- X }
- X IsAlreadyPrinted = TRUE;
- X return;
- X}
- X
- X/*
- X * put commas in long numeric strings contained in buf[]
- X */
- Xvoid
- Xcomma_fy(buf)
- X char buf[];
- X{
- X int i, ii, cnt;
- X char backw[BUFSIZ];
- X
- X /*
- X * put string backwards inserting commas
- X */
- X for (ii = 0, cnt = 0, i = strlen(buf) - 1; i >= 0 ; i--) {
- X backw[ii++] = buf[i];
- X if (buf[i] == '.')
- X cnt = 0;
- X else if (++cnt == 3) {
- X if (i && buf[i - 1] != '\0' && isdigit(buf[i - 1]))
- X backw[ii++] = ',';
- X cnt = 0;
- X }
- X }
- X backw[ii] = '\0';
- X /*
- X * put string forward
- X */
- X for (ii = 0, cnt = 0, i = strlen(backw) - 1; i >= 0 ; i--)
- X buf[ii++] = backw[i];
- X buf[ii]='\0';
- X}
- X
- Xcmp_t
- Xcmpdev(a, b)
- X PORT *a,
- X *b; /* we rely on alignment of char * */
- X{
- X float aw = 0, bw = 0;
- X extern unsigned short sort_dev_f;
- X
- X if (sort_dev_f & RECEIVED) {
- X aw += a->p_recv;
- X bw += b->p_recv;
- X }
- X if (sort_dev_f & XMIT) {
- X aw += a->p_xmit;
- X bw += b->p_xmit;
- X }
- X if (sort_dev_f & R_TIME) {
- X aw += a->p_recv_time;
- X bw += b->p_recv_time;
- X }
- X if (sort_dev_f & X_TIME) {
- X aw += a->p_xmit_time;
- X bw += b->p_xmit_time;
- X }
- X if (sort_dev_f & R_CPS) {
- X if (a->p_recv_time != 0)
- X aw += (float) a->p_recv / (float) a->p_recv_time;
- X if (b->p_recv_time != 0)
- X bw += (float) b->p_recv / (float) b->p_recv_time;
- X }
- X if (sort_dev_f & X_CPS) {
- X if (a->p_xmit_time != 0)
- X aw += (float) a->p_xmit / (float) a->p_xmit_time;
- X if (b->p_xmit_time != 0)
- X bw += (float) b->p_xmit / (float) b->p_xmit_time;
- X }
- X if (sort_dev_f & R_NUMB) {
- X aw += a->p_recv_cnt;
- X bw += b->p_recv_cnt;
- X }
- X if (sort_dev_f & X_NUMB) {
- X aw += a->p_xmit_cnt;
- X bw += b->p_xmit_cnt;
- X }
- X if (!sort_dev_f || (sort_sys_f == REVERSE) || ((aw == 0) && (bw == 0)))
- X aw = strcmp(b->p_dname, a->p_dname);
- X if (sort_sys_f & REVERSE)
- X return((cmp_t) (aw - bw));
- X else
- X return((cmp_t) (bw - aw));
- X}
- X
- Xcmp_t
- Xcmpsys(a, b)
- X LINK *a,
- X *b;
- X{
- X float aw = 0, bw = 0;
- X extern unsigned short sort_sys_f;
- X
- X if (sort_sys_f & RECEIVED) {
- X aw += a->l_recv;
- X bw += b->l_recv;
- X }
- X if (sort_sys_f & XMIT) {
- X aw += a->l_xmit;
- X bw += b->l_xmit;
- X }
- X if (sort_sys_f & R_TIME) {
- X aw += a->l_recv_time;
- X bw += b->l_recv_time;
- X }
- X if (sort_sys_f & X_TIME) {
- X aw += a->l_xmit_time;
- X bw += b->l_xmit_time;
- X }
- X if (sort_sys_f & R_CPS) {
- X if (a->l_recv_time != 0)
- X aw += (float) a->l_recv / (float) a->l_recv_time;
- X if (b->l_recv_time != 0)
- X bw += (float) b->l_recv / (float) b->l_recv_time;
- X }
- X if (sort_sys_f & X_CPS) {
- X if (a->l_xmit_time != 0)
- X aw += (float) a->l_xmit / (float) a->l_xmit_time;
- X if (b->l_xmit_time != 0)
- X bw += (float) b->l_xmit / (float) b->l_xmit_time;
- X }
- X if (sort_sys_f & R_NUMB) {
- X aw += a->l_recv_cnt;
- X bw += b->l_recv_cnt;
- X }
- X if (sort_sys_f & X_NUMB) {
- X aw += a->l_xmit_cnt;
- X bw += b->l_xmit_cnt;
- X }
- X if (!sort_sys_f || (sort_sys_f == REVERSE) || ((aw == 0) && (bw == 0)))
- X aw = strcmp(b->l_sysname, a->l_sysname);
- X if (sort_sys_f & REVERSE)
- X return((cmp_t) (aw - bw));
- X else
- X return((cmp_t) (bw - aw));
- X}
- X
- X
- Xvoid
- Xusage_err(arg0, msg)
- X char *arg0;
- X char *msg;
- X{
- X (void) fprintf(stderr, "Usage: %s [options] [xferstat_file | -]\n", arg0);
- X if (msg && *msg)
- X (void) fprintf(stderr, "%s\n", msg);
- X exit(2);
- X /* NOTREACHED */
- X}
- X
- END_OF_FILE
- if test 30807 -ne `wc -c <'uutraf.c'`; then
- echo shar: \"'uutraf.c'\" unpacked with wrong size!
- fi
- # end of 'uutraf.c'
- fi
- echo shar: End of archive 3 \(of 4\).
- cp /dev/null ark3isdone
- MISSING=""
- for I in 1 2 3 4 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 4 archives.
- echo "Please read the file README first"
- rm -f ark[1-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
-