sssd_dbus_request.c revision 3d5908ed0faf400a5c7d9c3e4312597ee1b7786a
d9577dbd92555b0755881e37724019ef9c578404Stef Walter/*
d9577dbd92555b0755881e37724019ef9c578404Stef Walter Authors:
d9577dbd92555b0755881e37724019ef9c578404Stef Walter Stef Walter <stefw@redhat.com>
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter Copyright (C) 2014 Red Hat
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter This program is free software; you can redistribute it and/or modify
d9577dbd92555b0755881e37724019ef9c578404Stef Walter it under the terms of the GNU General Public License as published by
d9577dbd92555b0755881e37724019ef9c578404Stef Walter the Free Software Foundation; either version 3 of the License, or
d9577dbd92555b0755881e37724019ef9c578404Stef Walter (at your option) any later version.
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter This program is distributed in the hope that it will be useful,
d9577dbd92555b0755881e37724019ef9c578404Stef Walter but WITHOUT ANY WARRANTY; without even the implied warranty of
d9577dbd92555b0755881e37724019ef9c578404Stef Walter MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d9577dbd92555b0755881e37724019ef9c578404Stef Walter GNU General Public License for more details.
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter You should have received a copy of the GNU General Public License
d9577dbd92555b0755881e37724019ef9c578404Stef Walter along with this program. If not, see <http://www.gnu.org/licenses/>.
d9577dbd92555b0755881e37724019ef9c578404Stef Walter*/
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter#include "util/util.h"
d9577dbd92555b0755881e37724019ef9c578404Stef Walter#include "sbus/sssd_dbus.h"
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter#include "sbus/sssd_dbus_private.h"
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter#include <sys/time.h>
d9577dbd92555b0755881e37724019ef9c578404Stef Walter#include <dbus/dbus.h>
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
8779b9ee101ed3e5a6836b5366c006dc21dd36c0Pavel Březina#define INTERNAL_ERROR "Internal Error"
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walterstatic int sbus_request_destructor(struct sbus_request *dbus_req)
d9577dbd92555b0755881e37724019ef9c578404Stef Walter{
d9577dbd92555b0755881e37724019ef9c578404Stef Walter dbus_message_unref(dbus_req->message);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter return 0;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter}
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walterstruct sbus_request *
d9577dbd92555b0755881e37724019ef9c578404Stef Waltersbus_new_request(struct sbus_connection *conn,
d9577dbd92555b0755881e37724019ef9c578404Stef Walter struct sbus_interface *intf,
d9577dbd92555b0755881e37724019ef9c578404Stef Walter DBusMessage *message)
d9577dbd92555b0755881e37724019ef9c578404Stef Walter{
d9577dbd92555b0755881e37724019ef9c578404Stef Walter struct sbus_request *dbus_req;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter dbus_req = talloc_zero(conn, struct sbus_request);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter if (!dbus_req) {
d9577dbd92555b0755881e37724019ef9c578404Stef Walter DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory allocating DBus request\n");
d9577dbd92555b0755881e37724019ef9c578404Stef Walter return NULL;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter }
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter dbus_req->intf = intf;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter dbus_req->conn = conn;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter dbus_req->message = dbus_message_ref(message);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter talloc_set_destructor(dbus_req, sbus_request_destructor);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter return dbus_req;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter}
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Waltervoid
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Waltersbus_request_invoke_or_finish(struct sbus_request *dbus_req,
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter sbus_msg_handler_fn handler_fn,
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter void *handler_data,
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter sbus_method_invoker_fn invoker_fn)
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter{
8779b9ee101ed3e5a6836b5366c006dc21dd36c0Pavel Březina DBusError error;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter int ret;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter if (invoker_fn) {
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter ret = invoker_fn(dbus_req, handler_fn);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter } else {
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter ret = handler_fn(dbus_req, handler_data);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter }
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter switch(ret) {
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter case EOK:
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter return;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter case ENOMEM:
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory handling DBus message\n");
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter sbus_request_finish(dbus_req, NULL);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter break;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter default:
8779b9ee101ed3e5a6836b5366c006dc21dd36c0Pavel Březina dbus_set_error_const(&error, DBUS_ERROR_FAILED, INTERNAL_ERROR);
8779b9ee101ed3e5a6836b5366c006dc21dd36c0Pavel Březina sbus_request_fail_and_finish(dbus_req, &error);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter break;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter }
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter}
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walterint sbus_request_finish(struct sbus_request *dbus_req,
d9577dbd92555b0755881e37724019ef9c578404Stef Walter DBusMessage *reply)
d9577dbd92555b0755881e37724019ef9c578404Stef Walter{
d9577dbd92555b0755881e37724019ef9c578404Stef Walter if (reply) {
d9577dbd92555b0755881e37724019ef9c578404Stef Walter sbus_conn_send_reply(dbus_req->conn, reply);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter }
d9577dbd92555b0755881e37724019ef9c578404Stef Walter return talloc_free(dbus_req);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter}
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walterint sbus_request_return_and_finish(struct sbus_request *dbus_req,
d9577dbd92555b0755881e37724019ef9c578404Stef Walter int first_arg_type,
d9577dbd92555b0755881e37724019ef9c578404Stef Walter ...)
d9577dbd92555b0755881e37724019ef9c578404Stef Walter{
d9577dbd92555b0755881e37724019ef9c578404Stef Walter DBusMessage *reply;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter dbus_bool_t dbret;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter va_list va;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter int ret;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter reply = dbus_message_new_method_return(dbus_req->message);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter if (!reply) {
d9577dbd92555b0755881e37724019ef9c578404Stef Walter DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory allocating DBus message\n");
d9577dbd92555b0755881e37724019ef9c578404Stef Walter sbus_request_finish(dbus_req, NULL);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter return ENOMEM;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter }
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter va_start(va, first_arg_type);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter dbret = dbus_message_append_args_valist(reply, first_arg_type, va);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter va_end(va);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter if (dbret) {
d9577dbd92555b0755881e37724019ef9c578404Stef Walter ret = sbus_request_finish(dbus_req, reply);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter } else {
d9577dbd92555b0755881e37724019ef9c578404Stef Walter DEBUG(SSSDBG_CRIT_FAILURE, "Couldn't build DBus message\n");
d9577dbd92555b0755881e37724019ef9c578404Stef Walter sbus_request_finish(dbus_req, NULL);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter ret = EINVAL;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter }
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter dbus_message_unref(reply);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter return ret;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter}
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walterint sbus_request_fail_and_finish(struct sbus_request *dbus_req,
d9577dbd92555b0755881e37724019ef9c578404Stef Walter const DBusError *error)
d9577dbd92555b0755881e37724019ef9c578404Stef Walter{
d9577dbd92555b0755881e37724019ef9c578404Stef Walter DBusMessage *reply;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter int ret;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter reply = dbus_message_new_error(dbus_req->message, error->name, error->message);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter if (!reply) {
d9577dbd92555b0755881e37724019ef9c578404Stef Walter DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory allocating DBus message\n");
d9577dbd92555b0755881e37724019ef9c578404Stef Walter sbus_request_finish(dbus_req, NULL);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter return ENOMEM;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter }
d9577dbd92555b0755881e37724019ef9c578404Stef Walter
d9577dbd92555b0755881e37724019ef9c578404Stef Walter ret = sbus_request_finish(dbus_req, reply);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter dbus_message_unref(reply);
d9577dbd92555b0755881e37724019ef9c578404Stef Walter return ret;
d9577dbd92555b0755881e37724019ef9c578404Stef Walter}
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walterstruct array_arg {
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter char **dbus_array;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter};
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walterstatic int array_arg_destructor(struct array_arg *arg)
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter{
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter dbus_free_string_array(arg->dbus_array);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter return 0;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter}
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walterstatic bool
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walterparent_dbus_string_arrays(struct sbus_request *request, int first_arg_type,
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter va_list va)
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter{
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter struct array_arg *array_arg;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter int arg_type;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter void **arg_ptr;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter /*
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter * Here we iterate through the entire thing again and look for
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter * things we need to fix allocation for. Normally certain types
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter * returned from dbus_message_get_args() and friends require
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter * later freeing. We tie those to the talloc context here.
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter *
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter * The list of argument has already been validated by the previous
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter * dbus_message_get_args() call, so we can be cheap.
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter */
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter arg_type = first_arg_type;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter while (arg_type != DBUS_TYPE_INVALID) {
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter if (arg_type == DBUS_TYPE_ARRAY) {
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter arg_type = va_arg(va, int); /* the array element type */
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter arg_ptr = va_arg(va, void **); /* the array elements */
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter va_arg(va, int *); /* the array length */
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter /* Arrays of these things need to be freed */
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter if (arg_type == DBUS_TYPE_STRING ||
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter arg_type == DBUS_TYPE_OBJECT_PATH ||
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter arg_type == DBUS_TYPE_SIGNATURE) {
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter array_arg = talloc_zero(request, struct array_arg);
3d5908ed0faf400a5c7d9c3e4312597ee1b7786aJakub Hrozek if (array_arg == NULL) {
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter /* no kidding ... */
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory while trying not to leak memory\n");
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter return false;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter }
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter array_arg->dbus_array = *arg_ptr;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter talloc_set_destructor(array_arg, array_arg_destructor);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter }
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter /* A non array argument */
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter } else {
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter arg_ptr = va_arg(va, void**);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter }
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter /* The next type */
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter arg_type = va_arg(va, int);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter }
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter return true;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter}
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walterbool
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Waltersbus_request_parse_or_finish(struct sbus_request *request,
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter int first_arg_type,
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter ...)
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter{
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter DBusError error = DBUS_ERROR_INIT;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter bool ret = true;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter va_list va2;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter va_list va;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter va_start(va, first_arg_type);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter va_copy(va2, va);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter if (dbus_message_get_args_valist(request->message, &error,
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter first_arg_type, va)) {
3d5908ed0faf400a5c7d9c3e4312597ee1b7786aJakub Hrozek ret = parent_dbus_string_arrays(request, first_arg_type, va2);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter } else {
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter /* Trying to send the error back to the caller in this case is a joke */
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter if (!dbus_error_is_set(&error) || dbus_error_has_name(&error, DBUS_ERROR_NO_MEMORY)) {
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory parsing DBus message\n");
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter sbus_request_finish(request, NULL);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter /* Log other errors and send them back, this include o.f.d.InvalidArgs */
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter } else {
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter DEBUG(SSSDBG_OP_FAILURE, "Couldn't parse DBus message %s.%s: %s\n",
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter dbus_message_get_interface(request->message),
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter dbus_message_get_member(request->message),
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter error.message);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter sbus_request_fail_and_finish(request, &error);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter }
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter dbus_error_free(&error);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter ret = false;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter }
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter va_end(va2);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter va_end(va);
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter return ret;
06b7bc8ca2e005ed510210d3b8dee16afbabbcc9Stef Walter}