summaryrefslogtreecommitdiffstats
path: root/src/Daemon/Daemon.cpp
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-07-15 15:12:16 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-07-15 15:12:16 +0200
commit3431b2cee2ad71c0046bcef239ddd30539c202ae (patch)
tree85eb6f41b1104ab7cc188f3edd9a03ec38df8ce4 /src/Daemon/Daemon.cpp
parent916a86b4c0bd1297bdb2b98f12927d82910097f8 (diff)
downloadabrt-3431b2cee2ad71c0046bcef239ddd30539c202ae.tar.gz
abrt-3431b2cee2ad71c0046bcef239ddd30539c202ae.tar.xz
abrt-3431b2cee2ad71c0046bcef239ddd30539c202ae.zip
Restore /proc/sys/kernel/core_pattern on error exit.
The bug was observed when dbus-abrt.conf is missing. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'src/Daemon/Daemon.cpp')
-rw-r--r--src/Daemon/Daemon.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/Daemon/Daemon.cpp b/src/Daemon/Daemon.cpp
index 94f5e66..ea769c5 100644
--- a/src/Daemon/Daemon.cpp
+++ b/src/Daemon/Daemon.cpp
@@ -21,6 +21,9 @@
#include "ABRTException.h"
#include <iostream>
#include <cstdio>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
CCrashWatcher *g_pCrashWatcher = NULL;
@@ -54,7 +57,15 @@ int main(int argc, char** argv)
}
if(daemonize)
{
- // forking to background
+ /* Open stdin to /dev/null. We do it before forking
+ * in order to emit useful exitcode to the parent
+ * if open fails */
+ close(STDIN_FILENO);
+ if (open("/dev/null", O_RDWR))
+ {
+ throw CABRTException(EXCEP_FATAL, "Can't open /dev/null");
+ }
+ /* forking to background */
pid_t pid = fork();
if (pid < 0)
{
@@ -68,9 +79,12 @@ int main(int argc, char** argv)
{
throw CABRTException(EXCEP_FATAL, "CCrashWatcher::Daemonize(): setsid failed");
}
- close(STDIN_FILENO);
+ /* We must not leave fds 0,1,2 closed.
+ * Otherwise fprintf(stderr) dumps messages into random fds, etc. */
close(STDOUT_FILENO);
close(STDERR_FILENO);
+ dup(0);
+ dup(0);
}
g_pCrashWatcher = new CCrashWatcher(DEBUG_DUMPS_DIR);
g_pCrashWatcher->Run();
@@ -83,5 +97,7 @@ int main(int argc, char** argv)
{
std::cerr << "Cannot create daemon: " << e.what() << std::endl;
}
+ //do we need this? delete g_pCrashWatcher;
+ return 1; /* Any exit is a failure. Normally we don't exit at all */
}