fix syslog (corrected SIGPIPE blocking, and using dgram instead of stream)

it actually appears the hacks to block SIGPIPE are probably not
necessary, and potentially harmful. if i can confirm this, i'll remove
them.
This commit is contained in:
Rich Felker 2011-04-13 17:24:25 -04:00
parent 07e865cc5a
commit a444ee3410

View File

@ -49,7 +49,7 @@ static void __openlog(const char *ident, int opt, int facility)
if (!(opt & LOG_NDELAY) || log_f) return; 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); fcntl(fd, F_SETFD, FD_CLOEXEC);
if (connect(fd, (void *)&log_addr, sizeof(short) + sizeof "/dev/log") < 0) if (connect(fd, (void *)&log_addr, sizeof(short) + sizeof "/dev/log") < 0)
close(fd); close(fd);
@ -65,7 +65,7 @@ void openlog(const char *ident, int opt, int facility)
void syslog(int priority, const char *message, ...) void syslog(int priority, const char *message, ...)
{ {
struct sigaction sa; sigset_t set, oldset;
va_list ap; va_list ap;
char timebuf[16]; char timebuf[16];
time_t now; time_t now;
@ -83,13 +83,9 @@ void syslog(int priority, const char *message, ...)
return; return;
} }
memset(&sa, 0, sizeof sa); sigemptyset(&set);
sa.sa_handler = SIG_IGN; sigaddset(&set, SIGPIPE);
if (sigaction(SIGPIPE, &sa, &sa) < 0) { pthread_sigmask(SIG_BLOCK, &set, &oldset);
// we must abandon logging or we might cause SIGPIPE
UNLOCK(&lock);
return;
}
now = time(NULL); now = time(NULL);
gmtime_r(&now, &tm); 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!! // Note: LOG_CONS is not supported because it is annoying!!
// syslogd will send messages to console if it deems them appropriate! // 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); UNLOCK(&lock);
} }