summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2013-03-15 14:33:23 +0100
committerRainer Gerhards <rgerhards@adiscon.com>2013-03-15 14:33:23 +0100
commit0114b531b38b16db98b04b680017d6c758987fd9 (patch)
treeae9f5313efb1aa0c27415efb6d88709249ec5f5c
parent6345e959d96bd9a3cbeeaea7f99572c33bea3054 (diff)
downloadrsyslog-0114b531b38b16db98b04b680017d6c758987fd9.tar.gz
rsyslog-0114b531b38b16db98b04b680017d6c758987fd9.tar.bz2
rsyslog-0114b531b38b16db98b04b680017d6c758987fd9.zip
debug system improvement & bug fix for init system status (see below)
- rsyslogd startup information is now properly conveyed back to init when privileges are beging dropped Actually, we have moved termination of the parent in front of the priv drop. So it shall work now in all cases. See code comments in commit for more details. - If forking, the parent now waits for a maximum of 60 seconds for termination by the child - improved debugging support in forked (auto-backgrounding) mode The rsyslog debug log file is now continued to be written across the fork.
-rw-r--r--ChangeLog10
-rw-r--r--runtime/debug.c9
-rw-r--r--runtime/debug.h1
-rw-r--r--tools/syslogd.c48
4 files changed, 48 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index c41a89c0..b143ae81 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,16 @@ Version 7.2.7 [v7-stable] 2013-03-??
config directives.
- doc bugfix: rsyslog.conf man page had invalid file format info
closes: http://bugzilla.adiscon.com/show_bug.cgi?id=418
+- rsyslogd startup information is now properly conveyed back to init
+ when privileges are beging dropped
+ Actually, we have moved termination of the parent in front of the
+ priv drop. So it shall work now in all cases. See code comments in
+ commit for more details.
+- If forking, the parent now waits for a maximum of 60 seconds for
+ termination by the child
+- improved debugging support in forked (auto-backgrounding) mode
+ The rsyslog debug log file is now continued to be written across the
+ fork.
----------------------------------------------------------------------------
Version 7.2.6 [v7-stable] 2013-03-05
- slightly improved config parser error messages when invalid escapes happen
diff --git a/runtime/debug.c b/runtime/debug.c
index 1d306dbd..26da31b4 100644
--- a/runtime/debug.c
+++ b/runtime/debug.c
@@ -1296,6 +1296,15 @@ dbgmalloc(size_t size)
}
+/* report fd used for debug log. This is needed in case of
+ * auto-backgrounding, where the debug log shall not be closed.
+ */
+int
+dbgGetDbglogFd(void)
+{
+ return altdbg;
+}
+
/* read in the runtime options
* rgerhards, 2008-02-28
*/
diff --git a/runtime/debug.h b/runtime/debug.h
index 5bd26bd8..e6971f82 100644
--- a/runtime/debug.h
+++ b/runtime/debug.h
@@ -104,6 +104,7 @@ void dbgSetExecLocation(int iStackPtr, int line);
void dbgSetThrdName(uchar *pszName);
void dbgPrintAllDebugInfo(void);
void *dbgmalloc(size_t size);
+int dbgGetDbglogFd(void);
/* macros */
#ifdef DEBUGLESS
diff --git a/tools/syslogd.c b/tools/syslogd.c
index 62c18e72..0d7aac6c 100644
--- a/tools/syslogd.c
+++ b/tools/syslogd.c
@@ -224,7 +224,7 @@ struct queuefilenames_s {
int MarkInterval = 20 * 60; /* interval between marks in seconds - read-only after startup */
int send_to_all = 0; /* send message to all IPv4/IPv6 addresses */
-static int NoFork = 0; /* don't fork - don't run in daemon mode - read-only after startup */
+static int doFork = 1; /* fork - run in daemon mode - read-only after startup */
int bHaveMainQueue = 0;/* set to 1 if the main queue - in queueing mode - is available
* If the main queue is either not yet ready or not running in
* queueing mode (mode DIRECT!), then this is set to 0.
@@ -473,7 +473,7 @@ logmsgInternal(int iErr, int pri, uchar *msg, int flags)
* permits us to process unmodified config files which otherwise contain a
* supressor statement.
*/
- if(((Debug == DEBUG_FULL || NoFork) && ourConf->globals.bErrMsgToStderr) || iConfigVerify) {
+ if(((Debug == DEBUG_FULL || !doFork) && ourConf->globals.bErrMsgToStderr) || iConfigVerify) {
if(LOG_PRI(pri) == LOG_ERR)
fprintf(stderr, "rsyslogd: %s\n", msg);
}
@@ -652,7 +652,6 @@ finalize_it:
rsRetVal
multiSubmitMsg(multi_submit_t *pMultiSub)
{
- int i;
qqueue_t *pQueue;
ruleset_t *pRuleset;
DEFiRet;
@@ -1693,8 +1692,7 @@ doGlblProcessInit(void)
thrdInit();
- if( !(Debug == DEBUG_FULL || NoFork) )
- {
+ if(doFork) {
DBGPRINTF("Checking pidfile '%s'.\n", PidFile);
if (!check_pid(PidFile))
{
@@ -1706,16 +1704,23 @@ doGlblProcessInit(void)
/* stop writing debug messages to stdout (if debugging is on) */
stddbg = -1;
+ dbgprintf("ready for forking\n");
if (fork()) {
/* Parent process
*/
- sleep(300);
- /* Not reached unless something major went wrong. 5
- * minutes should be a fair amount of time to wait.
- * Please note that this procedure is important since
- * the father must not exit before syslogd isn't
- * initialized or the klogd won't be able to flush its
- * logs. -Joey
+ dbgprintf("parent process going to sleep for 60 secs\n");
+ sleep(60);
+ /* Not reached unless something major went wrong. 1
+ * minute should be a fair amount of time to wait.
+ * The parent should not exit before rsyslogd is
+ * properly initilized (at least almost) or the init
+ * system may get a wrong impression of our readyness.
+ * Note that we exit before being completely initialized,
+ * but at this point it is very, very unlikely that something
+ * bad can happen. We do this here, because otherwise we would
+ * need to have much more code to handle priv drop (which we
+ * don't consider worth for the init system, especially as it
+ * is going away on the majority of distros).
*/
exit(1); /* "good" exit - after forking, not diasabling anything */
}
@@ -1724,6 +1729,7 @@ doGlblProcessInit(void)
close(0);
/* we keep stdout and stderr open in case we have to emit something */
i = 3;
+ dbgprintf("in child, finalizing initialization\n");
/* if (sd_booted()) */ {
const char *e;
@@ -1757,7 +1763,8 @@ doGlblProcessInit(void)
i = SD_LISTEN_FDS_START + sd_fds;
}
for ( ; i < num_fds; i++)
- (void) close(i);
+ if(i != dbgGetDbglogFd())
+ close(i);
untty();
} else {
@@ -1968,7 +1975,7 @@ int realMain(int argc, char **argv)
fprintf(stderr, "rsyslogd: error -m is no longer supported - use immark instead");
break;
case 'n': /* don't fork */
- NoFork = 1;
+ doFork = 0;
break;
case 'N': /* enable config verify mode */
iConfigVerify = atoi(arg);
@@ -2066,17 +2073,18 @@ int realMain(int argc, char **argv)
if(!iConfigVerify)
CHKiRet(doGlblProcessInit());
+ /* Send a signal to the parent so it can terminate. */
+ if(myPid != ppid) {
+ dbgprintf("signaling parent to terminate\n");
+ kill(ppid, SIGTERM);
+ }
+
CHKiRet(init());
if(Debug && debugging_on) {
dbgprintf("Debugging enabled, SIGUSR1 to turn off debugging.\n");
}
- /* Send a signal to the parent so it can terminate. */
- if(myPid != ppid)
- kill(ppid, SIGTERM);
-
-
/* END OF INTIALIZATION */
DBGPRINTF("initialization completed, transitioning to regular run mode\n");
@@ -2087,7 +2095,7 @@ int realMain(int argc, char **argv)
* is still in its infancy (and not really done), we currently accept this issue.
* rgerhards, 2009-06-29
*/
- if(!(Debug == DEBUG_FULL || NoFork)) {
+ if(!doFork) {
close(1);
close(2);
ourConf->globals.bErrMsgToStderr = 0;