198 lines
5.0 KiB
Plaintext
198 lines
5.0 KiB
Plaintext
---
|
|
syslogd.c | 68 ++++++++++++++++++++++++++++++++++++++------------------------
|
|
1 file changed, 42 insertions(+), 26 deletions(-)
|
|
|
|
--- syslogd.c
|
|
+++ syslogd.c 2022-10-19 09:49:43.134694341 +0000
|
|
@@ -544,6 +544,10 @@ static char sccsid[] __attribute__ ((un
|
|
#include <sys/time.h>
|
|
#include <sys/resource.h>
|
|
#include <signal.h>
|
|
+#ifndef _GNU_SOURCE
|
|
+typedef void (*sighandler_t)(int);
|
|
+#endif
|
|
+static sighandler_t resignal(int signum, sighandler_t handler);
|
|
|
|
#include <netinet/in.h>
|
|
#include <netdb.h>
|
|
@@ -618,7 +622,7 @@ char **parts;
|
|
int inetm = 0;
|
|
static int debugging_on = 0;
|
|
static int nlogs = -1;
|
|
-static int restart = 0;
|
|
+static volatile sig_atomic_t restart;
|
|
|
|
#define MAXFUNIX 20
|
|
|
|
@@ -1134,13 +1138,13 @@ int main(argc, argv)
|
|
|
|
leave = 0;
|
|
|
|
- (void) signal(SIGTERM, die);
|
|
+ (void) resignal(SIGTERM, die); /* Make recvfrom() be able to receive EINTR */
|
|
(void) signal(SIGINT, Debug ? die : SIG_IGN);
|
|
(void) signal(SIGQUIT, Debug ? die : SIG_IGN);
|
|
- (void) signal(SIGCHLD, reapchild);
|
|
- (void) signal(SIGALRM, domark);
|
|
- (void) signal(SIGUSR1, Debug ? debug_switch : SIG_IGN);
|
|
+ (void) resignal(SIGCHLD, reapchild);
|
|
+ (void) resignal(SIGUSR1, Debug ? debug_switch : SIG_IGN);
|
|
(void) signal(SIGXFSZ, SIG_IGN);
|
|
+ (void) resignal(SIGALRM, domark); /* Make recvfrom() be able to receive EINTR */
|
|
(void) alarm(TIMERINTVL);
|
|
|
|
/* Create a partial message table for all file descriptors. */
|
|
@@ -1161,6 +1165,7 @@ int main(argc, argv)
|
|
|
|
dprintf("Starting.\n");
|
|
init();
|
|
+ (void) resignal(SIGHUP, sighup_handler);
|
|
#ifndef TESTING
|
|
if ( Debug )
|
|
{
|
|
@@ -1232,9 +1237,14 @@ int main(argc, argv)
|
|
(fd_set *) NULL, (struct timeval *) NULL);
|
|
if ( restart )
|
|
{
|
|
+ sigset_t blockhup;
|
|
+ sigemptyset(&blockhup);
|
|
+ sigaddset (&blockhup, SIGHUP);
|
|
+ (void) sigprocmask(SIG_BLOCK, &blockhup, NULL);
|
|
restart = 0;
|
|
dprintf("\nReceived SIGHUP, reloading syslogd.\n");
|
|
init();
|
|
+ (void) sigprocmask (SIG_UNBLOCK, &blockhup, NULL);
|
|
continue;
|
|
}
|
|
if (nfds == 0) {
|
|
@@ -1756,7 +1766,8 @@ void logmsg(pri, msg, from, flags)
|
|
int msglen;
|
|
char *timestamp;
|
|
#ifdef __gnu_linux__
|
|
- sigset_t mask;
|
|
+ sigset_t mask, omask;
|
|
+ int lognum;
|
|
#else
|
|
#ifndef SYSV
|
|
sigset_t omask;
|
|
@@ -1771,7 +1782,7 @@ void logmsg(pri, msg, from, flags)
|
|
sigemptyset(&mask);
|
|
sigaddset(&mask, SIGHUP);
|
|
sigaddset(&mask, SIGALRM);
|
|
- sigprocmask(SIG_BLOCK, &mask, NULL);
|
|
+ sigprocmask(SIG_BLOCK, &mask, &omask);
|
|
#else
|
|
#ifndef SYSV
|
|
omask = sigblock(sigmask(SIGHUP)|sigmask(SIGALRM));
|
|
@@ -1815,7 +1826,7 @@ void logmsg(pri, msg, from, flags)
|
|
f->f_file = -1;
|
|
}
|
|
#ifdef __gnu_linux__
|
|
- sigprocmask(SIG_UNBLOCK, &mask, NULL);
|
|
+ sigprocmask(SIG_SETMASK, &omask, NULL);
|
|
#else
|
|
#ifndef SYSV
|
|
(void) sigsetmask(omask);
|
|
@@ -1884,7 +1895,7 @@ void logmsg(pri, msg, from, flags)
|
|
}
|
|
}
|
|
#ifdef __gnu_linux__
|
|
- sigprocmask(SIG_UNBLOCK, &mask, NULL);
|
|
+ sigprocmask(SIG_SETMASK, &omask, NULL);
|
|
#else
|
|
#ifndef SYSV
|
|
(void) sigsetmask(omask);
|
|
@@ -2213,10 +2224,6 @@ void wallmsg(f, iov)
|
|
if (fork() == 0) {
|
|
(void) signal(SIGTERM, SIG_DFL);
|
|
(void) alarm(0);
|
|
-#ifndef SYSV
|
|
- (void) signal(SIGTTOU, SIG_IGN);
|
|
- (void) sigsetmask(0);
|
|
-#endif
|
|
(void) snprintf(greetings, sizeof(greetings),
|
|
"\r\n\7Message from syslogd@%s at %.24s ...\r\n",
|
|
(char *) iov[2].iov_base, ctime(&now));
|
|
@@ -2281,19 +2288,32 @@ void wallmsg(f, iov)
|
|
reenter = 0;
|
|
}
|
|
|
|
+static sighandler_t resignal(int signum, sighandler_t handler)
|
|
+{
|
|
+ struct sigaction nact, oact;
|
|
+ sigset_t sigset;
|
|
+
|
|
+ nact.sa_handler = handler;
|
|
+ sigemptyset (&nact.sa_mask);
|
|
+
|
|
+ do {
|
|
+ if (sigaction(signum, &nact, &oact) == 0)
|
|
+ break;
|
|
+ } while (errno == EINTR);
|
|
+
|
|
+ sigemptyset(&sigset);
|
|
+ sigaddset(&sigset, signum);
|
|
+
|
|
+ sigprocmask(SIG_UNBLOCK, &sigset, NULL);
|
|
+
|
|
+ return oact.sa_handler;
|
|
+}
|
|
+
|
|
void reapchild()
|
|
{
|
|
int saved_errno = errno;
|
|
-#if defined(SYSV) && !defined(linux)
|
|
- (void) signal(SIGCHLD, reapchild); /* reset signal handler -ASP */
|
|
- wait ((int *)0);
|
|
-#else
|
|
while (waitpid(-1, (int*)0, WNOHANG|WUNTRACED) > 0)
|
|
;
|
|
-#endif
|
|
-#ifdef linux
|
|
- (void) signal(SIGCHLD, reapchild); /* reset signal handler -ASP */
|
|
-#endif
|
|
errno = saved_errno;
|
|
}
|
|
|
|
@@ -2403,6 +2423,7 @@ void domark()
|
|
#ifdef SYSV
|
|
for (lognum = 0; lognum <= nlogs; lognum++) {
|
|
f = &Files[lognum];
|
|
+ }
|
|
#else
|
|
for (f = Files; f; f = f->f_next) {
|
|
#endif
|
|
@@ -2414,8 +2435,6 @@ void domark()
|
|
BACKOFF(f);
|
|
}
|
|
}
|
|
- }
|
|
- (void) signal(SIGALRM, domark);
|
|
(void) alarm(TIMERINTVL);
|
|
}
|
|
|
|
@@ -2424,7 +2443,6 @@ void debug_switch()
|
|
{
|
|
dprintf("Switching debugging_on to %s\n", (debugging_on == 0) ? "true" : "false");
|
|
debugging_on = (debugging_on == 0) ? 1 : 0;
|
|
- signal(SIGUSR1, debug_switch);
|
|
}
|
|
|
|
|
|
@@ -2774,7 +2792,6 @@ void init()
|
|
logmsg(LOG_SYSLOG|LOG_INFO, "syslogd " VERSION "." PATCHLEVEL \
|
|
": restart." , LocalHostName, ADDDATE);
|
|
#endif
|
|
- (void) signal(SIGHUP, sighup_handler);
|
|
dprintf("syslogd: restarted.\n");
|
|
}
|
|
#if FALSE
|
|
@@ -3175,7 +3192,6 @@ static void allocate_log(void)
|
|
void sighup_handler(int sig)
|
|
{
|
|
restart = 1;
|
|
- signal(SIGHUP, sighup_handler);
|
|
return;
|
|
}
|
|
|