syslogd/sysklogd-1.4.1-reload.dif

198 lines
5.0 KiB
Plaintext
Raw Normal View History

---
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;
}