diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | dbus/dbus-spawn.c | 25 | ||||
-rw-r--r-- | dbus/dbus-spawn.h | 2 |
3 files changed, 38 insertions, 0 deletions
@@ -1,5 +1,16 @@ 2007-07-24 Richard Hughes <richard@hughsie.com> + * dbus/dbus-spawn.c: (read_data), + (_dbus_babysitter_get_child_exit_status): + * dbus/dbus-spawn.h: + Add a function so we can get access to the exit status of the launch + helper. + By providing the return code and not the error we can leave the + 'what does this mean?' to the bus launch code and not include it in the + dbus directory. + +2007-07-24 Richard Hughes <richard@hughsie.com> + * bus/activation-exit-codes.h: Add defines which specify the output codes of the launch helper. We have to use exit codes as this is the only way we can return failure diff --git a/dbus/dbus-spawn.c b/dbus/dbus-spawn.c index 15e3dec3..125aea7c 100644 --- a/dbus/dbus-spawn.c +++ b/dbus/dbus-spawn.c @@ -417,6 +417,7 @@ read_data (DBusBabysitter *sitter, { sitter->have_child_status = TRUE; sitter->status = arg; + sitter->errnum = WEXITSTATUS (sitter->status); _dbus_verbose ("recorded child status exited = %d signaled = %d exitstatus = %d termsig = %d\n", WIFEXITED (sitter->status), WIFSIGNALED (sitter->status), WEXITSTATUS (sitter->status), WTERMSIG (sitter->status)); @@ -623,6 +624,30 @@ _dbus_babysitter_get_child_exited (DBusBabysitter *sitter) } /** + * Gets the exit status of the child. We do this so implimentation specific + * detail is not cluttering up dbus, for example the system laucher code. + * + * @param sitter the babysitter + * @param status the returned status code + * @returns #FALSE on failure + */ +dbus_bool_t +_dbus_babysitter_get_child_exit_status (DBusBabysitter *sitter, int *status) +{ + if (!_dbus_babysitter_get_child_exited (sitter)) + _dbus_assert_not_reached ("Child has not exited"); + + if (sitter->errnum != WEXITSTATUS (sitter->status)) + _dbus_assert_not_reached ("Status is not exit!"); + + if (!sitter->have_child_status) + _dbus_assert_not_reached ("Not a child!"); + + *status = sitter->status; + return TRUE; +} + +/** * Sets the #DBusError with an explanation of why the spawned * child process exited (on a signal, or whatever). If * the child process has not exited, does nothing (error diff --git a/dbus/dbus-spawn.h b/dbus/dbus-spawn.h index 0eed6bab..7d8a67a7 100644 --- a/dbus/dbus-spawn.h +++ b/dbus/dbus-spawn.h @@ -47,6 +47,8 @@ void _dbus_babysitter_kill_child (DBusBabysitter *si dbus_bool_t _dbus_babysitter_get_child_exited (DBusBabysitter *sitter); void _dbus_babysitter_set_child_exit_error (DBusBabysitter *sitter, DBusError *error); +dbus_bool_t _dbus_babysitter_get_child_exit_status (DBusBabysitter *sitter, + int *status); dbus_bool_t _dbus_babysitter_set_watch_functions (DBusBabysitter *sitter, DBusAddWatchFunction add_function, DBusRemoveWatchFunction remove_function, |