home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / NEXTSTEP / UNIX / Networking / wu-ftpd-2.4.2b13-MIHS / support / syslog.c < prev   
Encoding:
C/C++ Source or Header  |  1997-03-03  |  3.7 KB  |  139 lines

  1. /*
  2. **      14.4.1993
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <malloc.h>
  8. #include <syslog.h>
  9. #include <varargs.h>
  10. #include <errno.h>
  11. #include <fcntl.h>
  12. #include <sys/types.h>
  13. #include <sys/time.h>
  14. #include <sys/socket.h>
  15. #include <sys/un.h>
  16.  
  17. extern int sys_nerr;
  18. extern char *sys_errlist[];
  19. extern int errno;
  20.  
  21. static int logfd = -1;
  22. static char *logident = NULL;
  23. static int logopt = 0, logfac = 0;
  24.  
  25. static int openlogfd()
  26. {
  27.         int err;
  28.         struct sockaddr_un ad;
  29.         if (logfd >= 0)
  30.                 return 0;
  31.         if ((logfd = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0)
  32.                 return logfd;
  33.         if (err = fcntl(logfd, F_SETFD, 1))
  34.                 return close(logfd), logfd = -1, err;
  35.         ad.sun_family = AF_UNIX;
  36.         strcpy(ad.sun_path, "/dev/log");
  37.         if (err = connect(logfd, &ad, sizeof ad))
  38.                 return close(logfd), logfd = -1, err;
  39.         return 0;
  40. }
  41.  
  42. int openlog(ident, opt, facility)
  43. char *ident;
  44. int opt, facility;
  45. {
  46.         int err;
  47.         char *p;
  48.         if (opt & ~(LOG_PID | LOG_ODELAY | LOG_NDELAY | LOG_NOWAIT))
  49.                 return errno = EINVAL, -1;
  50.         if (facility & ~LOG_FACMASK)
  51.                 return errno = EINVAL, -1;
  52.         logopt = opt;
  53.         logfac = facility;
  54.         if ((p = malloc(strlen(ident) + 1)) == NULL)
  55.                 return -1;
  56.         strcpy(p, ident);
  57.         if (logident != NULL)
  58.                 free(logident);
  59.         logident = p;
  60.         if (logopt & LOG_NDELAY && (err = openlogfd()))
  61.                 return err;
  62.         return 0;
  63. }
  64.  
  65. int vsyslog(priority, message, ap)
  66. int priority;
  67. char *message;
  68. va_list ap;
  69. {
  70.         int err;
  71.         char *p, *q, s[4096], format[512];
  72.         time_t tm;
  73.         if ((priority & LOG_FACMASK) == 0)
  74.                 if (logfac)
  75.                         priority |= logfac;
  76.                 else
  77.                         priority |= LOG_USER;
  78.         sprintf(s, "<%u>", priority & (LOG_FACMASK | LOG_PRIMASK));
  79.         time(&tm);
  80.         strftime(s + strlen(s), 17, "%b %e %T ", localtime(&tm));
  81.         if (logident != NULL)
  82.                 strcat(s, logident);
  83.         else
  84.                 strcat(s, "syslog");
  85.         if (logopt & LOG_PID)
  86.                 sprintf(s + strlen(s), "[%u]", getpid());
  87.         strcat(s, ": ");
  88.         for (p = message, q = format; *p;)
  89.                 if (*p == '%')
  90.                         if (p[1] == 'm')
  91.                         {
  92.                                 strcpy(q, errno >= 0 && errno < sys_nerr ?
  93.                                         sys_errlist[errno] : "Unknown error");
  94.                                 q = format + strlen(format);
  95.                                 p += 2;
  96.                         }
  97.                         else
  98.                         {
  99.                                 *q++ = *p++;
  100.                                 while (strchr("$-+ #*0123456789.l", *p) != NULL)
  101.                                         *q++ = *p++;
  102.                                 if (*p)
  103.                                         *q++ = *p++;
  104.                         }
  105.                 else
  106.                         *q++ = *p++;
  107.         *q = 0;
  108.         vsprintf(s + strlen(s), format, ap);
  109.         strcat(s, "\n");
  110.         if (err = openlogfd())
  111.                 return err;
  112.         if ((err = send(logfd, s, strlen(s), 0)) < 0)
  113.                 return err;
  114.         return 0;
  115. }
  116.  
  117. int syslog(priority, message, va_alist)
  118. int priority;
  119. char *message;
  120. va_dcl
  121. {
  122.         int err;
  123.         va_list ap;
  124.         va_start(ap);
  125.         err = vsyslog(priority, message, ap);
  126.         va_end(ap);
  127.         return err;
  128. }
  129.  
  130. int closelog()
  131. {
  132.         int err;
  133.         if (logfd < 0)
  134.                 return 0;
  135.         if ((err = close(logfd)) == 0)
  136.                 logfd = -1;
  137.         return err;
  138. }
  139.