X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fmisc%2Fsyslog.c;h=cbe65209627df54d5dc24459ad26b4a00c031998;hp=4809d2da68a9ab7f33c9a7c910e2b2eceebe0681;hb=28af39fe427ffec8b836f4f30450ffc30b03e5c4;hpb=0b44a0315b47dd8eced9f3b7f31580cf14bbfc01 diff --git a/src/misc/syslog.c b/src/misc/syslog.c index 4809d2da..cbe65209 100644 --- a/src/misc/syslog.c +++ b/src/misc/syslog.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "libc.h" static int lock; @@ -14,7 +15,7 @@ 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,83 +34,90 @@ static const struct { void closelog(void) { + int cs; + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); LOCK(&lock); - if (log_f) fclose(log_f); - log_f = NULL; + 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_STREAM, 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) { + int cs; + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); LOCK(&lock); __openlog(ident, opt, facility); UNLOCK(&lock); + pthread_setcancelstate(cs, 0); } -void syslog(int priority, const char *message, ...) +static void _vsyslog(int priority, const char *message, va_list ap) { - struct sigaction sa; - 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; - } - - memset(&sa, 0, sizeof sa); - sa.sa_handler = SIG_IGN; - if (sigaction(SIGPIPE, &sa, &sa) < 0) { - // we must abandon logging or we might cause SIGPIPE - 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; + } } 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); - - // Note: LOG_CONS is not supported because it is annoying!! - // syslogd will send messages to console if it deems them appropriate! + 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); + } - sigaction(SIGPIPE, &sa, NULL); + UNLOCK(&lock); +} +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); +} + +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);