summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/misc/syslog.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/src/misc/syslog.c b/src/misc/syslog.c
index 4809d2da..6fc6f4d8 100644
--- a/src/misc/syslog.c
+++ b/src/misc/syslog.c
@@ -49,7 +49,7 @@ static void __openlog(const char *ident, int opt, int facility)
if (!(opt & LOG_NDELAY) || log_f) return;
- fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ 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);
@@ -65,7 +65,7 @@ void openlog(const char *ident, int opt, int facility)
void syslog(int priority, const char *message, ...)
{
- struct sigaction sa;
+ sigset_t set, oldset;
va_list ap;
char timebuf[16];
time_t now;
@@ -83,13 +83,9 @@ void syslog(int priority, const char *message, ...)
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;
- }
+ sigemptyset(&set);
+ sigaddset(&set, SIGPIPE);
+ pthread_sigmask(SIG_BLOCK, &set, &oldset);
now = time(NULL);
gmtime_r(&now, &tm);
@@ -109,7 +105,9 @@ void syslog(int priority, const char *message, ...)
// Note: LOG_CONS is not supported because it is annoying!!
// syslogd will send messages to console if it deems them appropriate!
- sigaction(SIGPIPE, &sa, NULL);
+ /* 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);
UNLOCK(&lock);
}