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

1.1       root        1: /* log.c
                      2:    Routines to add entries to the log files.
                      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 log_rcsid[] = "$Id: log.c,v 1.1 93/07/30 07:53:10 bin Exp Locker: bin $";
                     30: #endif
                     31: 
                     32: #include <errno.h>
                     33: 
                     34: #if ANSI_C
                     35: #include <stdarg.h>
                     36: #endif
                     37: 
                     38: #if HAVE_TIME_H
                     39: #include <time.h>
                     40: #endif
                     41: 
                     42: #include "uudefs.h"
                     43: #include "uuconf.h"
                     44: #include "system.h"
                     45: 
                     46: /* Local functions.  */
                     47: 
                     48: static const char *zldate_and_time P((void));
                     49: 
                     50: /* Log file name.  */
                     51: static const char *zLogfile;
                     52: 
                     53: /* The function to call when a LOG_FATAL error occurs.  */
                     54: static void (*pfLfatal) P((void));
                     55: 
                     56: /* Whether to go to a file.  */
                     57: static boolean fLfile;
                     58: 
                     59: /* ID number.  */
                     60: static int iLid;
                     61: 
                     62: /* The current user name.  */
                     63: static char *zLuser;
                     64: 
                     65: /* The current system name.  */
                     66: static char *zLsystem;
                     67: 
                     68: /* The current device name.  */
                     69: char *zLdevice;
                     70: 
                     71: /* The open log file.  */
                     72: static FILE *eLlog;
                     73: 
                     74: /* Whether we have tried to open the log file.  We need this because
                     75:    we don't want to keep trying to open the log file if we failed the
                     76:    first time.  It can't be static because under HAVE_HDB_LOGGING we
                     77:    may have to write to various different log files.  */
                     78: static boolean fLlog_tried;
                     79: 
                     80: #if DEBUG > 1
                     81: /* Debugging file name.  */
                     82: static const char *zLdebugfile;
                     83: 
                     84: /* The open debugging file.  */
                     85: static FILE *eLdebug;
                     86: 
                     87: /* Whether we've tried to open the debugging file.  */
                     88: static boolean fLdebug_tried;
                     89: 
                     90: /* Whether we've written out any debugging information.  */
                     91: static boolean fLdebugging;
                     92: #endif
                     93: 
                     94: /* Statistics file name.  */
                     95: static const char *zLstatsfile;
                     96: 
                     97: /* The open statistics file.  */
                     98: static FILE *eLstats;
                     99: 
                    100: /* Whether we've tried to open the statistics file.  */
                    101: static boolean fLstats_tried;
                    102: 
                    103: /* The array of signals.  The elements are only set to TRUE by the
                    104:    default signal handler.  They are only set to FALSE if we don't
                    105:    care whether we got the signal or not.  */
                    106: volatile sig_atomic_t afSignal[INDEXSIG_COUNT];
                    107: 
                    108: /* The array of signals to log.  The elements are only set to TRUE by
                    109:    the default signal handler.  They are set to FALSE when the signal
                    110:    is logged in ulog.  This means that if a signal comes in at just
                    111:    the right time we won't log it (or, rather, we'll log it once
                    112:    instead of twice), but that is not a catatrophe.  */
                    113: volatile sig_atomic_t afLog_signal[INDEXSIG_COUNT];
                    114: 
                    115: /* Flag that indicates SIGHUP is worth logging.  */
                    116: boolean fLog_sighup = TRUE;
                    117: 
                    118: /* Signal names to use when logging signals.  */
                    119: static const char * const azSignal_names[INDEXSIG_COUNT] = INDEXSIG_NAMES;
                    120: 
                    121: /* If not NULL, ulog calls this function before outputting anything.
                    122:    This is used to support cu.  */
                    123: void (*pfLstart) P((void));
                    124: 
                    125: /* If not NULL, ulog calls this function after outputting everything.
                    126:    This is used to support cu.  */
                    127: void (*pfLend) P((void));
                    128: 
                    129: /* Set the function to call on a LOG_FATAL error.  */
                    130: 
                    131: void
                    132: ulog_fatal_fn (pfn)
                    133:      void (*pfn) P((void));
                    134: {
                    135:   pfLfatal = pfn;
                    136: }
                    137: 
                    138: /* Decide whether to send log message to the file or not.  */
                    139: 
                    140: void
                    141: ulog_to_file (puuconf, ffile)
                    142:      pointer puuconf;
                    143:      boolean ffile;
                    144: {
                    145:   int iuuconf;
                    146: 
                    147:   iuuconf = uuconf_logfile (puuconf, &zLogfile);
                    148:   if (iuuconf != UUCONF_SUCCESS)
                    149:     ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
                    150: 
                    151: #if DEBUG > 1
                    152:   iuuconf = uuconf_debugfile (puuconf, &zLdebugfile);
                    153:   if (iuuconf != UUCONF_SUCCESS)
                    154:     ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
                    155: #endif
                    156: 
                    157:   iuuconf = uuconf_statsfile (puuconf, &zLstatsfile);
                    158:   if (iuuconf != UUCONF_SUCCESS)
                    159:     ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
                    160: 
                    161:   fLfile = ffile;
                    162: }
                    163: 
                    164: /* Set the ID number.  This will be called by the usysdep_initialize
                    165:    if there is something sensible to set it to.  */
                    166: 
                    167: void
                    168: ulog_id (i)
                    169:      int i;
                    170: {
                    171:   iLid = i;
                    172: }
                    173: 
                    174: /* Set the user we are making log entries for.  The arguments will be
                    175:    copied into memory.  */
                    176: 
                    177: void
                    178: ulog_user (zuser)
                    179:      const char *zuser;
                    180: {
                    181:   ubuffree (zLuser);
                    182:   zLuser = zbufcpy (zuser);
                    183: }
                    184: 
                    185: /* Set the system name we are making log entries for.  The name is copied
                    186:    into memory.  */
                    187: 
                    188: void
                    189: ulog_system (zsystem)
                    190:   const char *zsystem;
                    191: {
                    192:   if (zsystem == NULL
                    193:       || zLsystem == NULL
                    194:       || strcmp (zsystem, zLsystem) != 0)
                    195:     {
                    196:       ubuffree (zLsystem);
                    197:       zLsystem = zbufcpy (zsystem);
                    198: #if HAVE_HDB_LOGGING      
                    199:       /* Under HDB logging we now must write to a different log file.  */
                    200:       ulog_close ();
                    201: #endif /* HAVE_HDB_LOGGING */
                    202:     }
                    203: }
                    204: 
                    205: /* Set the device name.  This is copied into memory.  */
                    206: 
                    207: void
                    208: ulog_device (zdevice)
                    209:      const char *zdevice;
                    210: {
                    211:   ubuffree (zLdevice);
                    212:   zLdevice = zbufcpy (zdevice);
                    213: }
                    214: 
                    215: /* Make a log entry.  We make a token concession to non ANSI_C systems,
                    216:    but it clearly won't always work.  */
                    217: 
                    218: #if ! ANSI_C
                    219: #undef HAVE_VFPRINTF
                    220: #endif
                    221: 
                    222: /*VARARGS2*/
                    223: #if HAVE_VFPRINTF
                    224: void
                    225: ulog (enum tlog ttype, const char *zmsg, ...)
                    226: #else
                    227: void
                    228: ulog (ttype, zmsg, a, b, c, d, f, g, h, i, j)
                    229:      enum tlog ttype;
                    230:      const char *zmsg;
                    231: #endif
                    232: {
                    233: #if HAVE_VFPRINTF
                    234:   va_list parg;
                    235: #endif
                    236:   FILE *e, *edebug;
                    237:   boolean fstart, fend;
                    238:   const char *zhdr, *zstr;
                    239: 
                    240:   /* Log any received signal.  We do it this way to avoid calling ulog
                    241:      from the signal handler.  A few routines call ulog to get this
                    242:      message out with zmsg == NULL.  */
                    243:   {
                    244:     static boolean fdoing_sigs;
                    245: 
                    246:     if (! fdoing_sigs)
                    247:       {
                    248:        int isig;
                    249: 
                    250:        fdoing_sigs = TRUE;
                    251:        for (isig = 0; isig < INDEXSIG_COUNT; isig++)
                    252:          {
                    253:            if (afLog_signal[isig])
                    254:              {
                    255:                afLog_signal[isig] = FALSE;
                    256: 
                    257:                /* Apparently SunOS sends SIGINT rather than SIGHUP
                    258:                   when hanging up, so we don't log either signal if
                    259:                   fLog_sighup is FALSE.  */
                    260:                if ((isig != INDEXSIG_SIGHUP && isig != INDEXSIG_SIGINT)
                    261:                    || fLog_sighup)
                    262:                  ulog (LOG_ERROR, "Got %s signal", azSignal_names[isig]);
                    263:              }
                    264:          }
                    265:        fdoing_sigs = FALSE;
                    266:       }
                    267:   }
                    268: 
                    269:   if (zmsg == NULL)
                    270:     return;
                    271: 
                    272: #if DEBUG > 1
                    273:   /* If we've had a debugging file open in the past, then we want to
                    274:      write all log file entries to the debugging file even if it's
                    275:      currently closed.  */
                    276:   if (fLfile
                    277:       && eLdebug == NULL
                    278:       && ! fLdebug_tried
                    279:       && (fLdebugging || (int) ttype >= (int) LOG_DEBUG))
                    280:     {
                    281:       fLdebug_tried = TRUE;
                    282:       eLdebug = esysdep_fopen (zLdebugfile, FALSE, TRUE, TRUE);
                    283:       fLdebugging = TRUE;
                    284:     }
                    285: #endif /* DEBUG > 1 */
                    286: 
                    287:   if (! fLfile)
                    288:     e = stderr;
                    289: #if DEBUG > 1
                    290:   else if ((int) ttype >= (int) LOG_DEBUG)
                    291:     {
                    292:       e = eLdebug;
                    293: 
                    294:       /* If we can't open the debugging file, don't output any
                    295:         debugging messages.  */
                    296:       if (e == NULL)
                    297:        return;
                    298:     }
                    299: #endif /* DEBUG > 1 */
                    300:   else
                    301:     {
                    302:       if (eLlog == NULL && ! fLlog_tried)
                    303:        {
                    304:          fLlog_tried = TRUE;
                    305: #if ! HAVE_HDB_LOGGING
                    306:          eLlog = esysdep_fopen (zLogfile, TRUE, TRUE, TRUE);
                    307: #else /* HAVE_HDB_LOGGING */
                    308:          {
                    309:            const char *zsys;
                    310:            char *zfile;
                    311: 
                    312:            /* We want to write to .Log/program/system, e.g.    
                    313:               .Log/uucico/uunet.  The system name may not be set.  */
                    314:            if (zLsystem == NULL)
                    315:              zsys = "ANY";
                    316:            else
                    317:              zsys = zLsystem;
                    318: 
                    319:            zfile = zbufalc (strlen (zLogfile)
                    320:                             + strlen (abProgram)
                    321:                             + strlen (zsys)
                    322:                             + 1);
                    323:            sprintf (zfile, zLogfile, abProgram, zsys);
                    324:            eLlog = esysdep_fopen (zfile, TRUE, TRUE, TRUE);
                    325:            ubuffree (zfile);
                    326:          }
                    327: #endif /* HAVE_HDB_LOGGING */
                    328: 
                    329:          if (eLlog == NULL)
                    330:            {
                    331:              /* We can't open the log file.  We don't even have a
                    332:                 safe way to report this problem, since we may not be
                    333:                 able to write to stderr (it may, for example, be
                    334:                 attached to the incoming call).  */
                    335:              if (pfLfatal != NULL)
                    336:                (*pfLfatal) ();
                    337:              usysdep_exit (FALSE);
                    338:            }
                    339:        }
                    340: 
                    341:       e = eLlog;
                    342: 
                    343:       /* eLlog might be NULL here because we might try to open the log
                    344:         file recursively via esysdep_fopen.  */
                    345:       if (e == NULL)
                    346:        return;
                    347:     }
                    348: 
                    349:   if (pfLstart != NULL)
                    350:     (*pfLstart) ();
                    351: 
                    352:   edebug = NULL;
                    353: #if DEBUG > 1
                    354:   if ((int) ttype < (int) LOG_DEBUG)
                    355:     edebug = eLdebug;
                    356: #endif
                    357: 
                    358:   fstart = TRUE;
                    359:   fend = TRUE;
                    360: 
                    361:   switch (ttype)
                    362:     {
                    363:     case LOG_NORMAL:
                    364:       zhdr = "";
                    365:       break;
                    366:     case LOG_ERROR:
                    367:       zhdr = "ERROR: ";
                    368:       break;
                    369:     case LOG_FATAL:
                    370:       zhdr = "FATAL: ";
                    371:       break;
                    372: #if DEBUG > 1
                    373:     case LOG_DEBUG:
                    374:       zhdr = "DEBUG: ";
                    375:       break;
                    376:     case LOG_DEBUG_START:
                    377:       zhdr = "DEBUG: ";
                    378:       fend = FALSE;
                    379:       break;
                    380:     case LOG_DEBUG_CONTINUE:
                    381:       zhdr = NULL;
                    382:       fstart = FALSE;
                    383:       fend = FALSE;
                    384:       break;
                    385:     case LOG_DEBUG_END:
                    386:       zhdr = NULL;
                    387:       fstart = FALSE;
                    388:       break;
                    389: #endif
                    390:     default:
                    391:       zhdr = "???: ";
                    392:       break;
                    393:     }
                    394: 
                    395:   if (fstart)
                    396:     {
                    397:       if (! fLfile)
                    398:        {
                    399:          fprintf (e, "%s: ", abProgram);
                    400:          if (edebug != NULL)
                    401:            fprintf (edebug, "%s: ", abProgram);
                    402:        }
                    403:       else
                    404:        {
                    405: #if HAVE_TAYLOR_LOGGING
                    406:          fprintf (e, "%s ", abProgram);
                    407:          if (edebug != NULL)
                    408:            fprintf (edebug, "%s ", abProgram);
                    409: #else /* ! HAVE_TAYLOR_LOGGING */
                    410:          fprintf (e, "%s ", zLuser == NULL ? "uucp" : zLuser);
                    411:          if (edebug != NULL)
                    412:            fprintf (edebug, "%s ", zLuser == NULL ? "uucp" : zLuser);
                    413: #endif /* HAVE_TAYLOR_LOGGING */
                    414: 
                    415:          fprintf (e, "%s ", zLsystem == NULL ? "-" : zLsystem);
                    416:          if (edebug != NULL)
                    417:            fprintf (edebug, "%s ", zLsystem == NULL ? "-" : zLsystem);
                    418: 
                    419: #if HAVE_TAYLOR_LOGGING
                    420:          fprintf (e, "%s ", zLuser == NULL ? "-" : zLuser);
                    421:          if (edebug != NULL)
                    422:            fprintf (edebug, "%s ", zLuser == NULL ? "-" : zLuser);
                    423: #endif /* HAVE_TAYLOR_LOGGING */
                    424: 
                    425:          zstr = zldate_and_time ();
                    426:          fprintf (e, "(%s", zstr);
                    427:          if (edebug != NULL)
                    428:            fprintf (edebug, "(%s", zstr); 
                    429: 
                    430:          if (iLid != 0)
                    431:            {
                    432: #if ! HAVE_HDB_LOGGING
                    433: #if HAVE_TAYLOR_LOGGING
                    434:              fprintf (e, " %d", iLid);
                    435:              if (edebug != NULL)
                    436:                fprintf (edebug, " %d", iLid);
                    437: #else /* ! HAVE_TAYLOR_LOGGING */
                    438:              fprintf (e, "-%d", iLid);
                    439:              if (edebug != NULL)
                    440:                fprintf (edebug, "-%d", iLid);
                    441: #endif /* ! HAVE_TAYLOR_LOGGING */
                    442: #else /* HAVE_HDB_LOGGING */
                    443: 
                    444:              /* I assume that the second number here is meant to be
                    445:                 some sort of file sequence number, and that it should
                    446:                 correspond to the sequence number in the statistics
                    447:                 file.  I don't have any really convenient way to do
                    448:                 this, so I won't unless somebody thinks it's very
                    449:                 important.  */
                    450:              fprintf (e, ",%d,%d", iLid, 0);
                    451:              if (edebug != NULL)
                    452:                fprintf (edebug, ",%d,%d", iLid, 0);
                    453: #endif /* HAVE_HDB_LOGGING */
                    454:            }
                    455: 
                    456:          fprintf (e, ") ");
                    457:          if (edebug != NULL)
                    458:            fprintf (edebug, ") ");
                    459: 
                    460:          fprintf (e, "%s", zhdr);
                    461:          if (edebug != NULL)
                    462:            fprintf (edebug, "%s", zhdr);
                    463:        }
                    464:     }
                    465: 
                    466: #if HAVE_VFPRINTF
                    467:   va_start (parg, zmsg);
                    468:   vfprintf (e, zmsg, parg);
                    469:   va_end (parg);
                    470:   if (edebug != NULL)
                    471:     {
                    472:       va_start (parg, zmsg);
                    473:       vfprintf (edebug, zmsg, parg);
                    474:       va_end (parg);
                    475:     }
                    476: #else /* ! HAVE_VFPRINTF */
                    477:   fprintf (e, zmsg, a, b, c, d, f, g, h, i, j);
                    478:   if (edebug != NULL)
                    479:     fprintf (edebug, zmsg, a, b, c, d, f, g, h, i, j);
                    480: #endif /* ! HAVE_VFPRINTF */
                    481: 
                    482:   if (fend)
                    483:     {
                    484:       fprintf (e, "\n");
                    485:       if (edebug != NULL)
                    486:        fprintf (edebug, "\n");
                    487:     }
                    488: 
                    489:   (void) fflush (e);
                    490:   if (edebug != NULL)
                    491:     (void) fflush (edebug);
                    492: 
                    493:   if (pfLend != NULL)
                    494:     (*pfLend) ();
                    495: 
                    496:   if (ttype == LOG_FATAL)
                    497:     {
                    498:       if (pfLfatal != NULL)
                    499:        (*pfLfatal) ();
                    500:       usysdep_exit (FALSE);
                    501:     }
                    502: 
                    503: #if CLOSE_LOGFILES
                    504:   ulog_close ();
                    505: #endif
                    506: }
                    507: 
                    508: /* Log a uuconf error.  */
                    509: 
                    510: void
                    511: ulog_uuconf (ttype, puuconf, iuuconf)
                    512:      enum tlog ttype;
                    513:      pointer puuconf;
                    514:      int iuuconf;
                    515: {
                    516:   char ab[512];
                    517: 
                    518:   (void) uuconf_error_string (puuconf, iuuconf, ab, sizeof ab);
                    519:   ulog (ttype, "%s", ab);
                    520: }
                    521: 
                    522: /* Close the log file.  There's nothing useful we can do with errors,
                    523:    so we don't check for them.  */
                    524: 
                    525: void
                    526: ulog_close ()
                    527: {
                    528:   /* Make sure we logged any signal we received.  */
                    529:   ulog (LOG_ERROR, (const char *) NULL);
                    530: 
                    531:   if (eLlog != NULL)
                    532:     {
                    533:       (void) fclose (eLlog);
                    534:       eLlog = NULL;
                    535:       fLlog_tried = FALSE;
                    536:     }
                    537: 
                    538: #if DEBUG > 1
                    539:   if (eLdebug != NULL)
                    540:     {
                    541:       (void) fclose (eLdebug);
                    542:       eLdebug = NULL;
                    543:       fLdebug_tried = FALSE;
                    544:     }
                    545: #endif
                    546: }
                    547: 
                    548: /* Add an entry to the statistics file.  We may eventually want to put
                    549:    failed file transfers in here, but we currently do not.  */
                    550: 
                    551: /*ARGSUSED*/
                    552: void
                    553: ustats (fsucceeded, zuser, zsystem, fsent, cbytes, csecs, cmicros, fmaster)
                    554:      boolean fsucceeded;
                    555:      const char *zuser;
                    556:      const char *zsystem;
                    557:      boolean fsent;
                    558:      long cbytes;
                    559:      long csecs;
                    560:      long cmicros;
                    561:      boolean fmaster;
                    562: {
                    563:   long cbps;
                    564: 
                    565:   /* The seconds and microseconds are now counted independently, so
                    566:      they may be out of synch.  */
                    567:   if (cmicros < 0)
                    568:     {
                    569:       csecs -= ((- cmicros) / 1000000L) + 1;
                    570:       cmicros = 1000000L - ((- cmicros) % 1000000L);
                    571:     }
                    572:   if (cmicros >= 1000000L)
                    573:     {
                    574:       csecs += cmicros / 10000000L;
                    575:       cmicros = cmicros % 1000000L;
                    576:     }      
                    577: 
                    578:   /* On a system which can determine microseconds we might very well
                    579:      have both csecs == 0 and cmicros == 0.  */
                    580:   if (csecs == 0 && cmicros < 1000)
                    581:     cbps = 0;
                    582:   else
                    583:     {
                    584:       long cmillis;
                    585: 
                    586:       /* This computation will not overflow provided csecs < 2147483
                    587:         and cbytes and cbps both fit in a long.  */
                    588:       cmillis = csecs * 1000 + cmicros / 1000;
                    589:       cbps = ((cbytes / cmillis) * 1000
                    590:              + ((cbytes % cmillis) * 1000) / cmillis);
                    591:     }
                    592: 
                    593:   if (eLstats == NULL)
                    594:     {
                    595:       if (fLstats_tried)
                    596:        return;
                    597:       fLstats_tried = TRUE;
                    598:       eLstats = esysdep_fopen (zLstatsfile, TRUE, TRUE, TRUE);
                    599:       if (eLstats == NULL)
                    600:        return;
                    601:     }
                    602: 
                    603: #if HAVE_TAYLOR_LOGGING
                    604:   fprintf (eLstats,
                    605:           "%s %s (%s) %s%s %ld bytes in %ld.%03ld seconds (%ld bytes/sec)\n",
                    606:           zuser, zsystem, zldate_and_time (),
                    607:           fsucceeded ? "" : "failed after ",
                    608:           fsent ? "sent" : "received",
                    609:           cbytes, csecs, cmicros / 1000, cbps);
                    610: #endif /* HAVE_TAYLOR_LOGGING */
                    611: #if HAVE_V2_LOGGING
                    612:   fprintf (eLstats,
                    613:           "%s %s (%s) (%ld) %s %s %ld bytes %ld seconds\n",
                    614:           zuser, zsystem, zldate_and_time (),
                    615:           (long) time ((time_t *) NULL),
                    616:           fsent ? "sent" : "received",
                    617:           fsucceeded ? "data" : "failed after",
                    618:           cbytes, csecs + cmicros / 500000);
                    619: #endif /* HAVE_V2_LOGGING */
                    620: #if HAVE_HDB_LOGGING
                    621:   {
                    622:     static int iseq;
                    623: 
                    624:     /* I don't know what the 'C' means.  The sequence number should
                    625:        probably correspond to the sequence number in the log file, but
                    626:        that is currently always 0; using this fake sequence number
                    627:        will still at least reveal which transfers are from different
                    628:        calls.  We don't report a failed data transfer with this
                    629:        format.  */
                    630:     if (! fsucceeded)
                    631:       return;
                    632:     ++iseq;
                    633:     fprintf (eLstats,
                    634:             "%s!%s %c (%s) (C,%d,%d) [%s] %s %ld / %ld.%03ld secs, %ld %s\n",
                    635:             zsystem, zuser, fmaster ? 'M' : 'S', zldate_and_time (),
                    636:             iLid, iseq, zLdevice == NULL ? "unknown" : zLdevice,
                    637:             fsent ? "->" : "<-",
                    638:             cbytes, csecs, cmicros / 1000, cbps,
                    639:             "bytes/sec");
                    640:   }
                    641: #endif /* HAVE_HDB_LOGGING */
                    642: 
                    643:   (void) fflush (eLstats);
                    644: 
                    645: #if CLOSE_LOGFILES
                    646:   ustats_close ();
                    647: #endif
                    648: }
                    649: 
                    650: /* Close the statistics file.  */
                    651: 
                    652: void
                    653: ustats_close ()
                    654: {
                    655:   if (eLstats != NULL)
                    656:     {
                    657:       if (fclose (eLstats) != 0)
                    658:        ulog (LOG_ERROR, "fclose: %s", strerror (errno));
                    659:       eLstats = NULL;
                    660:       fLstats_tried = FALSE;
                    661:     }
                    662: }
                    663: 
                    664: /* Return the date and time in a form used for a log entry.  */
                    665: 
                    666: static const char *
                    667: zldate_and_time ()
                    668: {
                    669:   long isecs, imicros;
                    670:   struct tm s;
                    671: #if HAVE_TAYLOR_LOGGING
                    672:   static char ab[sizeof "1991-12-31 12:00:00.00"];
                    673: #endif
                    674: #if HAVE_V2_LOGGING
                    675:   static char ab[sizeof "12/31-12:00"];
                    676: #endif
                    677: #if HAVE_HDB_LOGGING
                    678:   static char ab[sizeof "12/31-12:00:00"];
                    679: #endif
                    680: 
                    681:   isecs = ixsysdep_time (&imicros);
                    682:   usysdep_localtime (isecs, &s);
                    683: 
                    684: #if HAVE_TAYLOR_LOGGING
                    685:   sprintf (ab, "%04d-%02d-%02d %02d:%02d:%02d.%02d",
                    686:           s.tm_year + 1900, s.tm_mon + 1, s.tm_mday, s.tm_hour,
                    687:           s.tm_min, s.tm_sec, (int) (imicros / 10000));
                    688: #endif
                    689: #if HAVE_V2_LOGGING
                    690:   sprintf (ab, "%d/%d-%02d:%02d", s.tm_mon + 1, s.tm_mday,
                    691:           s.tm_hour, s.tm_min);
                    692: #endif
                    693: #if HAVE_HDB_LOGGING
                    694:   sprintf (ab, "%d/%d-%02d:%02d:%02d", s.tm_mon + 1, s.tm_mday,
                    695:           s.tm_hour, s.tm_min, s.tm_sec);
                    696: #endif
                    697: 
                    698:   return ab;
                    699: }

unix.superglobalmegacorp.com

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