diff --git a/ChangeLog b/ChangeLog index 9f0d9bbb..8c9a48b9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2007-07-24 Richard Hughes + + * 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 * bus/activation-exit-codes.h: 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)); @@ -622,6 +623,30 @@ _dbus_babysitter_get_child_exited (DBusBabysitter *sitter) return sitter->socket_to_babysitter < 0; } +/** + * 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 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,