move bus_method_call_with_reply() to dbus-common

This commit is contained in:
Simon Peeters 2012-08-08 02:04:40 +02:00
parent f22f08cd5f
commit c67de56f50
3 changed files with 84 additions and 74 deletions

View File

@ -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;
}

View File

@ -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, ...);

View File

@ -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;
}