mirror of git://sourceware.org/git/glibc.git
misc: syslog: Assume MSG_NOSIGNAL support (BZ #17144)
MSG_NOSIGNAL was added on POSIX 2008 and Hurd seems to support it. The SIGPIPE handling also makes the implementation not thread-safe (due the sigaction usage). Checked on x86_64-linux-gnu.
This commit is contained in:
parent
7cb10381a4
commit
ded3cef361
|
@ -74,13 +74,6 @@ __libc_lock_define_initialized (static, syslog_lock)
|
||||||
|
|
||||||
static void openlog_internal(const char *, int, int);
|
static void openlog_internal(const char *, int, int);
|
||||||
static void closelog_internal(void);
|
static void closelog_internal(void);
|
||||||
#ifndef NO_SIGPIPE
|
|
||||||
static void sigpipe_handler (int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef send_flags
|
|
||||||
# define send_flags 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct cleanup_arg
|
struct cleanup_arg
|
||||||
{
|
{
|
||||||
|
@ -95,15 +88,8 @@ cancel_handler (void *ptr)
|
||||||
struct cleanup_arg *clarg = (struct cleanup_arg *) ptr;
|
struct cleanup_arg *clarg = (struct cleanup_arg *) ptr;
|
||||||
|
|
||||||
if (clarg != NULL)
|
if (clarg != NULL)
|
||||||
{
|
/* Free the memstream buffer, */
|
||||||
#ifndef NO_SIGPIPE
|
free (clarg->buf);
|
||||||
if (clarg->oldaction != NULL)
|
|
||||||
__sigaction (SIGPIPE, clarg->oldaction, NULL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Free the memstream buffer, */
|
|
||||||
free (clarg->buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Free the lock. */
|
/* Free the lock. */
|
||||||
__libc_lock_unlock (syslog_lock);
|
__libc_lock_unlock (syslog_lock);
|
||||||
|
@ -160,10 +146,6 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
|
||||||
char *buf = 0;
|
char *buf = 0;
|
||||||
size_t bufsize = 0;
|
size_t bufsize = 0;
|
||||||
size_t msgoff;
|
size_t msgoff;
|
||||||
#ifndef NO_SIGPIPE
|
|
||||||
struct sigaction action, oldaction;
|
|
||||||
int sigpipe;
|
|
||||||
#endif
|
|
||||||
int saved_errno = errno;
|
int saved_errno = errno;
|
||||||
char failbuf[3 * sizeof (pid_t) + sizeof "out of memory []"];
|
char failbuf[3 * sizeof (pid_t) + sizeof "out of memory []"];
|
||||||
|
|
||||||
|
@ -273,16 +255,6 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
|
||||||
(void)__writev(STDERR_FILENO, iov, v - iov + 1);
|
(void)__writev(STDERR_FILENO, iov, v - iov + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NO_SIGPIPE
|
|
||||||
/* Prepare for a broken connection. */
|
|
||||||
memset (&action, 0, sizeof (action));
|
|
||||||
action.sa_handler = sigpipe_handler;
|
|
||||||
sigemptyset (&action.sa_mask);
|
|
||||||
sigpipe = __sigaction (SIGPIPE, &action, &oldaction);
|
|
||||||
if (sigpipe == 0)
|
|
||||||
clarg.oldaction = &oldaction;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Get connected, output the message to the local logger. */
|
/* Get connected, output the message to the local logger. */
|
||||||
if (!connected)
|
if (!connected)
|
||||||
openlog_internal(NULL, LogStat | LOG_NDELAY, LogFacility);
|
openlog_internal(NULL, LogStat | LOG_NDELAY, LogFacility);
|
||||||
|
@ -292,7 +264,7 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
|
||||||
if (LogType == SOCK_STREAM)
|
if (LogType == SOCK_STREAM)
|
||||||
++bufsize;
|
++bufsize;
|
||||||
|
|
||||||
if (!connected || __send(LogFile, buf, bufsize, send_flags) < 0)
|
if (!connected || __send(LogFile, buf, bufsize, MSG_NOSIGNAL) < 0)
|
||||||
{
|
{
|
||||||
if (connected)
|
if (connected)
|
||||||
{
|
{
|
||||||
|
@ -302,7 +274,7 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
|
||||||
openlog_internal(NULL, LogStat | LOG_NDELAY, LogFacility);
|
openlog_internal(NULL, LogStat | LOG_NDELAY, LogFacility);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!connected || __send(LogFile, buf, bufsize, send_flags) < 0)
|
if (!connected || __send(LogFile, buf, bufsize, MSG_NOSIGNAL) < 0)
|
||||||
{
|
{
|
||||||
closelog_internal (); /* attempt re-open next time */
|
closelog_internal (); /* attempt re-open next time */
|
||||||
/*
|
/*
|
||||||
|
@ -320,11 +292,6 @@ __vsyslog_internal(int pri, const char *fmt, va_list ap,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NO_SIGPIPE
|
|
||||||
if (sigpipe == 0)
|
|
||||||
__sigaction (SIGPIPE, &oldaction, (struct sigaction *) NULL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* End of critical section. */
|
/* End of critical section. */
|
||||||
__libc_cleanup_pop (0);
|
__libc_cleanup_pop (0);
|
||||||
|
@ -396,14 +363,6 @@ openlog (const char *ident, int logstat, int logfac)
|
||||||
__libc_cleanup_pop (1);
|
__libc_cleanup_pop (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NO_SIGPIPE
|
|
||||||
static void
|
|
||||||
sigpipe_handler (int signo)
|
|
||||||
{
|
|
||||||
closelog_internal ();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
closelog_internal (void)
|
closelog_internal (void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
#define NO_SIGPIPE
|
|
||||||
#define send_flags MSG_NOSIGNAL
|
|
||||||
|
|
||||||
#include <misc/syslog.c>
|
|
Loading…
Reference in New Issue