home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 4 / CDPD_IV.bin / networking / uucp / amigauucpsrc / lib / log.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-29  |  2.2 KB  |  122 lines

  1.  
  2. /*
  3.  *  LOG.C
  4.  *
  5.  *  (C) Copyright 1989-1990 by Matthew Dillon,  All Rights Reserved.
  6.  *
  7.  *  ulog(level, ctl, args...)
  8.  *
  9.  *  NOTE!! Requires OwnDevUnitBase to be setup before any call to ulog() !!
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <stdarg.h>
  15. #include <fcntl.h>
  16. #include <time.h>
  17.  
  18. #include "log.h"
  19. #include "config.h"
  20.  
  21. Prototype void ulog(int, const char *, ...);
  22. Prototype void OpenLog();
  23. Prototype void CLoseLog();
  24.  
  25. int    LogLevel = -1;
  26. int    LogToStdout = 0;
  27. char    *LogProgram = "-";
  28. char    *LogHost = "-";
  29. char    *LogWho = "-";
  30. char    *LogFile;
  31. char    LogBuf[512];
  32. int    LogFd = -1;
  33. short    OpenHold = 0;
  34.  
  35. void
  36. OpenLog()
  37. {
  38.     ++OpenHold;
  39. }
  40.  
  41. void
  42. CloseLog()
  43. {
  44.     if (OpenHold && --OpenHold == 0 && LogFd >= 0) {
  45.     close(LogFd);
  46.     LogFd = -1;
  47.     }
  48. }
  49.  
  50. /*
  51.  *  Note that OpenHold is a sticky issue -- we can get into lockout
  52.  *  situations if it is enabled and the program then runs another
  53.  *  program which attempts to log something.  Therefore, we release
  54.  *  our lock on the logfile even if we haven't closed the file to
  55.  *  prevent lockouts... messages may get lost, but too bad.
  56.  */
  57.  
  58. void
  59. ulog(int level, const char *ctl, ...)
  60. {
  61.     long clock;
  62.     struct tm *ut;
  63.     int len;
  64.     char *logFile;
  65.     va_list args;
  66.     static int ReLog = 0;
  67.  
  68.     va_start(args, ctl);
  69.  
  70.     if (LogFile)
  71.     logFile = LogFile;
  72.     else
  73.     logFile = MakeConfigPath(UUSPOOL, "LOGFILE");
  74.  
  75.     if (level > LogLevel)
  76.     return;
  77.  
  78.     (void)time(&clock);
  79.     ut = localtime(&clock);
  80.  
  81.     sprintf(LogBuf, "(%02d/%02d-%02d:%02d:%02d) %s,%s,%s ",
  82.     ut->tm_mon+1, ut->tm_mday, ut->tm_hour, ut->tm_min, ut->tm_sec,
  83.     LogProgram,
  84.     LogHost,
  85.     LogWho
  86.     );
  87.     vsprintf(LogBuf + strlen(LogBuf), ctl, args);
  88.  
  89.     va_end(args);
  90.  
  91.     len = strlen(LogBuf);
  92.     LogBuf[len++] = '\n';
  93.     LogBuf[len] = 0;
  94.  
  95.     DEBUG(0, "%s", LogBuf);
  96.  
  97.     if (LogToStdout) {
  98.     write(1, LogBuf, len);
  99.     return;
  100.     }
  101.  
  102.     if (ReLog++ == 0) {
  103.     LockFile("LOG-UPDATE");
  104.     if (LogFd < 0)
  105.         LogFd = open(logFile, O_CREAT|O_WRONLY|O_APPEND, 0644);
  106.     }
  107.  
  108.     if (LogFd >= 0)
  109.     write(LogFd, LogBuf, len);
  110.     else
  111.     fprintf(stderr, "Can't open %s\n", logFile);
  112.  
  113.     if (--ReLog == 0) {
  114.     if (LogFd >= 0 && OpenHold == 0) {
  115.         close(LogFd);
  116.         LogFd = -1;
  117.     }
  118.     UnLockFile("LOG-UPDATE");
  119.     }
  120. }
  121.  
  122.