diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/misc/syslog.c | 18 | 
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);  } | 
