summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-sysdeps.c
diff options
context:
space:
mode:
Diffstat (limited to 'dbus/dbus-sysdeps.c')
-rw-r--r--dbus/dbus-sysdeps.c52
1 files changed, 32 insertions, 20 deletions
diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c
index 5011f224..8e2a9071 100644
--- a/dbus/dbus-sysdeps.c
+++ b/dbus/dbus-sysdeps.c
@@ -76,6 +76,12 @@
void
_dbus_abort (void)
{
+#ifdef DBUS_ENABLE_VERBOSE_MODE
+ const char *s;
+ s = _dbus_getenv ("DBUS_PRINT_BACKTRACE");
+ if (s && *s)
+ _dbus_print_backtrace ();
+#endif
abort ();
_exit (1); /* in case someone manages to ignore SIGABRT */
}
@@ -3109,7 +3115,11 @@ _dbus_become_daemon (const DBusString *pidfile,
{
const char *s;
pid_t child_pid;
+ int dev_null_fd;
+
+ _dbus_verbose ("Becoming a daemon...\n");
+ _dbus_verbose ("chdir to /\n");
if (chdir ("/") < 0)
{
dbus_set_error (error, DBUS_ERROR_FAILED,
@@ -3117,59 +3127,61 @@ _dbus_become_daemon (const DBusString *pidfile,
return FALSE;
}
+ _dbus_verbose ("forking...\n");
switch ((child_pid = fork ()))
{
case -1:
+ _dbus_verbose ("fork failed\n");
dbus_set_error (error, _dbus_error_from_errno (errno),
"Failed to fork daemon: %s", _dbus_strerror (errno));
return FALSE;
break;
case 0:
+ _dbus_verbose ("in child, closing std file descriptors\n");
-
- s = _dbus_getenv ("DBUS_DEBUG_DAEMONIZE");
- if (s != NULL)
- kill (_dbus_getpid (), SIGSTOP);
+ /* silently ignore failures here, if someone
+ * doesn't have /dev/null we may as well try
+ * to continue anyhow
+ */
- s = _dbus_getenv ("DBUS_DEBUG_OUTPUT");
- if (s == NULL || *s == '\0')
+ dev_null_fd = open ("/dev/null", O_RDWR);
+ if (dev_null_fd >= 0)
{
- int dev_null_fd;
-
- /* silently ignore failures here, if someone
- * doesn't have /dev/null we may as well try
- * to continue anyhow
- */
-
- dev_null_fd = open ("/dev/null", O_RDWR);
- if (dev_null_fd >= 0)
- {
- dup2 (dev_null_fd, 0);
- dup2 (dev_null_fd, 1);
- dup2 (dev_null_fd, 2);
- }
+ dup2 (dev_null_fd, 0);
+ dup2 (dev_null_fd, 1);
+
+ s = _dbus_getenv ("DBUS_DEBUG_OUTPUT");
+ if (s == NULL || *s == '\0')
+ dup2 (dev_null_fd, 2);
+ else
+ _dbus_verbose ("keeping stderr open due to DBUS_DEBUG_OUTPUT\n");
}
/* Get a predictable umask */
+ _dbus_verbose ("setting umask\n");
umask (022);
break;
default:
if (pidfile)
{
+ _dbus_verbose ("parent writing pid file\n");
if (!_dbus_write_pid_file (pidfile,
child_pid,
error))
{
+ _dbus_verbose ("pid file write failed, killing child\n");
kill (child_pid, SIGTERM);
return FALSE;
}
}
+ _dbus_verbose ("parent exiting\n");
_exit (0);
break;
}
+ _dbus_verbose ("calling setsid()\n");
if (setsid () == -1)
_dbus_assert_not_reached ("setsid() failed");