summaryrefslogtreecommitdiffstats
path: root/dbus
diff options
context:
space:
mode:
authorThiago Macieira <thiago@kde.org>2007-03-03 10:38:20 +0000
committerThiago Macieira <thiago@kde.org>2007-03-03 10:38:20 +0000
commit01dead5cdfe6777d27686d0a5e19fe776fefb64a (patch)
tree8f76658b95cf83e4da5b977848cb3dbc822b34ef /dbus
parent4ffb5d26ea400c123b0c5523952cb61a5439f132 (diff)
Backport from MAIN:
* dbus/dbus-sysdeps-unix.c: capture the dbus-launch stderr output and add it to the DBusError message we return. * tools/dbus-launch.1: * tools/dbus-launch.c: Add option --close-stderr to, well, close stderr before starting dbus-daemon. I hope adding an option to dbus-launch in the 1.0.x series was ok.
Diffstat (limited to 'dbus')
-rw-r--r--dbus/dbus-sysdeps-unix.c47
1 files changed, 44 insertions, 3 deletions
diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c
index f4afad89..7573e49f 100644
--- a/dbus/dbus-sysdeps-unix.c
+++ b/dbus/dbus-sysdeps-unix.c
@@ -2369,8 +2369,9 @@ dbus_bool_t
_dbus_get_autolaunch_address (DBusString *address,
DBusError *error)
{
- static char *argv[5];
- int address_pipe[2];
+ static char *argv[6];
+ int address_pipe[2] = { -1, -1 };
+ int errors_pipe[2] = { -1, -1 };
pid_t pid;
int ret;
int status;
@@ -2399,6 +2400,8 @@ _dbus_get_autolaunch_address (DBusString *address,
++i;
argv[i] = "--binary-syntax";
++i;
+ argv[i] = "--close-stderr";
+ ++i;
argv[i] = NULL;
++i;
@@ -2417,6 +2420,15 @@ _dbus_get_autolaunch_address (DBusString *address,
_dbus_strerror (errno));
goto out;
}
+ if (pipe (errors_pipe) < 0)
+ {
+ dbus_set_error (error, _dbus_error_from_errno (errno),
+ "Failed to create a pipe: %s",
+ _dbus_strerror (errno));
+ _dbus_verbose ("Failed to create a pipe to call dbus-launch: %s\n",
+ _dbus_strerror (errno));
+ goto out;
+ }
pid = fork ();
if (pid < 0)
@@ -2439,6 +2451,7 @@ _dbus_get_autolaunch_address (DBusString *address,
/* set-up stdXXX */
close (address_pipe[READ_END]);
+ close (errors_pipe[READ_END]);
close (0); /* close stdin */
close (1); /* close stdout */
close (2); /* close stderr */
@@ -2447,11 +2460,12 @@ _dbus_get_autolaunch_address (DBusString *address,
_exit (1);
if (dup2 (address_pipe[WRITE_END], 1) == -1)
_exit (1);
- if (dup2 (fd, 2) == -1)
+ if (dup2 (errors_pipe[WRITE_END], 2) == -1)
_exit (1);
close (fd);
close (address_pipe[WRITE_END]);
+ close (errors_pipe[WRITE_END]);
execv (DBUS_BINDIR "/dbus-launch", argv);
@@ -2464,6 +2478,10 @@ _dbus_get_autolaunch_address (DBusString *address,
/* parent process */
close (address_pipe[WRITE_END]);
+ close (errors_pipe[WRITE_END]);
+ address_pipe[WRITE_END] = -1;
+ errors_pipe[WRITE_END] = -1;
+
ret = 0;
do
{
@@ -2484,7 +2502,21 @@ _dbus_get_autolaunch_address (DBusString *address,
_dbus_string_get_length (address) == orig_len)
{
/* The process ended with error */
+ DBusString error_message;
+ _dbus_string_init (&error_message);
+ ret = 0;
+ do
+ {
+ ret = _dbus_read (errors_pipe[READ_END], &error_message, 1024);
+ }
+ while (ret > 0);
+
_dbus_string_set_length (address, orig_len);
+ if (_dbus_string_get_length (&error_message) > 0)
+ dbus_set_error (error, DBUS_ERROR_SPAWN_EXEC_FAILED,
+ "dbus-launch failed to autolaunch D-Bus session: %s",
+ _dbus_string_get_data (&error_message));
+ else
dbus_set_error (error, DBUS_ERROR_SPAWN_EXEC_FAILED,
"Failed to execute dbus-launch to autolaunch D-Bus session");
goto out;
@@ -2498,6 +2530,15 @@ _dbus_get_autolaunch_address (DBusString *address,
else
_DBUS_ASSERT_ERROR_IS_SET (error);
+ if (address_pipe[0] != -1)
+ close (address_pipe[0]);
+ if (address_pipe[1] != -1)
+ close (address_pipe[1]);
+ if (errors_pipe[0] != -1)
+ close (errors_pipe[0]);
+ if (errors_pipe[1] != -1)
+ close (errors_pipe[1]);
+
_dbus_string_free (&uuid);
return retval;
}