home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / unix / volume26 / uutraf / part03 < prev    next >
Encoding:
Text File  |  1993-05-07  |  32.9 KB  |  1,291 lines

  1. Newsgroups: comp.sources.unix
  2. From: decvax!concert.net!woods%robohack (Greg A. Woods)
  3. Subject: v26i238: uutraf - UUCP Traffic Analysis and Reporting, Part03/04
  4. Sender: unix-sources-moderator@efficacy.home.vix.com
  5. Approved: vixie@efficacy.home.vix.com
  6.  
  7. Submitted-By: decvax!concert.net!woods%robohack (Greg A. Woods)
  8. Posting-Number: Volume 26, Issue 238
  9. Archive-Name: uutraf/part03
  10.  
  11. #! /bin/sh
  12. # This is a shell archive.  Remove anything before this line, then unpack
  13. # it by saving it into a file and typing "sh file".  To overwrite existing
  14. # files, type "sh file -c".  You can also feed this as standard input via
  15. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  16. # will see the following message at the end:
  17. #        "End of archive 3 (of 4)."
  18. # Contents:  uutraf.c
  19. # Wrapped by woods@robohack on Sun Nov  8 16:38:14 1992
  20. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  21. if test -f 'uutraf.c' -a "${1}" != "-c" ; then 
  22.   echo shar: Will not clobber existing file \"'uutraf.c'\"
  23. else
  24. echo shar: Extracting \"'uutraf.c'\" \(30807 characters\)
  25. sed "s/^X//" >'uutraf.c' <<'END_OF_FILE'
  26. X/*
  27. X *    uutraf.c - generate UUCP traffic reports and summaries
  28. X */
  29. X
  30. X#define SID    "@(#)uutraf:uutraf.c    1.2.2.8    92/10/23 10:23:03 (woods)"
  31. X#include <sccsid.h>
  32. X
  33. X#if defined(USE_STDDEF) || defined(_POSIX_SOURCE) || \
  34. X    REALSTDC || (__STDC__ - 0) == 1
  35. X# include <stddef.h>    /* should do before sysdefs.h */
  36. X#endif
  37. X#include <sysdefs.h>    /* a local header for common portability */
  38. X#include <sys/types.h>
  39. X#include <time.h>
  40. X#include <stdio.h>
  41. X#include <ctype.h>
  42. X#include <math.h>
  43. X#ifdef BSD        /* really only pre-4.4BSD? */
  44. X# include <strings.h>
  45. X#else
  46. X# include <string.h>
  47. X# if !REALSTDC || defined(USE_MALLOC)
  48. X#  include <malloc.h>
  49. X# endif
  50. X# ifndef SYSVR2
  51. X#  include <limits.h>
  52. X# endif
  53. X# include <unistd.h>
  54. X#endif
  55. X#if REALSTDC || defined(USE_STDLIB)
  56. X# include <stdlib.h>
  57. X#endif
  58. X#include <str.h>    /* local header:  STR*() macros */
  59. X#include <libc.h>    /* local header:  for older libc's */
  60. X#include <dlst.h>    /* local header:  dynamic list library */
  61. X#include "defs.h"    /* uutraf's customization */
  62. X#include "uutraf.h"    /* uutraf's common header */
  63. X#include <extern.h>    /* local header:  setup for external declarations */
  64. X#include "version.h"    /* uutraf's version stuff */
  65. X
  66. X#ifndef lint
  67. Xstatic const char *sccsold = "@(#) original uutraf.c : rel 1.2 : mod 2/2/90";
  68. X#endif
  69. X
  70. X/*
  71. X * History:
  72. X *    woods@robohack.UUCP - Mon Oct 12 15:11:03 EDT 1992
  73. X *    - added version and help message
  74. X *
  75. X *    rstory@shaboom.UUCP - Sat Sep 19 09:25:36 EDT 1992
  76. X *    - added reporting of date range time stamping
  77. X *
  78. X *    woods@robohack.UUCP - Thu Aug 27 00:52:14 EDT 1992
  79. X *    - finally an ULTRIX SYSLOG to work with!
  80. X *
  81. X *    woods@robohack.UUCP - Tue Aug 25 22:07:24 EDT 1992
  82. X *    - changed some field widths to allow > CPS values
  83. X *
  84. X *    woods@robohack.UUCP - Sun Feb 16 14:30:38 EST 1992
  85. X *    - added new report style for systems by port...
  86. X *
  87. X *    woods@eci386.UUCP - Mon Jul 16 10:46:06 EDT 1990
  88. X *    - fixed compare math
  89. X *
  90. X *    woods@robohack.UUCP - Sun Jul 15 18:11:48 EDT 1990
  91. X *    - major re-write
  92. X *    - added list library modules
  93. X *    - added print options (and name sort option)
  94. X *
  95. X * @(#) PROJ:        uutraf
  96. X * @(#) FILE:        uutraf.c
  97. X * @(#) Release:    1.2
  98. X * @(#) Rel. Date:    2/2/90
  99. X * @(#) Author:        Greg Hackney <hack@texbell.swbt.com>
  100. X */
  101. X
  102. Xforward LINK    *getsys();
  103. Xforward PORT    *getdev();
  104. Xforward void    procfile(),
  105. X        tsfill(),
  106. X        zerosys(),
  107. X        zerodev(),
  108. X        sortrun(),
  109. X        printrun(),
  110. X        printsys(),
  111. X        printdev(),
  112. X        printsum(),
  113. X        printtmrng(),
  114. X        comma_fy(),
  115. X        sortlst(),
  116. X        usage_err();
  117. Xforward cmp_t    cmpdev(),
  118. X        cmpsys();
  119. X
  120. Xchar        *argv0 = NULL;
  121. X
  122. Xchar        *statfile = STATFILE;
  123. X
  124. X/*
  125. X * globals for compare routines
  126. X */
  127. Xunsigned short    sort_sys_f = 0,
  128. X        sort_dev_f = 0;
  129. X
  130. X#ifdef DEBUG
  131. Xint    debug = 0;
  132. X#endif
  133. X
  134. X/* ARGSUSED */
  135. Xint
  136. Xmain(argc, argv, envp)
  137. X    int    argc;
  138. X    char    *argv[];
  139. X    char    *envp[];
  140. X{
  141. X    unsigned short    sortopt,    /* default sort method, see defs.h */
  142. X            sortnames,
  143. X            printopt;
  144. X    static SUMM    trec = {0};    /* summary record */
  145. X    llst_t        *syslst,    /* linked list of per-system totals */
  146. X            *devlst;    /* linked list of per-device totals */
  147. X    int        c;
  148. X    FILE        *logfile = NULL;
  149. X
  150. X    sortnames = 0;
  151. X    sortopt = 0;
  152. X    printopt = 0;
  153. X    devlst = syslst = (llst_t *) NULL;
  154. X
  155. X    argv0 = (argv0 = strrchr(argv[0], '/')) ? argv0 + 1 : argv[0];
  156. X
  157. X    while ((c = getopt(argc, argv, "HMNPSVab:c:f:hnt:sx:")) != EOF) {
  158. X        switch (c) {
  159. X        case 'H':
  160. X            printopt |= HEADERS;
  161. X            break;
  162. X        case 'N':
  163. X            printopt |= SYS_RPT;
  164. X            break;
  165. X        case 'S':
  166. X            printopt |= SUMM_RPT;
  167. X            break;
  168. X#ifdef HAVE_HDBUUCP
  169. X        case 'P':
  170. X            printopt |= PORT_RPT;
  171. X            break;
  172. X        case 'M':
  173. X            printopt |= (SYSBYPORT_OPT | SYS_RPT);
  174. X            break;
  175. X#endif
  176. X        case 'a':    /* sort in ascending vs. descending order */
  177. X            sortopt |= REVERSE;
  178. X            break;
  179. X        case 'b':    /* sort by bytes xmitted and/or received */
  180. X            if (*(optarg + 1) != EOS)
  181. X                usage_err(argv0, "-b requires a one-letter argument");
  182. X            switch (*optarg) {
  183. X            case 'b':
  184. X                sortopt |= (RECEIVED | XMIT);
  185. X                break;
  186. X            case 'r':
  187. X                sortopt |= RECEIVED;
  188. X                break;
  189. X            case 'x':
  190. X                sortopt |= XMIT;
  191. X                break;
  192. X            default:
  193. X                usage_err(argv0, "-b's argument must be one of [brx]");
  194. X                break;
  195. X            }
  196. X            break;
  197. X        case 'c':    /* sort by xfer rate xmitted and/or received */
  198. X            if (*(optarg + 1) != EOS)
  199. X                usage_err(argv0, "-c requires a one-letter argument");
  200. X            switch (*optarg) {
  201. X            case 'b':
  202. X                sortopt |= (R_CPS | X_CPS);
  203. X                break;
  204. X            case 'r':
  205. X                sortopt |= R_CPS;
  206. X                break;
  207. X            case 'x':
  208. X                sortopt |= X_CPS;
  209. X                break;
  210. X            default:
  211. X                usage_err(argv0, "-c's argument must be one of [brx]");
  212. X                break;
  213. X            }
  214. X            break;
  215. X        case 'n':
  216. X            sortnames = 1;
  217. X            break;
  218. X        case 'f':    /* number of files */
  219. X            if (*(optarg + 1) != EOS)
  220. X                usage_err(argv0, "-f requires a one-letter argument");
  221. X            switch (*optarg) {
  222. X            case 'b':
  223. X                sortopt |= (R_NUMB | X_NUMB);
  224. X                break;
  225. X            case 'r':
  226. X                sortopt |= R_NUMB;
  227. X                break;
  228. X            case 'x':
  229. X                sortopt |= X_NUMB;
  230. X                break;
  231. X            default:
  232. X                usage_err(argv0, "-f's argument must be one of [brx]");
  233. X                break;
  234. X            }
  235. X            break;
  236. X        case 't':    /* sort by accumulated time */
  237. X            if (*(optarg + 1) != EOS)
  238. X                usage_err(argv0, "-t requires a one-letter argument");
  239. X            switch (*optarg) {
  240. X            case 'b':
  241. X                sortopt |= (R_TIME | X_TIME);
  242. X                break;
  243. X            case 'r':
  244. X                sortopt |= R_TIME;
  245. X                break;
  246. X            case 'x':
  247. X                sortopt |= X_TIME;
  248. X                break;
  249. X            default:
  250. X                usage_err(argv0, "-t's argument must be one of [brx]");
  251. X                break;
  252. X            }
  253. X            break;
  254. X        case 's':    /* Use stdin instead of normal xferstat file */
  255. X            logfile = stdin;
  256. X            break;
  257. X        case 'x':
  258. X#ifdef DEBUG
  259. X            debug = atoi(optarg);
  260. X            break;
  261. X#else
  262. X            (void) fprintf(stderr, "%s: debugging not compiled in.\n", argv0);
  263. X            break;
  264. X#endif
  265. X        case 'V':
  266. X            (void) fprintf(stderr, "%s: Version %d.%d, Patchlevel %d.\n", argv0, version, subver, patchlevel);
  267. X            break;
  268. X        case 'h':
  269. X            usage_err(argv0, usage);
  270. X            break;
  271. X        default:
  272. X            usage_err(argv0, (char *) NULL);
  273. X            break;
  274. X        }
  275. X    }
  276. X    /*
  277. X     * Use default sorting method if none or names was chosen
  278. X     */
  279. X    if (((sortopt == REVERSE) || !sortopt) && !sortnames)
  280. X        sortopt |= DEFAULT_SORT;
  281. X    if ((printopt == HEADERS) || !printopt)
  282. X        printopt |= DEFAULT_RPT;
  283. X    if (optind == argc || logfile)            /* fake up the default file */
  284. X        argv[--optind] = statfile;
  285. X    for ( ; optind < argc; optind++) {
  286. X        if (STREQ(argv[optind], "-")) {
  287. X#ifdef DEBUG
  288. X            if (debug)
  289. X                (void) fprintf(stderr, "%s: processing STDIN.\n", argv0);
  290. X#endif
  291. X            logfile = stdin;
  292. X        } else {
  293. X            if (! (logfile = fopen(argv[optind], "r"))) {
  294. X                (void) fprintf(stderr, "%s: Can't open %s for reading -- ", argv0, argv[optind]);
  295. X                perror(optarg);
  296. X            }
  297. X#ifdef DEBUG
  298. X            if (debug)
  299. X                (void) fprintf(stderr, "%s: processing %s.\n", argv0, argv[optind]);
  300. X#endif
  301. X        }
  302. X        procfile(logfile, &syslst, &devlst, &trec);
  303. X        (void) fclose(logfile);        /* will possibly close stdin */
  304. X    }
  305. X    trec.syscnt = llst_total(syslst);
  306. X#ifdef HAVE_HDBUUCP
  307. X    trec.devcnt = llst_total(devlst);
  308. X#endif
  309. X    sortrun(syslst, devlst, sortopt, sortopt);    /* sort it */
  310. X    printrun(syslst, devlst, &trec, printopt);    /* print it out */
  311. X    exit(0);
  312. X    /* NOTREACHED */
  313. X}
  314. X
  315. Xvoid
  316. Xprocfile(logfile, syslstp, devlstp, trec)
  317. X    FILE    *logfile;
  318. X    llst_t    **syslstp;
  319. X    llst_t    **devlstp;
  320. X    SUMM    *trec;
  321. X{
  322. X    LINK    *sysp;
  323. X    PORT    *devp;
  324. X    PORT    *portp;
  325. X    char    *sys,        /* points at the previous remote node name */
  326. X        *user,        /* points at the "user-id" */
  327. X        flow[10],    /* holds the direction of uucp flow */
  328. X        buf[BUFSIZ],    /* general purpose */
  329. X        *string;    /* general purpose */
  330. X    long    bytes;        /* number of bytes in the uucp xfer */
  331. X    float    seconds;    /* number of seconds the xfer took */
  332. X    int    mon, day, hh, mm;
  333. X#ifdef HAVE_HDBUUCP
  334. X    char    *dev;        /* points at the device name used */
  335. X    char    mode, pchar;
  336. X    int    ss, pid, seq;
  337. X#else
  338. X    long    epoch;
  339. X#endif
  340. X#ifdef DEBUG
  341. X    int    i = 0;
  342. X#endif
  343. X
  344. X    /*
  345. X     * process each line in the logfile
  346. X     */
  347. X#ifdef HAVE_HDBUUCP
  348. X    /*    From an AT&T 3b2/400 SysVr3.2 /usr/spool/uucp/.Admin/xferstats:
  349. X     * fastlane!woods M (2/16-19:43:37) (C,5711,2) [tty33] -> 152 / 1.420 secs, 107 bytes/sec
  350. X     * fastlane!rhl M (2/16-19:43:50) (C,5711,3) [tty33] <- 471 / 6.090 secs, 77 bytes/sec
  351. X     *
  352. X     *    From an AIX 3.2 /var/uucp/.Admin/xfererstats:
  353. X     * ecirs6k!uucp M (2/17-19:44:54) (C,8560,0) [notty] <- 365531 / 7.633 secs, 47888 bytes/sec 
  354. X     * ecirs6k!uucp M (2/17-22:10:19) (C,321,0) [notty] <- 32178 / 0.366 secs, 87918 bytes/sec 
  355. X     */
  356. X#else
  357. X    /*    From an ULTRIX 4.2 /var/spool/uucp/SYSLOG:
  358. X     * daemon becker (8/26-0:14) (714802480) sent 348 b 0 secs, Pk: 7, Rxmt: 0
  359. X     * daemon becker (8/26-0:14) (714802487) sent 89 b 0 secs, Pk: 3, Rxmt: 0
  360. X     * news censor (8/25-6:00) (714736824) received 43842 b 47 secs
  361. X     * news censor (8/25-6:00) (714736827) received 108 b 1 secs
  362. X     */
  363. X#endif
  364. X    while (fgets(buf, BUFSIZ, logfile)) {
  365. X#ifdef DEBUG
  366. X        if (debug > 8)
  367. X            (void) fprintf(stderr, "%d: %s", i, buf);
  368. X#endif
  369. X        user = buf;
  370. X        /*
  371. X         * look for the node name
  372. X         */
  373. X#ifdef HAVE_HDBUUCP
  374. X        if (!(sys = strtok(buf, "!")))
  375. X#else
  376. X        if (!(sys = strtok(buf, " ")) ||
  377. X            !(sys = strtok((char *) NULL, " ")))
  378. X#endif
  379. X            continue;
  380. X#ifdef DEBUG
  381. X        if (debug >  7)
  382. X            (void) fprintf(stderr, "System: %s, ", sys);
  383. X#endif
  384. X        /*
  385. X         * look for the junk information
  386. X         */
  387. X#ifdef HAVE_HDBUUCP
  388. X        if (!(string = strtok((char *) NULL, "[")))
  389. X            continue;
  390. X        if (sscanf(string, "%*s %c (%d/%d-%d:%d:%d) (%c,%d,%d)",
  391. X               &mode, &mon, &day, &hh, &mm, &ss, &pchar, &pid, &seq) == EOF)
  392. X            continue;
  393. X# ifdef DEBUG
  394. X        if (debug > 6)
  395. X            (void) fprintf(stderr, "mode: %c, time&pid: (%d/%d-%d:%d:%d) (%c,%d,%d)\n",
  396. X                       mode, mon, day, hh, mm, ss, pchar, pid, seq);
  397. X# endif
  398. X#else
  399. X        if (!(string = strtok((char *) NULL, " ")))
  400. X            continue;
  401. X# ifdef DEBUG
  402. X        if (debug > 8)
  403. X            (void) fprintf(stderr, "date&time ");
  404. X# endif
  405. X        if (sscanf(string, "(%d/%d-%d:%d)", &mon, &day, &hh, &mm) == EOF)
  406. X            continue;
  407. X# ifdef DEBUG
  408. X        if (debug > 6)
  409. X            (void) fprintf(stderr, "(%d/%d-%d:%d)", mon, day, hh, mm);
  410. X# endif
  411. X        if (!(string = strtok((char *) NULL, " ")))
  412. X            continue;
  413. X# ifdef DEBUG
  414. X        if (debug > 8)
  415. X            (void) fprintf(stderr, " epoch");
  416. X# endif
  417. X        if (sscanf(string, "(%ld)", &epoch) == EOF)
  418. X            continue;
  419. X# ifdef DEBUG
  420. X        if (debug > 6)
  421. X            (void) fprintf(stderr, " (%ld)\n", mon, day, hh, mm, epoch);
  422. X# endif
  423. X#endif
  424. X                tsfill(trec, mon, day, hh, mm);    /* should be inlined for efficiency */
  425. X#ifdef HAVE_HDBUUCP
  426. X        /*
  427. X         * look for the device name
  428. X         */
  429. X        if (!(dev = strtok((char *) NULL, "]")))
  430. X            continue;
  431. X#endif
  432. X        /*
  433. X         * parse the remainder of the data string
  434. X         */
  435. X        if (!(string = strtok((char *) NULL, "\n")))
  436. X            continue;
  437. X#ifdef HAVE_HDBUUCP
  438. X        if (sscanf(string, "%s %ld / %f", flow, &bytes, &seconds) == EOF)
  439. X#else
  440. X# if defined(ultrix) || defined(__ultrix__)    /* ???? */
  441. X        if (sscanf(string, "%s %ld b %f secs", flow, &bytes, &seconds) == EOF)
  442. X# else
  443. X        if (sscanf(string, "%s data %ld bytes %f secs", flow, &bytes, &second) == EOF)
  444. X# endif
  445. X#endif
  446. X            continue;
  447. X        if (!(sysp = getsys(syslstp, sys)))
  448. X            exit(1);
  449. X#ifdef HAVE_HDBUUCP
  450. X        if (!(devp = getdev(devlstp, dev)))
  451. X            exit(1);
  452. X        if (sysp->l_lastpid != pid) {
  453. X            sysp->l_lastpid = pid;
  454. X            if (mode == 'M')
  455. X                sysp->l_out_conn++;
  456. X            else
  457. X                sysp->l_in_conn++;
  458. X        }
  459. X        if (devp->p_lastpid != pid) {
  460. X            devp->p_lastpid = pid;
  461. X            if (mode == 'M') 
  462. X                devp->p_out_conn++;
  463. X            else
  464. X                devp->p_in_conn++;
  465. X        }
  466. X#endif
  467. X        /* outgoing uucp */
  468. X        if (STREQ(flow, OUT)
  469. X#ifdef pyr
  470. X             || STREQ(flow, T_OUT) || STREQ(flow, F_OUT)
  471. X#endif
  472. X           ) {
  473. X#ifdef DEBUG
  474. X            if (debug > 5)
  475. X# ifdef HAVE_HDBUUCP
  476. X                (void) fprintf(stderr, "%s OUTGOING %s\n", sys, dev);
  477. X# else
  478. X                (void) fprintf(stderr, "%s OUTGOING\n", sys);
  479. X# endif
  480. X#endif
  481. X            sysp->l_xmit += bytes;
  482. X            sysp->l_xmit_time += seconds;
  483. X            sysp->l_xmit_cnt++;
  484. X#ifdef HAVE_HDBUUCP
  485. X            devp->p_xmit += bytes;
  486. X            devp->p_xmit_time += seconds;
  487. X            devp->p_xmit_cnt++;
  488. X            if (!(portp = getdev(&(sysp->l_portlst), dev)))
  489. X                exit(1);
  490. X            portp->p_xmit += bytes;
  491. X            portp->p_xmit_time += seconds;
  492. X            portp->p_xmit_cnt++;
  493. X            if (portp->p_lastpid != pid) {
  494. X                portp->p_lastpid = pid;
  495. X                if (mode == 'M') {
  496. X                    portp->p_out_conn++;
  497. X                    trec->num_out_conn++;    /* only once! */
  498. X                } else {
  499. X                    portp->p_in_conn++;
  500. X                    trec->num_in_conn++;
  501. X                }
  502. X            }
  503. X#endif
  504. X            trec->bytes_xmit += bytes;    /* summary totals */
  505. X            trec->sec_xmit += seconds;
  506. X            trec->num_xmit++;
  507. X        } else if (STREQ(flow, IN)        /* incoming uucp */
  508. X
  509. X#ifdef pyr
  510. X               || STREQ(flow, T_IN) || STREQ(flow, F_IN)
  511. X#endif
  512. X              ) {
  513. X#ifdef DEBUG
  514. X            if (debug > 5)
  515. X# ifdef HAVE_HDBUUC
  516. X                (void) fprintf(stderr, "%s INCOMING %s\n", sys, dev);
  517. X# else
  518. X                (void) fprintf(stderr, "%s INCOMING\n", sys);
  519. X# endif
  520. X#endif
  521. X            sysp->l_recv += bytes;
  522. X            sysp->l_recv_time += seconds;
  523. X            sysp->l_recv_cnt++;
  524. X#ifdef HAVE_HDBUUCP
  525. X            devp->p_recv += bytes;
  526. X            devp->p_recv_time += seconds;
  527. X            devp->p_recv_cnt++;
  528. X            if (!(portp = getdev(&(sysp->l_portlst), dev)))
  529. X                exit(1);
  530. X            portp->p_recv += bytes;
  531. X            portp->p_recv_time += seconds;
  532. X            portp->p_recv_cnt++;
  533. X            if (portp->p_lastpid != pid) {
  534. X                portp->p_lastpid = pid;
  535. X                if (mode == 'M') {
  536. X                    portp->p_out_conn++;
  537. X                    trec->num_out_conn++;
  538. X                } else {
  539. X                    portp->p_in_conn++;
  540. X                    trec->num_in_conn++;
  541. X                }
  542. X            }
  543. X#endif
  544. X            trec->bytes_recv += bytes;    /* summary totals */
  545. X            trec->sec_recv += seconds;
  546. X            trec->num_recv++;
  547. X        }
  548. X#ifdef DEBUG
  549. X        i++;
  550. X#endif
  551. X    }
  552. X    return;
  553. X}
  554. X
  555. X#ifdef HAVE_HDBUUCP
  556. XPORT *
  557. Xgetdev(devlstp, d)    /* returns an link struct to the system name specified. */
  558. X    llst_t    **devlstp;
  559. X    char    *d;
  560. X{
  561. X    llst_t    *work;
  562. X    PORT    *nd;
  563. X    PORT    sd;
  564. X
  565. X    extern unsigned short    sort_dev_f;
  566. X
  567. X    sort_dev_f = 0;        /* set default comparison of name only */
  568. X    work = *devlstp;
  569. X    if (! work) {        /* must be the first time thru */
  570. X#ifdef DEBUG
  571. X        if (debug > 2)
  572. X            (void) fprintf(stderr, "initialising devlst (%s)\n", d);
  573. X#endif
  574. X        if (!(work = llst_new())) {
  575. X            perror("getdev(): llst_new() failed");
  576. X            return(NULL);
  577. X        }
  578. X        if (!(nd = (PORT *) malloc(sizeof(PORT)))) {
  579. X            perror("getdev(): malloc(nd) failed");
  580. X            llst_destroy(work);
  581. X            return(NULL);
  582. X        }
  583. X        if (!llst_add(work, (char *) nd)) {
  584. X            perror("getdev(): llst_add(nd) failed");
  585. X            llst_destroy(work);
  586. X            free(nd);
  587. X            return(NULL);
  588. X        }
  589. X        *devlstp = work;
  590. X        zerodev(nd);
  591. X        (void) strncpy(nd->p_dname, d, sizeof(nd->p_dname) - 1);
  592. X        return(nd);
  593. X    }
  594. X    zerodev(&sd);
  595. X    (void) strncpy(sd.p_dname, d, sizeof(sd.p_dname) - 1);
  596. X    if (!llst_find(work, (char *) &sd, cmpdev)) {
  597. X        /*
  598. X         * create a new link
  599. X         */
  600. X#ifdef DEBUG
  601. X        if (debug > 1)
  602. X            (void) fprintf(stderr, "adding new device - %s\n", d);
  603. X#endif
  604. X        if (!(nd = (PORT *) malloc(sizeof(PORT)))) {
  605. X            perror("getdev(): malloc(nd2) failed");
  606. X            return(NULL);
  607. X        }
  608. X        if (!llst_add(work, (char *) nd)) {
  609. X            perror("getdev(): llst_add(nd2) failed");
  610. X            free(nd);
  611. X            return(NULL);
  612. X        }
  613. X        zerodev(nd);
  614. X        (void) strncpy(nd->p_dname, d, sizeof(nd->p_dname) - 1);
  615. X    }
  616. X    return((PORT *) llst_current(work));
  617. X}
  618. X#endif
  619. X
  620. XLINK *
  621. Xgetsys(syslstp, s)    /* returns an link struct to the system name specified. */
  622. X    llst_t    **syslstp;
  623. X    char    *s;
  624. X{
  625. X    llst_t    *work;
  626. X    LINK    *nd;
  627. X    char    buf[BUFSIZ];
  628. X    LINK    *sd = (LINK *) buf;
  629. X
  630. X    extern unsigned short    sort_sys_f;
  631. X
  632. X    sort_sys_f = 0;        /* set default comparison of name only */
  633. X    work = *syslstp;
  634. X    if (! work) {        /* must be the first time thru */
  635. X#ifdef DEBUG
  636. X        if (debug > 2)
  637. X            (void) fprintf(stderr, "initialising syslst (%s)\n", s);
  638. X#endif
  639. X        if (!(work = llst_new())) {
  640. X            perror("getsys(): llst_new() failed");
  641. X            return(NULL);
  642. X        }
  643. X        if (!(nd = (LINK *) malloc(sizeof(LINK) + strlen(s)))) {
  644. X            perror("getsys(): malloc() failed");
  645. X            llst_destroy(work);
  646. X            return(NULL);
  647. X        }
  648. X        if (!llst_add(work, (char *) nd)) {
  649. X            perror("getsys(): llst_add(nd) failed");
  650. X            llst_destroy(work);
  651. X            free(nd);
  652. X            return(NULL);
  653. X        }
  654. X        *syslstp = work;
  655. X        zerosys(nd);
  656. X        (void) strcpy(nd->l_sysname, s);
  657. X        return(nd);
  658. X    }
  659. X    zerosys(sd);
  660. X    (void) strcpy(sd->l_sysname, s);
  661. X    if (!llst_find(work, (char *) sd, cmpsys)) {
  662. X        /*
  663. X         * create a new link
  664. X         */
  665. X#ifdef DEBUG
  666. X        if (debug > 1)
  667. X            (void) fprintf(stderr, "adding new system - %s\n", s);
  668. X#endif
  669. X        if (!(nd = (LINK *) malloc(sizeof(LINK) + strlen(s)))) {
  670. X#ifdef DEBUG
  671. X            (void) fprintf(stderr, "malloc(%d + %d)\n", sizeof(LINK), strlen(s));
  672. X#endif
  673. X            perror("getsys(): malloc(nd2) failed");
  674. X            return((LINK *) NULL);
  675. X        }
  676. X        if (!llst_add(work, (char *) nd)) {
  677. X            perror("getsys(): llst_add(nd2) failed");
  678. X            free(nd);
  679. X            return(NULL);
  680. X        }
  681. X        zerosys(nd);
  682. X        (void) strcpy(nd->l_sysname, s);
  683. X    }
  684. X    return((LINK *) llst_current(work));
  685. X}
  686. X
  687. Xvoid
  688. Xzerosys(l)
  689. X    LINK    *l;
  690. X{
  691. X    /*
  692. X     * added for portability vs. memset/bzero
  693. X     */
  694. X    l->l_recv    = 0.0;
  695. X    l->l_recv_time    = 0.0;
  696. X    l->l_recv_cnt    = 0L;
  697. X    l->l_xmit    = 0.0;
  698. X    l->l_xmit_time    = 0.0;
  699. X    l->l_xmit_cnt    = 0L;
  700. X    l->l_in_conn    = 0;
  701. X    l->l_out_conn    = 0;
  702. X    l->l_lastpid    = 0;
  703. X    l->l_portlst    = NULL;
  704. X    l->l_sysname[0]    = '\0';
  705. X}
  706. X
  707. Xvoid
  708. Xzerodev(p)
  709. X    PORT    *p;
  710. X{
  711. X    /*
  712. X     * added for portability vs. memset/bzero
  713. X     */
  714. X    p->p_recv    = 0.0;
  715. X    p->p_recv_time    = 0.0;
  716. X    p->p_recv_cnt    = 0L;
  717. X    p->p_xmit    = 0.0;
  718. X    p->p_xmit_time    = 0.0;
  719. X    p->p_xmit_cnt    = 0L;
  720. X    p->p_in_conn    = 0;
  721. X    p->p_out_conn    = 0;
  722. X    p->p_lastpid    = 0;
  723. X    p->p_syslst    = NULL;
  724. X    p->p_dname[0]    = '\0';
  725. X}
  726. X
  727. Xvoid 
  728. Xtsfill(trec, mon, day, hh, mm) 
  729. X    SUMM    *trec;
  730. X    int    mon;
  731. X        int    day;
  732. X        int    hh;
  733. X        int    mm;
  734. X{
  735. X    static int    AlreadySetFirst = FALSE;
  736. X
  737. X    if (!AlreadySetFirst) {
  738. X#ifdef DEBUG
  739. X        if (debug > 2)
  740. X            (void) fprintf(stderr, "initialising trec->first_rec (%d/%d-%02d:%02d)\n", mon, day, hh, mm);
  741. X#endif
  742. X        trec->first_rec.tm_mon = mon;
  743. X        trec->first_rec.tm_mday = day;
  744. X        trec->first_rec.tm_hour = hh;
  745. X        trec->first_rec.tm_min = mm;
  746. X        AlreadySetFirst = TRUE;
  747. X    } else {
  748. X#ifdef DEBUG
  749. X        if (debug > 2)
  750. X            (void) fprintf(stderr, "initialising trec->last_rec (%d/%d-%02d:%02d)\n", mon, day, hh, mm);
  751. X#endif
  752. X        trec->last_rec.tm_mon = mon;
  753. X        trec->last_rec.tm_mday = day;
  754. X        trec->last_rec.tm_hour = hh;
  755. X        trec->last_rec.tm_min = mm;
  756. X    }
  757. X    return;
  758. X}
  759. X
  760. Xvoid
  761. Xsortrun(syslst, devlst, howsys, howdev)
  762. X    llst_t        *syslst;
  763. X    llst_t        *devlst;
  764. X    unsigned short    howsys;
  765. X    unsigned short    howdev;
  766. X{
  767. X    extern cmp_t        cmpdev();
  768. X    extern cmp_t        cmpsys();
  769. X    extern unsigned short    sort_sys_f;
  770. X    extern unsigned short    sort_dev_f;
  771. X
  772. X#ifdef DEBUG
  773. X    if (debug)
  774. X        (void) fprintf(stderr, "%s: sorting system and device lists.\n", argv0);
  775. X#endif
  776. X    sort_sys_f = howsys;        /* set global used by cmpsys() */
  777. X    llst_sort(syslst, cmpsys);
  778. X    llst_top(devlst);
  779. X    do {
  780. X        PORT    *devp;
  781. X
  782. X        if (! (devp = (PORT *) llst_current(devlst)))
  783. X            continue;
  784. X        llst_sort(devp->p_syslst, cmpsys);
  785. X    } while (llst_next(devlst));
  786. X    sort_dev_f = howdev;        /* set global used by cmpdev() */
  787. X    llst_sort(devlst, cmpdev);
  788. X    llst_top(syslst);
  789. X    do {
  790. X        LINK    *sysp;
  791. X
  792. X        if (! (sysp = (LINK *) llst_current(syslst)))
  793. X            continue;
  794. X        llst_sort(sysp->l_portlst, cmpdev);
  795. X    } while (llst_next(syslst));
  796. X    return;
  797. X}
  798. X
  799. Xvoid
  800. Xprintrun(syslst, devlst, trec, printopt)
  801. X    llst_t        *syslst;
  802. X    llst_t        *devlst;
  803. X    SUMM        *trec;
  804. X    unsigned short    printopt;
  805. X{
  806. X#ifdef DEBUG
  807. X    if (debug)
  808. X        (void) fprintf(stderr, "%s: printing report.\n", argv0);
  809. X#endif
  810. X    if (printopt & SYS_RPT)
  811. X        printsys(syslst, trec, printopt);
  812. X#ifdef HAVE_HDBUUCP
  813. X    if (printopt & PORT_RPT)
  814. X        printdev(devlst, trec, printopt);
  815. X#endif
  816. X    if (printopt & SUMM_RPT)
  817. X        printsum(trec, printopt);
  818. X    return;
  819. X}
  820. X
  821. X/* ARGSUSED */
  822. Xvoid
  823. Xprintsys(syslst, trec, printopt)
  824. X    llst_t        *syslst;
  825. X    SUMM        *trec;
  826. X    unsigned short    printopt;
  827. X{
  828. X    LINK    *sysp;
  829. X
  830. X    if (printopt & HEADERS) {
  831. X        printtmrng(trec, printopt);
  832. X        (void) printf("%-8s ", "Remote");
  833. X        (void) printf("%9s ", "K-Bytes");
  834. X        (void) printf("%9s ", "K-Bytes");
  835. X        (void) printf("%9s ", "K-Bytes");
  836. X        (void) printf("%5s ", "Hours");
  837. X        (void) printf("%5s ", "Hours");
  838. X        (void) printf("%6s ", "AvCPS");
  839. X        (void) printf("%6s ", "AvCPS");
  840. X        (void) printf("%4s ", "#");
  841. X        (void) printf("%4s ", "#");
  842. X#ifdef HAVE_HDBUUCP
  843. X        (void) printf("%3s\n", "#");
  844. X#else
  845. X        (void) putchar('\n');
  846. X#endif
  847. X
  848. X        (void) printf("%-8s ", "SiteName");
  849. X        (void) printf("%9s ", "Recv");
  850. X        (void) printf("%9s ", "Xmit");
  851. X        (void) printf("%9s ", "Total");
  852. X        (void) printf("%5s ", "Recv");
  853. X        (void) printf("%5s ", "Xmit");
  854. X        (void) printf("%6s ", "Recv");
  855. X        (void) printf("%6s ", "Xmit");
  856. X        (void) printf("%4s ", "Recv");
  857. X        (void) printf("%4s ", "Xmit");
  858. X#ifdef HAVE_HDBUUCP
  859. X        (void) printf("%3s\n", "Con");
  860. X#else
  861. X        (void) putchar('\n');
  862. X#endif
  863. X
  864. X        (void) printf("%s ", "--------");
  865. X        (void) printf("%s ", "---------");
  866. X        (void) printf("%s ", "---------");
  867. X        (void) printf("%s ", "---------");
  868. X        (void) printf("%s ", "-----");
  869. X        (void) printf("%s ", "-----");
  870. X        (void) printf("%s ", "------");
  871. X        (void) printf("%s ", "------");
  872. X        (void) printf("%s ", "----");
  873. X        (void) printf("%s ", "----");
  874. X#ifdef HAVE_HDBUUCP
  875. X        (void) printf("%s\n", "---");
  876. X#else
  877. X        (void) putchar('\n');
  878. X#endif
  879. X    }
  880. X
  881. X    llst_top(syslst);
  882. X    do {
  883. X        if (! (sysp = (LINK *) llst_current(syslst)))
  884. X            continue;
  885. X        (void) printf("%-9.9s", sysp->l_sysname);
  886. X        (void) printf("%9.3f ", (double) sysp->l_recv / 1024.0);
  887. X        (void) printf("%9.3f ", (double) sysp->l_xmit / 1024.0);
  888. X        (void) printf("%9.3f ", (double) (sysp->l_xmit + sysp->l_recv) / 1024.0);
  889. X        (void) printf("%5.2f ", (double) sysp->l_recv_time / 3600.0);
  890. X        (void) printf("%5.2f ", (double) sysp->l_xmit_time / 3600.0);
  891. X        if (sysp->l_recv_time != 0.0)    /* divide by zero ? */
  892. X            (void) printf("%6.0f ", (double) sysp->l_recv / sysp->l_recv_time);
  893. X        else
  894. X            (void) printf("%6.0f ", (double) 0);
  895. X        if (sysp->l_xmit_time != 0.0)    /* divide by zero ? */
  896. X            (void) printf("%6.0f ", (double) sysp->l_xmit / sysp->l_xmit_time);
  897. X        else
  898. X            (void) printf("%6.0f ", (double) 0);
  899. X        (void) printf("%4ld ", sysp->l_recv_cnt);
  900. X        (void) printf("%4ld ", sysp->l_xmit_cnt);
  901. X#ifdef HAVE_HDBUUCP
  902. X        (void) printf("%3d\n", sysp->l_in_conn + sysp->l_out_conn);
  903. X        if (printopt & SYSBYPORT_OPT) {
  904. X            llst_top(sysp->l_portlst);
  905. X            do {
  906. X                PORT    *devp;
  907. X
  908. X                if (! (devp = (PORT *) llst_current(sysp->l_portlst)))
  909. X                    continue;
  910. X                (void) printf("%8.8s ", devp->p_dname);
  911. X                (void) printf("%9.3f ", (double) devp->p_recv / 1024.0);
  912. X                (void) printf("%9.3f ", (double) devp->p_xmit / 1024.0);
  913. X                (void) printf("%9.3f ", (double) (devp->p_xmit + devp->p_recv) / 1024);
  914. X                (void) printf("%5.2f ", (double) devp->p_recv_time / 3600.0);
  915. X                (void) printf("%5.2f ", (double) devp->p_xmit_time / 3600.0);
  916. X                if (devp->p_recv_time != 0.0)    /* divide by zero ? */
  917. X                    (void) printf("%6.0f ", (double) devp->p_recv / devp->p_recv_time);
  918. X                else
  919. X                    (void) printf("%6.0f ", (double) 0);
  920. X                if (devp->p_xmit_time != 0.0)    /* divide by zero ? */
  921. X                    (void) printf("%6.0f ", (double) devp->p_xmit / devp->p_xmit_time);
  922. X                else
  923. X                    (void) printf("%6.0f ", (double) 0);
  924. X                (void) printf("%4ld ", devp->p_recv_cnt);
  925. X                (void) printf("%4ld ", devp->p_xmit_cnt);
  926. X                (void) printf("%3d\n", devp->p_in_conn + devp->p_out_conn);
  927. X            } while (llst_next(sysp->l_portlst));
  928. X            putchar('\n');
  929. X        }
  930. X#else
  931. X        putchar('\n');
  932. X#endif
  933. X    } while (llst_next(syslst));
  934. X    return;
  935. X}
  936. X
  937. X#ifdef HAVE_HDBUUCP
  938. X/* ARGSUSED */
  939. Xvoid
  940. Xprintdev(devlst, trec, printopt)
  941. X    llst_t        *devlst;
  942. X    SUMM        *trec;
  943. X    unsigned short    printopt;
  944. X{
  945. X    PORT    *devp;
  946. X
  947. X    if (printopt & HEADERS) {
  948. X        printtmrng(trec, printopt);
  949. X        (void) printf("%-8s ", "Port");
  950. X        (void) printf("%9s ", "K-Bytes");
  951. X        (void) printf("%9s ", "K-Bytes");
  952. X        (void) printf("%9s ", "K-Bytes");
  953. X        (void) printf("%5s ", "Hours");
  954. X        (void) printf("%5s ", "Hours");
  955. X        (void) printf("%6s ", "AvCPS");
  956. X        (void) printf("%6s ", "AvCPS");
  957. X        (void) printf("%4s ", "#");
  958. X        (void) printf("%4s ", "#");
  959. X        (void) printf("%3s\n", "#");
  960. X
  961. X        (void) printf("%-8s ", "Name");
  962. X        (void) printf("%9s ", "Recv");
  963. X        (void) printf("%9s ", "Xmit");
  964. X        (void) printf("%9s ", "Total");
  965. X        (void) printf("%5s ", "Recv");
  966. X        (void) printf("%5s ", "Xmit");
  967. X        (void) printf("%6s ", "Recv");
  968. X        (void) printf("%6s ", "Xmit");
  969. X        (void) printf("%4s ", "Recv");
  970. X        (void) printf("%4s ", "Xmit");
  971. X        (void) printf("%3s\n", "Con");
  972. X
  973. X        (void) printf("%s ", "--------");
  974. X        (void) printf("%s ", "---------");
  975. X        (void) printf("%s ", "---------");
  976. X        (void) printf("%s ", "---------");
  977. X        (void) printf("%s ", "-----");
  978. X        (void) printf("%s ", "-----");
  979. X        (void) printf("%s ", "------");
  980. X        (void) printf("%s ", "------");
  981. X        (void) printf("%s ", "----");
  982. X        (void) printf("%s ", "----");
  983. X        (void) printf("%s\n", "---");
  984. X    }
  985. X
  986. X    llst_top(devlst);
  987. X    do {
  988. X        if (! (devp = (PORT *) llst_current(devlst)))
  989. X            continue;
  990. X        (void) printf("%-9.9s", devp->p_dname);
  991. X        (void) printf("%9.3f ", (double) devp->p_recv / 1024.0);
  992. X        (void) printf("%9.3f ", (double) devp->p_xmit / 1024.0);
  993. X        (void) printf("%9.3f ", (double) (devp->p_xmit + devp->p_recv) / 1024.0);
  994. X        (void) printf("%5.2f ", (double) devp->p_recv_time / 3600.0);
  995. X        (void) printf("%5.2f ", (double) devp->p_xmit_time / 3600.0);
  996. X        if (devp->p_recv_time != 0.0)    /* divide by zero ? */
  997. X            (void) printf("%6.0f ", (double) devp->p_recv / devp->p_recv_time);
  998. X        else
  999. X            (void) printf("%6.0f ", (double) 0);
  1000. X        if (devp->p_xmit_time != 0.0)    /* divide by zero ? */
  1001. X            (void) printf("%6.0f ", (double) devp->p_xmit / devp->p_xmit_time);
  1002. X        else
  1003. X            (void) printf("%6.0f ", (double) 0);
  1004. X        (void) printf("%4ld ", devp->p_recv_cnt);
  1005. X        (void) printf("%4ld ", devp->p_xmit_cnt);
  1006. X        (void) printf("%3d\n", devp->p_in_conn + devp->p_out_conn);
  1007. X    } while (llst_next(devlst));
  1008. X    return;
  1009. X}
  1010. X#endif
  1011. X
  1012. X/* ARGSUSED */
  1013. Xvoid
  1014. Xprintsum(trec, printopt)
  1015. X    SUMM        *trec;
  1016. X    unsigned short    printopt;
  1017. X{
  1018. X    long    total_secs;
  1019. X    char    buf[BUFSIZ];
  1020. X
  1021. X    if (printopt & HEADERS)
  1022. X        printtmrng(trec);
  1023. X    (void) printf("Active UUCP sites:\t");
  1024. X    (void) sprintf(buf, "%d", trec->syscnt);
  1025. X    comma_fy(buf);
  1026. X    (void) printf("%10s", buf);
  1027. X    (void) printf("\tTotal time recv:\t%4d:%02d:%02d\n",
  1028. X              (int) (trec->sec_recv / 3600.0),
  1029. X              (int) (((int) trec->sec_recv % 3600) / 60),
  1030. X              (int) ((int) trec->sec_recv % 60));
  1031. X#ifdef HAVE_HDBUUCP
  1032. X    (void) printf("Active UUCP ports:\t");
  1033. X    (void) sprintf(buf, "%d", trec->devcnt);
  1034. X    comma_fy(buf);
  1035. X    (void) printf("%10s", buf);
  1036. X#else
  1037. X    (void) printf("\t\t\t\t");
  1038. X#endif
  1039. X    (void) printf("\tTotal time xmit:\t%4d:%02d:%02d\n",
  1040. X              (int) (trec->sec_xmit / 3600.0),
  1041. X              (int) (((int) trec->sec_xmit % 3600) / 60),
  1042. X              (int) ((int) trec->sec_xmit % 60));
  1043. X#ifdef HAVE_HDBUUCP
  1044. X    (void) printf("Connections with work:\t");
  1045. X    (void) sprintf(buf, "%ld", trec->num_in_conn + trec->num_out_conn);
  1046. X    comma_fy(buf);
  1047. X    (void) printf("%10s", buf);
  1048. X#else
  1049. X    (void) printf("\t\t\t\t");
  1050. X#endif
  1051. X    total_secs = trec->sec_recv + trec->sec_xmit;
  1052. X    (void) printf("\tTotal UUCP time:\t%4d:%02d:%02d\n",
  1053. X              (int) (total_secs / 3600.0),
  1054. X              (int) (((long) total_secs % 3600) / 60),
  1055. X              (int) ((long) total_secs % 60));
  1056. X    (void) printf("\nTotal files rec'd:\t");
  1057. X    (void) sprintf(buf, "%ld", trec->num_recv);
  1058. X    comma_fy(buf);
  1059. X    (void) printf("%10s", buf);
  1060. X    (void) printf("\tTotal bytes rec'd:\t");
  1061. X    (void) sprintf(buf, "%ld", trec->bytes_recv);
  1062. X    comma_fy(buf);
  1063. X    (void) printf("%10s\n", buf);
  1064. X    (void) printf("Total files xmit:\t");
  1065. X    (void) sprintf(buf, "%ld", trec->num_xmit);
  1066. X    comma_fy(buf);
  1067. X    (void) printf("%10s", buf);
  1068. X    (void) printf("\tTotal bytes xmit:\t");
  1069. X    (void) sprintf(buf, "%ld", trec->bytes_xmit);
  1070. X    comma_fy(buf);
  1071. X    (void) printf("%10s\n", buf);
  1072. X    (void) printf("Total files:\t\t");
  1073. X    (void) sprintf(buf, "%ld", trec->num_xmit + trec->num_recv);
  1074. X    comma_fy(buf);
  1075. X    (void) printf("%10s", buf);
  1076. X    (void) printf("\tTotal bytes:\t\t");
  1077. X    (void) sprintf(buf, "%ld", trec->bytes_xmit + trec->bytes_recv);
  1078. X    comma_fy(buf);
  1079. X    (void) printf("%10s\n", buf);
  1080. X    return;
  1081. X}
  1082. X
  1083. X/*
  1084. X * print report header & report time range
  1085. X */
  1086. Xvoid 
  1087. Xprinttmrng(trec, printopt)
  1088. X    SUMM    *trec;
  1089. X    int    printopt;
  1090. X{
  1091. X    static char    *months[] = {
  1092. X        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  1093. X        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
  1094. X    };
  1095. X    static int    IsAlreadyPrinted = FALSE;
  1096. X
  1097. X    if (IsAlreadyPrinted) {
  1098. X        putchar('\n');
  1099. X        return;
  1100. X    }
  1101. X    (void) printf("%*sUUCP Traffic Report\n", 31, " ");
  1102. X    if (trec->first_rec.tm_mon && trec->last_rec.tm_mon) {
  1103. X        (void) printf("%*sFrom: %s %2d %02d:%02d   To: %s %2d %02d:%02d\n\n",
  1104. X                  22, " ",
  1105. X                  months[trec->first_rec.tm_mon-1],
  1106. X                  trec->first_rec.tm_mday,
  1107. X                  trec->first_rec.tm_hour,
  1108. X                  trec->first_rec.tm_min,
  1109. X                  months[trec->last_rec.tm_mon-1],
  1110. X                  trec->last_rec.tm_mday,
  1111. X                  trec->last_rec.tm_hour,
  1112. X                  trec->last_rec.tm_min);
  1113. X    }
  1114. X    IsAlreadyPrinted = TRUE;
  1115. X    return;
  1116. X}
  1117. X
  1118. X/*
  1119. X * put commas in long numeric strings contained in buf[]
  1120. X */
  1121. Xvoid
  1122. Xcomma_fy(buf)
  1123. X    char    buf[];
  1124. X{
  1125. X    int    i, ii, cnt;
  1126. X    char    backw[BUFSIZ];
  1127. X
  1128. X    /*
  1129. X     * put string backwards inserting commas
  1130. X     */
  1131. X    for (ii = 0, cnt = 0, i = strlen(buf) - 1; i >= 0 ; i--) {
  1132. X        backw[ii++] = buf[i];
  1133. X        if (buf[i] == '.')
  1134. X            cnt = 0;
  1135. X        else if (++cnt == 3) {
  1136. X            if (i && buf[i - 1] != '\0' && isdigit(buf[i - 1]))
  1137. X                backw[ii++] = ',';
  1138. X            cnt = 0;
  1139. X        }
  1140. X    }
  1141. X    backw[ii] = '\0';
  1142. X    /*
  1143. X     * put string forward
  1144. X     */
  1145. X    for (ii = 0, cnt = 0, i = strlen(backw) - 1; i >= 0 ; i--)
  1146. X        buf[ii++] = backw[i];
  1147. X    buf[ii]='\0';
  1148. X}
  1149. X
  1150. Xcmp_t
  1151. Xcmpdev(a, b)
  1152. X    PORT    *a,
  1153. X        *b;        /* we rely on alignment of char * */
  1154. X{
  1155. X    float            aw = 0, bw = 0;
  1156. X    extern unsigned short    sort_dev_f;
  1157. X
  1158. X    if (sort_dev_f & RECEIVED) {
  1159. X        aw += a->p_recv;
  1160. X        bw += b->p_recv;
  1161. X    }
  1162. X    if (sort_dev_f & XMIT) {
  1163. X        aw += a->p_xmit;
  1164. X        bw += b->p_xmit;
  1165. X    }
  1166. X    if (sort_dev_f & R_TIME) {
  1167. X        aw += a->p_recv_time;
  1168. X        bw += b->p_recv_time;
  1169. X    }
  1170. X    if (sort_dev_f & X_TIME) {
  1171. X        aw += a->p_xmit_time;
  1172. X        bw += b->p_xmit_time;
  1173. X    }
  1174. X    if (sort_dev_f & R_CPS) {
  1175. X        if (a->p_recv_time != 0)
  1176. X            aw += (float) a->p_recv / (float) a->p_recv_time;
  1177. X        if (b->p_recv_time != 0)
  1178. X            bw += (float) b->p_recv / (float) b->p_recv_time;
  1179. X    }
  1180. X    if (sort_dev_f & X_CPS) {
  1181. X        if (a->p_xmit_time != 0)
  1182. X            aw += (float) a->p_xmit / (float) a->p_xmit_time;
  1183. X        if (b->p_xmit_time != 0)
  1184. X            bw += (float) b->p_xmit / (float) b->p_xmit_time;
  1185. X    }
  1186. X    if (sort_dev_f & R_NUMB) {
  1187. X        aw += a->p_recv_cnt;
  1188. X        bw += b->p_recv_cnt;
  1189. X    }
  1190. X    if (sort_dev_f & X_NUMB) {
  1191. X        aw += a->p_xmit_cnt;
  1192. X        bw += b->p_xmit_cnt;
  1193. X    }
  1194. X    if (!sort_dev_f || (sort_sys_f == REVERSE) || ((aw == 0) && (bw == 0)))
  1195. X        aw = strcmp(b->p_dname, a->p_dname);
  1196. X    if (sort_sys_f & REVERSE)
  1197. X        return((cmp_t) (aw - bw));
  1198. X    else
  1199. X        return((cmp_t) (bw - aw));
  1200. X}
  1201. X
  1202. Xcmp_t
  1203. Xcmpsys(a, b)
  1204. X    LINK    *a,
  1205. X        *b;
  1206. X{
  1207. X    float            aw = 0, bw = 0;
  1208. X    extern unsigned short    sort_sys_f;
  1209. X
  1210. X    if (sort_sys_f & RECEIVED) {
  1211. X        aw += a->l_recv;
  1212. X        bw += b->l_recv;
  1213. X    }
  1214. X    if (sort_sys_f & XMIT) {
  1215. X        aw += a->l_xmit;
  1216. X        bw += b->l_xmit;
  1217. X    }
  1218. X    if (sort_sys_f & R_TIME) {
  1219. X        aw += a->l_recv_time;
  1220. X        bw += b->l_recv_time;
  1221. X    }
  1222. X    if (sort_sys_f & X_TIME) {
  1223. X        aw += a->l_xmit_time;
  1224. X        bw += b->l_xmit_time;
  1225. X    }
  1226. X    if (sort_sys_f & R_CPS) {
  1227. X        if (a->l_recv_time != 0)
  1228. X            aw += (float) a->l_recv / (float) a->l_recv_time;
  1229. X        if (b->l_recv_time != 0)
  1230. X            bw += (float) b->l_recv / (float) b->l_recv_time;
  1231. X    }
  1232. X    if (sort_sys_f & X_CPS) {
  1233. X        if (a->l_xmit_time != 0)
  1234. X            aw += (float) a->l_xmit / (float) a->l_xmit_time;
  1235. X        if (b->l_xmit_time != 0)
  1236. X            bw += (float) b->l_xmit / (float) b->l_xmit_time;
  1237. X    }
  1238. X    if (sort_sys_f & R_NUMB) {
  1239. X        aw += a->l_recv_cnt;
  1240. X        bw += b->l_recv_cnt;
  1241. X    }
  1242. X    if (sort_sys_f & X_NUMB) {
  1243. X        aw += a->l_xmit_cnt;
  1244. X        bw += b->l_xmit_cnt;
  1245. X    }
  1246. X    if (!sort_sys_f || (sort_sys_f == REVERSE) || ((aw == 0) && (bw == 0)))
  1247. X        aw = strcmp(b->l_sysname, a->l_sysname);
  1248. X    if (sort_sys_f & REVERSE)
  1249. X        return((cmp_t) (aw - bw));
  1250. X    else
  1251. X        return((cmp_t) (bw - aw));
  1252. X}
  1253. X
  1254. X
  1255. Xvoid
  1256. Xusage_err(arg0, msg)
  1257. X    char    *arg0;
  1258. X    char    *msg;
  1259. X{
  1260. X    (void) fprintf(stderr, "Usage: %s [options] [xferstat_file | -]\n", arg0);
  1261. X    if (msg && *msg)
  1262. X        (void) fprintf(stderr, "%s\n", msg);
  1263. X    exit(2);
  1264. X    /* NOTREACHED */
  1265. X}
  1266. X
  1267. END_OF_FILE
  1268. if test 30807 -ne `wc -c <'uutraf.c'`; then
  1269.     echo shar: \"'uutraf.c'\" unpacked with wrong size!
  1270. fi
  1271. # end of 'uutraf.c'
  1272. fi
  1273. echo shar: End of archive 3 \(of 4\).
  1274. cp /dev/null ark3isdone
  1275. MISSING=""
  1276. for I in 1 2 3 4 ; do
  1277.     if test ! -f ark${I}isdone ; then
  1278.     MISSING="${MISSING} ${I}"
  1279.     fi
  1280. done
  1281. if test "${MISSING}" = "" ; then
  1282.     echo You have unpacked all 4 archives.
  1283.     echo "Please read the file README first"
  1284.     rm -f ark[1-9]isdone
  1285. else
  1286.     echo You still need to unpack the following archives:
  1287.     echo "        " ${MISSING}
  1288. fi
  1289. ##  End of shell archive.
  1290. exit 0
  1291.