From 2ad05d5ce45b05b399bcdfc5c04c95b1627c90f3 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Thu, 17 Jul 2003 01:53:42 +0000 Subject: 2003-07-16 Havoc Pennington * tools/dbus-launch.c (babysit): close stdout/stderr in the babysitter process, as suggested by Thomas Leonard, so an "eval `dbus-launch --exit-with-session`" will actually return --- ChangeLog | 7 +++++++ tools/dbus-launch.c | 23 ++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1876cfba..d405daed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2003-07-16 Havoc Pennington + + * tools/dbus-launch.c (babysit): close stdout/stderr in the + babysitter process, as suggested by Thomas Leonard, so + an "eval `dbus-launch --exit-with-session`" will actually + return + 2003-07-16 Havoc Pennington * configure.in: print out EXPANDED_* variables in the summary at diff --git a/tools/dbus-launch.c b/tools/dbus-launch.c index 4d21d105..3b429013 100644 --- a/tools/dbus-launch.c +++ b/tools/dbus-launch.c @@ -460,10 +460,11 @@ babysit (int exit_with_session, char buf[MAX_PID_LEN]; long val; char *end; + int dev_null_fd; /* We chdir ("/") since we are persistent and daemon-like, and fork * again so dbus-launch can reap the parent. However, we don't - * setsid() or close fd 0,1,2 because the idea is to remain attached + * setsid() or close fd 0 because the idea is to remain attached * to the tty and the X server in order to kill the message bus * when the session ends. */ @@ -473,8 +474,24 @@ babysit (int exit_with_session, fprintf (stderr, "Could not change to root directory: %s\n", strerror (errno)); exit (1); - } + } + /* Move stdout/stderr so we don't block an "eval" or otherwise + * lock up. + */ + dev_null_fd = open ("/dev/null", O_RDWR); + if (dev_null_fd >= 0) + { + dup2 (dev_null_fd, 1); + dup2 (dev_null_fd, 2); + } + else + { + fprintf (stderr, "Failed to open /dev/null: %s\n", + strerror (errno)); + /* continue, why not */ + } + ret = fork (); if (ret < 0) @@ -541,7 +558,7 @@ babysit (int exit_with_session, /* Write data to launcher */ write_pid (write_bus_pid_fd, bus_pid_to_kill); close (write_bus_pid_fd); - + if (exit_with_session) { /* Bus is now started and launcher has needed info; -- cgit