Annotation of coherent/g/usr/lib/uucp/tay104/uulog.c, revision 1.1.1.1

1.1       root        1: /* uulog.c
                      2:    Display the UUCP log file.
                      3: 
                      4:    Copyright (C) 1991, 1992 Ian Lance Taylor
                      5: 
                      6:    This file is part of the Taylor UUCP package.
                      7: 
                      8:    This program is free software; you can redistribute it and/or
                      9:    modify it under the terms of the GNU General Public License as
                     10:    published by the Free Software Foundation; either version 2 of the
                     11:    License, or (at your option) any later version.
                     12: 
                     13:    This program is distributed in the hope that it will be useful, but
                     14:    WITHOUT ANY WARRANTY; without even the implied warranty of
                     15:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     16:    General Public License for more details.
                     17: 
                     18:    You should have received a copy of the GNU General Public License
                     19:    along with this program; if not, write to the Free Software
                     20:    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     21: 
                     22:    The author of the program may be contacted at [email protected] or
                     23:    c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
                     24:    */
                     25: 
                     26: #include "uucp.h"
                     27: 
                     28: #if USE_RCS_ID
                     29: const char uulog_rcsid[] = "$Id: uulog.c,v 1.1 93/07/30 07:59:04 bin Exp Locker: bin $";
                     30: #endif
                     31: 
                     32: #include <ctype.h>
                     33: #include <errno.h>
                     34: 
                     35: #include "getopt.h"
                     36: 
                     37: #include "uudefs.h"
                     38: #include "uuconf.h"
                     39: #include "system.h"
                     40: 
                     41: /* This is a pretty bad implementation of uulog, which I don't think
                     42:    is a very useful program anyhow.  It only takes a single -s and/or
                     43:    -u switch.  When using HAVE_HDB_LOGGING it requires a system.  */
                     44: 
                     45: /* The program name.  */
                     46: char abProgram[] = "uulog";
                     47: 
                     48: /* Local functions.  */
                     49: 
                     50: static void ulusage P((void));
                     51: 
                     52: /* Long getopt options.  */
                     53: static const struct option asLlongopts[] = { { NULL, 0, NULL, 0 } };
                     54: 
                     55: int
                     56: main (argc, argv)
                     57:      int argc;
                     58:      char **argv;
                     59: {
                     60:   /* -D: display Debug file */
                     61:   boolean fdebug = FALSE;
                     62:   /* -f: keep displaying lines forever.  */
                     63:   boolean fforever = FALSE;
                     64:   /* -n lines: number of lines to display.  */
                     65:   int cshow = 0;
                     66:   /* -s: system name.  */
                     67:   const char *zsystem = NULL;
                     68:   /* -S: display Stats file */
                     69:   boolean fstats = FALSE;
                     70:   /* -u: user name.  */
                     71:   const char *zuser = NULL;
                     72:   /* -I: configuration file name.  */
                     73:   const char *zconfig = NULL;
                     74:   /* -x: display uuxqt log file.  */
                     75:   boolean fuuxqt = FALSE;
                     76:   int i;
                     77:   int iopt;
                     78:   pointer puuconf;
                     79:   int iuuconf;
                     80:   const char *zlogfile;
                     81:   const char *zstatsfile;
                     82:   const char *zdebugfile;
                     83:   const char *zfile;
                     84:   FILE *e;
                     85:   char **pzshow = NULL;
                     86:   int ishow = 0;
                     87:   size_t csystem = 0;
                     88:   size_t cuser = 0;
                     89:   char *zline;
                     90:   size_t cline;
                     91: 
                     92:   /* Look for a straight number argument, and convert it to -n before
                     93:      passing the arguments to getopt.  */
                     94:   for (i = 0; i < argc; i++)
                     95:     {
                     96:       if (argv[i][0] == '-' && isdigit (argv[i][1]))
                     97:        {
                     98:          size_t clen;
                     99:          char *znew;
                    100: 
                    101:          clen = strlen (argv[i]);
                    102:          znew = zbufalc (clen + 2);
                    103:          znew[0] = '-';
                    104:          znew[1] = 'n';
                    105:          memcpy (znew + 2, argv[i] + 1, clen);
                    106:          argv[i] = znew;
                    107:        }
                    108:     }
                    109: 
                    110:   while ((iopt = getopt_long (argc, argv, "Df:FI:n:s:Su:xX:", asLlongopts,
                    111:                              (int *) NULL)) != EOF)
                    112:     {
                    113:       switch (iopt)
                    114:        {
                    115:        case 'D':
                    116:          /* Show debugging file.  */
                    117:          fdebug = TRUE;
                    118:          break;
                    119: 
                    120:        case 'f':
                    121:          /* Keep displaying lines forever for a particular system.  */
                    122:          fforever = TRUE;
                    123:          zsystem = optarg;
                    124:          if (cshow == 0)
                    125:            cshow = 10;
                    126:          break;
                    127: 
                    128:        case 'F':
                    129:          /* Keep displaying lines forever.  */
                    130:          fforever = TRUE;
                    131:          if (cshow == 0)
                    132:            cshow = 10;
                    133:          break;
                    134: 
                    135:        case 'I':
                    136:          /* Configuration file name.  */
                    137:          if (fsysdep_other_config (optarg))
                    138:            zconfig = optarg;
                    139:          break;
                    140: 
                    141:        case 'n':
                    142:          /* Number of lines to display.  */
                    143:          cshow = (int) strtol (optarg, (char **) NULL, 10);
                    144:          break;
                    145: 
                    146:        case 's':
                    147:          /* System name.  */
                    148:          zsystem = optarg;
                    149:          break;
                    150: 
                    151:        case 'S':
                    152:          /* Show statistics file.  */
                    153:          fstats = TRUE;
                    154:          break;
                    155: 
                    156:        case 'u':
                    157:          /* User name.  */
                    158:          zuser = optarg;
                    159:          break;
                    160: 
                    161:        case 'x':
                    162:          /* Display uuxqt log file.  */
                    163:          fuuxqt = TRUE;
                    164:          break;
                    165: 
                    166:        case 'X':
                    167: #if DEBUG > 1
                    168:          /* Set debugging level.  */
                    169:          iDebug |= idebug_parse (optarg);
                    170: #endif
                    171:          break;
                    172: 
                    173:        case 0:
                    174:          /* Long option found and flag set.  */
                    175:          break;
                    176: 
                    177:        default:
                    178:          ulusage ();
                    179:          break;
                    180:        }
                    181:     }
                    182: 
                    183:   if (optind != argc || (fstats && fdebug))
                    184:     ulusage ();
                    185: 
                    186:   iuuconf = uuconf_init (&puuconf, (const char *) NULL, zconfig);
                    187:   if (iuuconf != UUCONF_SUCCESS)
                    188:     ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
                    189: 
                    190: #if DEBUG > 1
                    191:   {
                    192:     const char *zdebug;
                    193: 
                    194:     iuuconf = uuconf_debuglevel (puuconf, &zdebug);
                    195:     if (iuuconf != UUCONF_SUCCESS)
                    196:       ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
                    197:     if (zdebug != NULL)
                    198:       iDebug |= idebug_parse (zdebug);
                    199:   }
                    200: #endif
                    201: 
                    202:   iuuconf = uuconf_logfile (puuconf, &zlogfile);
                    203:   if (iuuconf != UUCONF_SUCCESS)
                    204:     ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
                    205: 
                    206:   iuuconf = uuconf_statsfile (puuconf, &zstatsfile);
                    207:   if (iuuconf != UUCONF_SUCCESS)
                    208:     ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
                    209: 
                    210:   iuuconf = uuconf_debugfile (puuconf, &zdebugfile);
                    211:   if (iuuconf != UUCONF_SUCCESS)
                    212:     ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
                    213: 
                    214:   usysdep_initialize (puuconf, 0);
                    215: 
                    216:   if (zsystem != NULL)
                    217:     {
                    218: #if HAVE_HDB_LOGGING
                    219:       if (strcmp (zsystem, "ANY") != 0)
                    220: #endif
                    221:        {
                    222:          struct uuconf_system ssys;
                    223: 
                    224:          iuuconf = uuconf_system_info (puuconf, zsystem, &ssys);
                    225:          if (iuuconf != UUCONF_SUCCESS)
                    226:            {
                    227:              if (iuuconf != UUCONF_NOT_FOUND)
                    228:                ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
                    229:              ulog (LOG_FATAL, "%s: System not found", zsystem);
                    230:            }
                    231:          zsystem = zbufcpy (ssys.uuconf_zname);
                    232:          (void) uuconf_system_free (puuconf, &ssys);
                    233:        }
                    234:     }
                    235: 
                    236:   if (fstats)
                    237:     zfile = zstatsfile;
                    238:   else if (fdebug)
                    239:     zfile = zdebugfile;
                    240:   else
                    241:     {
                    242: #if ! HAVE_HDB_LOGGING
                    243:       zfile = zlogfile;
                    244: #else
                    245:       const char *zprogram;
                    246:       char *zalc;
                    247: 
                    248:       /* We need a system to find a HDB log file.  */
                    249:       if (zsystem == NULL)
                    250:        ulusage ();
                    251: 
                    252:       if (fuuxqt)
                    253:        zprogram = "uuxqt";
                    254:       else
                    255:        zprogram = "uucico";
                    256: 
                    257:       zalc = zbufalc (strlen (zlogfile)
                    258:                      + strlen (zprogram)
                    259:                      + strlen (zsystem)
                    260:                      + 1);
                    261:       sprintf (zalc, zlogfile, zprogram, zsystem);
                    262:       zfile = zalc;
                    263: 
                    264:       if (strcmp (zsystem, "ANY") == 0)
                    265:        zsystem = NULL;
                    266: #endif
                    267:     }
                    268: 
                    269:   e = fopen (zfile, "r");
                    270:   if (e == NULL)
                    271:     {
                    272:       ulog (LOG_ERROR, "fopen (%s): %s", zfile, strerror (errno));
                    273:       usysdep_exit (FALSE);
                    274:     }
                    275: 
                    276:   if (cshow > 0)
                    277:     {
                    278:       pzshow = (char **) xmalloc (cshow * sizeof (char *));
                    279:       for (ishow = 0; ishow < cshow; ishow++)
                    280:        pzshow[ishow] = NULL;
                    281:       ishow = 0;
                    282:     }
                    283: 
                    284:   /* Read the log file and output the appropriate lines.  */
                    285:   if (zsystem != NULL)
                    286:     csystem = strlen (zsystem);
                    287: 
                    288:   if (zuser != NULL)
                    289:     cuser = strlen (zuser);
                    290: 
                    291:   zline = NULL;
                    292:   cline = 0;
                    293: 
                    294:   while (TRUE)
                    295:     {
                    296:       while (getline (&zline, &cline, e) > 0)
                    297:        {
                    298:          char *zluser, *zlsys, *znext;
                    299:          size_t cluser, clsys;
                    300: 
                    301:          /* Skip any leading whitespace (not that there should be
                    302:             any).  */
                    303:          znext = zline + strspn (zline, " \t");
                    304: 
                    305:          if (! fstats)
                    306:            {
                    307: #if ! HAVE_TAYLOR_LOGGING
                    308:              /* The user name is the first field on the line.  */
                    309:              zluser = znext;
                    310:              cluser = strcspn (znext, " \t");
                    311: #endif
                    312:       
                    313:              /* Skip the first field.  */
                    314:              znext += strcspn (znext, " \t");
                    315:              znext += strspn (znext, " \t");
                    316: 
                    317:              /* The system is the second field on the line.  */
                    318:              zlsys = znext;
                    319:              clsys = strcspn (znext, " \t");
                    320: 
                    321:              /* Skip the second field.  */
                    322:              znext += clsys;
                    323:              znext += strspn (znext, " \t");
                    324: 
                    325: #if HAVE_TAYLOR_LOGGING
                    326:              /* The user is the third field on the line.  */
                    327:              zluser = znext;
                    328:              cluser = strcspn (znext, " \t");
                    329: #endif
                    330:            }
                    331:          else
                    332:            {
                    333: #if ! HAVE_HDB_LOGGING
                    334:              /* The user name is the first field on the line, and the
                    335:                 system name is the second.  */
                    336:              zluser = znext;
                    337:              cluser = strcspn (znext, " \t");
                    338:              znext += cluser;
                    339:              znext += strspn (znext, " \t");
                    340:              zlsys = znext;
                    341:              clsys = strcspn (znext, " \t");
                    342: #else
                    343:              /* The first field is system!user.  */
                    344:              zlsys = znext;
                    345:              clsys = strcspn (znext, "!");
                    346:              znext += clsys + 1;
                    347:              zlsys = znext;
                    348:              clsys = strcspn (znext, " \t");
                    349: #endif
                    350:            }
                    351: 
                    352:          /* See if we should print this line.  */
                    353:          if (zsystem != NULL
                    354:              && (csystem != clsys
                    355:                  || strncmp (zsystem, zlsys, clsys) != 0))
                    356:            continue;
                    357: 
                    358:          if (zuser != NULL
                    359:              && (cuser != cluser
                    360:                  || strncmp (zuser, zluser, cluser) != 0))
                    361:            continue;
                    362: 
                    363:          /* Output the line, or save it if we are outputting only a
                    364:             particular number of lines.  */
                    365:          if (cshow <= 0)
                    366:            printf ("%s", zline);
                    367:          else
                    368:            {
                    369:              ubuffree ((pointer) pzshow[ishow]);
                    370:              pzshow[ishow] = zbufcpy (zline);
                    371:              ishow = (ishow + 1) % cshow;
                    372:            }
                    373:        }
                    374: 
                    375:       /* Output the number of lines requested by the -n option.  */
                    376:       if (cshow > 0)
                    377:        {
                    378:          for (i = 0; i < cshow; i++)
                    379:            {
                    380:              if (pzshow[ishow] != NULL)
                    381:                printf ("%s", pzshow[ishow]);
                    382:              ishow = (ishow + 1) % cshow;
                    383:            }
                    384:        }
                    385: 
                    386:       /* If -f was not specified, or an error occurred while reading
                    387:         the file, get out.  */
                    388:       if (! fforever || ferror (e))
                    389:        break;
                    390: 
                    391:       clearerr (e);
                    392:       cshow = 0;
                    393: 
                    394:       /* Sleep 1 second before going around the loop again.  */
                    395:       usysdep_sleep (1);
                    396:     }
                    397: 
                    398:   (void) fclose (e);
                    399: 
                    400:   ulog_close ();
                    401: 
                    402:   usysdep_exit (TRUE);
                    403: 
                    404:   /* Avoid errors about not returning a value.  */
                    405:   return 0;
                    406: }
                    407: 
                    408: /* Print a usage message and die.  */
                    409: 
                    410: static void
                    411: ulusage ()
                    412: {
                    413:   fprintf (stderr,
                    414:           "Taylor UUCP version %s, copyright (C) 1991, 1992 Ian Lance Taylor\n",
                    415:           VERSION);
                    416:   fprintf (stderr,
                    417:           "Usage: uulog [-n #] [-sf system] [-u user] [-xDSF] [-I file] [-X debug]\n");
                    418:   fprintf (stderr,
                    419:           " -n: show given number of lines from end of log\n");
                    420:   fprintf (stderr,
                    421:           " -s: print entries for named system\n");
                    422:   fprintf (stderr,
                    423:           " -f: follow entries for named system\n");
                    424:   fprintf (stderr,
                    425:           " -u: print entries for named user\n");
                    426: #if HAVE_HDB_LOGGING
                    427:   fprintf (stderr,
                    428:           " -x: print uuxqt log rather than uucico log\n");
                    429: #else
                    430:   fprintf (stderr,
                    431:           " -F: follow entries for any system\n");
                    432: #endif
                    433:   fprintf (stderr,
                    434:           " -S: show statistics file\n");
                    435:   fprintf (stderr,
                    436:           " -D: show debugging file\n");
                    437:   fprintf (stderr,
                    438:           " -X debug: Set debugging level (0 for none, 9 is max)\n");
                    439: #if HAVE_TAYLOR_CONFIG
                    440:   fprintf (stderr,
                    441:           " -I file: Set configuration file to use\n");
                    442: #endif /* HAVE_TAYLOR_CONFIG */
                    443:   exit (EXIT_FAILURE);
                    444: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.