X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmisc%2Fsyslog.c;h=a4f36dee9582111bbf3425251a554e2c4a01bf0c;hb=f59cedb549c642277673d28357e038801fecca64;hp=6fc6f4d8a1e76fb9d66640dfbe66b2e3795c3885;hpb=a444ee34103bb06dbcf6ddfa10abd7712982b090;p=musl diff --git a/src/misc/syslog.c b/src/misc/syslog.c index 6fc6f4d8..a4f36dee 100644 --- a/src/misc/syslog.c +++ b/src/misc/syslog.c @@ -7,14 +7,15 @@ #include #include #include +#include #include "libc.h" -static int lock; +static int lock[2]; static const char *log_ident; static int log_opt; static int log_facility = LOG_USER; static int log_mask = 0xff; -static FILE *log_f; +static int log_fd = -1; int setlogmask(int maskpri) { @@ -33,81 +34,90 @@ static const struct { void closelog(void) { - LOCK(&lock); - if (log_f) fclose(log_f); - log_f = NULL; - UNLOCK(&lock); + int cs; + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); + LOCK(lock); + close(log_fd); + log_fd = -1; + UNLOCK(lock); + pthread_setcancelstate(cs, 0); } static void __openlog(const char *ident, int opt, int facility) { - int fd; - log_ident = ident; log_opt = opt; log_facility = facility; - if (!(opt & LOG_NDELAY) || log_f) return; + if (!(opt & LOG_NDELAY) || log_fd>=0) return; - fd = socket(AF_UNIX, SOCK_DGRAM, 0); - fcntl(fd, F_SETFD, FD_CLOEXEC); - if (connect(fd, (void *)&log_addr, sizeof(short) + sizeof "/dev/log") < 0) - close(fd); - else log_f = fdopen(fd, "wb"); + log_fd = socket(AF_UNIX, SOCK_DGRAM, 0); + fcntl(log_fd, F_SETFD, FD_CLOEXEC); } void openlog(const char *ident, int opt, int facility) { - LOCK(&lock); + int cs; + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); + LOCK(lock); __openlog(ident, opt, facility); - UNLOCK(&lock); + UNLOCK(lock); + pthread_setcancelstate(cs, 0); } -void syslog(int priority, const char *message, ...) +static void _vsyslog(int priority, const char *message, va_list ap) { - sigset_t set, oldset; - va_list ap; char timebuf[16]; time_t now; struct tm tm; - //const char *fmt, *ident, *sep; - //int i; - - if (!(log_mask & LOG_MASK(priority&7)) || (priority&~0x3ff)) return; - - LOCK(&lock); - - if (!log_f) __openlog(log_ident, log_opt | LOG_NDELAY, log_facility); - if (!log_f) { - UNLOCK(&lock); - return; + char buf[256]; + int pid; + int l, l2; + + if (log_fd < 0) { + __openlog(log_ident, log_opt | LOG_NDELAY, log_facility); + if (log_fd < 0) { + UNLOCK(lock); + return; + } } - sigemptyset(&set); - sigaddset(&set, SIGPIPE); - pthread_sigmask(SIG_BLOCK, &set, &oldset); - now = time(NULL); gmtime_r(&now, &tm); strftime(timebuf, sizeof timebuf, "%b %e %T", &tm); - fprintf(log_f, "<%d>%s ", priority, timebuf); - if (log_ident) fprintf(log_f, "%s", log_ident); - if (log_opt & LOG_PID) fprintf(log_f, "[%d]", getpid()); - if (log_ident) fprintf(log_f, ": "); - - va_start(ap, message); - vfprintf(log_f, message, ap); - va_end(ap); - fputc(0, log_f); - fflush(log_f); + pid = (log_opt & LOG_PID) ? getpid() : 0; + l = snprintf(buf, sizeof buf, "<%d>%s %s%s%.0d%s: ", + priority, timebuf, + log_ident ? log_ident : "", + "["+!pid, pid, "]"+!pid); + l2 = vsnprintf(buf+l, sizeof buf - l, message, ap); + if (l2 >= 0) { + l += l2; + if (buf[l-1] != '\n') buf[l++] = '\n'; + sendto(log_fd, buf, l, 0, (void *)&log_addr, 11); + } - // Note: LOG_CONS is not supported because it is annoying!! - // syslogd will send messages to console if it deems them appropriate! + UNLOCK(lock); +} - /* Clear any possible SIGPIPE generated by the socket write. */ - sigtimedwait(&set, 0, (struct timespec [1]){0}) || (perror("x"),1); - pthread_sigmask(SIG_SETMASK, &oldset, 0); +void __vsyslog(int priority, const char *message, va_list ap) +{ + int cs; + if (!(log_mask & LOG_MASK(priority&7)) || (priority&~0x3ff)) return; + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); + LOCK(lock); + _vsyslog(priority, message, ap); + UNLOCK(lock); + pthread_setcancelstate(cs, 0); +} - UNLOCK(&lock); +void syslog(int priority, const char *message, ...) +{ + va_list ap; + va_start(ap, message); + __vsyslog(priority, message, ap); + va_end(ap); } + +weak_alias(__vsyslog, vsyslog);