From: Simon Peeters Date: Wed, 8 Aug 2012 00:04:40 +0000 (+0200) Subject: move bus_method_call_with_reply() to dbus-common X-Git-Tag: v188~6^2~3 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=c67de56f50b83ec0d34308a6de80f6c65879b1b5 move bus_method_call_with_reply() to dbus-common --- diff --git a/src/shared/dbus-common.c b/src/shared/dbus-common.c index 5d64568c3..7f0dce5ad 100644 --- a/src/shared/dbus-common.c +++ b/src/shared/dbus-common.c @@ -1237,3 +1237,76 @@ finish: return (pid_t) pid; } + +bool bus_error_is_no_service(const DBusError *error) { + assert(error); + + if (!dbus_error_is_set(error)) + return false; + + if (dbus_error_has_name(error, DBUS_ERROR_NAME_HAS_NO_OWNER)) + return true; + + if (dbus_error_has_name(error, DBUS_ERROR_SERVICE_UNKNOWN)) + return true; + + return startswith(error->name, "org.freedesktop.DBus.Error.Spawn."); +} + +int bus_method_call_with_reply(DBusConnection *bus, + const char *destination, + const char *path, + const char *interface, + const char *method, + DBusMessage **return_reply, + DBusError *return_error, + int first_arg_type, ...) { + DBusError error; + DBusMessage *m, *reply; + va_list ap; + int r = 0; + + dbus_error_init(&error); + assert(bus); + + m = dbus_message_new_method_call(destination, path, interface, method); + if (!m) { + r = log_oom(); + goto finish; + } + + va_start(ap, first_arg_type); + if (!dbus_message_append_args_valist(m, first_arg_type, ap)) { + va_end(ap); + dbus_message_unref(m); + r = log_oom(); + goto finish; + } + va_end(ap); + + reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); + dbus_message_unref(m); + if (!reply) { + log_error("Failed to issue method call: %s", bus_error_message(&error)); + if (bus_error_is_no_service(&error)) + r = -ENOENT; + else if (dbus_error_has_name(&error, DBUS_ERROR_ACCESS_DENIED)) + r = -EACCES; + else if (dbus_error_has_name(&error, DBUS_ERROR_NO_REPLY)) + r = -ETIMEDOUT; + else + r = -EIO; + goto finish; + } + if (return_reply) + *return_reply = reply; + else + dbus_message_unref(reply); +finish: + if(return_error) + *return_error=error; + else + dbus_error_free(&error); + + return r; +} diff --git a/src/shared/dbus-common.h b/src/shared/dbus-common.h index a6703a78d..e49c3b525 100644 --- a/src/shared/dbus-common.h +++ b/src/shared/dbus-common.h @@ -203,3 +203,13 @@ void bus_async_unregister_and_exit(DBusConnection *bus, const char *name); DBusHandlerResult bus_exit_idle_filter(DBusConnection *bus, DBusMessage *m, void *userdata); pid_t bus_get_unix_process_id(DBusConnection *connection, const char *name, DBusError *error); + +bool bus_error_is_no_service(const DBusError *error); +int bus_method_call_with_reply(DBusConnection *bus, + const char *destination, + const char *path, + const char *interface, + const char *method, + DBusMessage **return_reply, + DBusError *return_error, + int first_arg_type, ...); diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 1c06507e4..2e0aaaa9f 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -202,21 +202,6 @@ static const char *ansi_highlight_green(bool b) { return b ? ANSI_HIGHLIGHT_GREEN_ON : ANSI_HIGHLIGHT_OFF; } -static bool error_is_no_service(const DBusError *error) { - assert(error); - - if (!dbus_error_is_set(error)) - return false; - - if (dbus_error_has_name(error, DBUS_ERROR_NAME_HAS_NO_OWNER)) - return true; - - if (dbus_error_has_name(error, DBUS_ERROR_SERVICE_UNKNOWN)) - return true; - - return startswith(error->name, "org.freedesktop.DBus.Error.Spawn."); -} - static int translate_bus_error_to_exit_status(int r, const DBusError *error) { assert(error); @@ -245,64 +230,6 @@ static int translate_bus_error_to_exit_status(int r, const DBusError *error) { return EXIT_FAILURE; } -static int bus_method_call_with_reply(DBusConnection *bus, - const char *destination, - const char *path, - const char *interface, - const char *method, - DBusMessage **return_reply, - DBusError *return_error, - int first_arg_type, ...) { - DBusError error; - DBusMessage *m, *reply; - va_list ap; - int r = 0; - - dbus_error_init(&error); - assert(bus); - - m = dbus_message_new_method_call(destination, path, interface, method); - if (!m) { - r = log_oom(); - goto finish; - } - - va_start(ap, first_arg_type); - if (!dbus_message_append_args_valist(m, first_arg_type, ap)) { - va_end(ap); - dbus_message_unref(m); - r = log_oom(); - goto finish; - } - va_end(ap); - - reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); - dbus_message_unref(m); - if (!reply) { - log_error("Failed to issue method call: %s", bus_error_message(&error)); - if (error_is_no_service(&error)) - r = -ENOENT; - else if (dbus_error_has_name(&error, DBUS_ERROR_ACCESS_DENIED)) - r = -EACCES; - else if (dbus_error_has_name(&error, DBUS_ERROR_NO_REPLY)) - r = -ETIMEDOUT; - else - r = -EIO; - goto finish; - } - if (return_reply) - *return_reply = reply; - else - dbus_message_unref(reply); -finish: - if(return_error) - *return_error=error; - else - dbus_error_free(&error); - - return r; -} - static void warn_wall(enum action a) { static const char *table[_ACTION_MAX] = { [ACTION_HALT] = "The system is going down for system halt NOW!", @@ -4826,7 +4753,7 @@ static int talk_upstart(void) { if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) { - if (error_is_no_service(&error)) { + if (bus_error_is_no_service(&error)) { r = -EADDRNOTAVAIL; goto finish; }