439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina/*
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina Authors:
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina Pavel Březina <pbrezina@redhat.com>
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina Copyright (C) 2016 Red Hat
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina This program is free software; you can redistribute it and/or modify
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina it under the terms of the GNU General Public License as published by
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina the Free Software Foundation; either version 3 of the License, or
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina (at your option) any later version.
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina This program is distributed in the hope that it will be useful,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina GNU General Public License for more details.
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina You should have received a copy of the GNU General Public License
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina*/
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina#include <talloc.h>
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina#include "sbus/sssd_dbus.h"
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina#include "util/util.h"
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březinastruct sbus_talloc_msg {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DBusMessage *msg;
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina dbus_int32_t data_slot;
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina bool in_talloc_destructor;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina};
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březinastatic int sbus_talloc_msg_destructor(struct sbus_talloc_msg *talloc_msg)
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina{
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina talloc_msg->in_talloc_destructor = true;
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (talloc_msg->msg == NULL) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return 0;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina /* There may exist more references to this message but this talloc
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina * context is no longer valid. We remove dbus message data to invoke
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina * dbus destructor now. */
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina dbus_message_set_data(talloc_msg->msg, talloc_msg->data_slot, NULL, NULL);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina dbus_message_unref(talloc_msg->msg);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return 0;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina}
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březinastatic void sbus_msg_data_destructor(void *ctx)
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina{
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina struct sbus_talloc_msg *talloc_msg;
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina talloc_msg = talloc_get_type(ctx, struct sbus_talloc_msg);
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina dbus_message_free_data_slot(&talloc_msg->data_slot);
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina if (!talloc_msg->in_talloc_destructor) {
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina /* References to this message dropped to zero but through
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina * dbus_message_unref(), not by calling talloc_free(). We need to free
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina * the talloc context and avoid running talloc desctuctor. */
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina talloc_set_destructor(talloc_msg, NULL);
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina talloc_free(talloc_msg);
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina }
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina}
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březinaerrno_t sbus_talloc_bound_message(TALLOC_CTX *mem_ctx, DBusMessage *msg)
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina{
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina struct sbus_talloc_msg *talloc_msg;
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina dbus_int32_t data_slot = -1;
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina DBusFreeFunction free_fn;
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina dbus_bool_t bret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina /* Create a talloc context that will unreference this message when
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina * the parent context is freed. */
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina talloc_msg = talloc(mem_ctx, struct sbus_talloc_msg);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (talloc_msg == NULL) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina "Unable to bound D-Bus message with talloc context!\n");
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return ENOMEM;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina /* Allocate a dbus message data slot that will contain point to the
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina * talloc context so we can pick up cases when the dbus message is
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina * freed through dbus api. */
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina bret = dbus_message_allocate_data_slot(&data_slot);
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina if (!bret) {
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to allocate data slot!\n");
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina talloc_free(talloc_msg);
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina return ENOMEM;
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina }
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina free_fn = sbus_msg_data_destructor;
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina bret = dbus_message_set_data(msg, data_slot, talloc_msg, free_fn);
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina if (!bret) {
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to set message data!\n");
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina talloc_free(talloc_msg);
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina dbus_message_free_data_slot(&data_slot);
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina return ENOMEM;
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina }
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina talloc_msg->msg = msg;
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina talloc_msg->data_slot = data_slot;
5d556f70f00c43864d8495d7caacfadf962799dfPavel Březina talloc_msg->in_talloc_destructor = false;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina talloc_set_destructor(talloc_msg, sbus_talloc_msg_destructor);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return EOK;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina}
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březinaerrno_t sbus_error_to_errno(DBusError *error)
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina{
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina static struct {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina const char *name;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina errno_t ret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina } list[] = { { SBUS_ERROR_INTERNAL, ERR_INTERNAL },
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina { SBUS_ERROR_NOT_FOUND, ENOENT },
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina { SBUS_ERROR_UNKNOWN_DOMAIN, ERR_DOMAIN_NOT_FOUND },
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina { SBUS_ERROR_DP_FATAL, ERR_TERMINATED },
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina { SBUS_ERROR_DP_OFFLINE, ERR_OFFLINE },
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina { SBUS_ERROR_DP_NOTSUP, ENOTSUP },
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina { NULL, ERR_INTERNAL } };
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina int i;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (!dbus_error_is_set(error)) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return EOK;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina for (i = 0; list[i].name != NULL; i++) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (dbus_error_has_name(error, list[i].name)) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return list[i].ret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return EIO;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina}
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březinaerrno_t sbus_check_reply(DBusMessage *reply)
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina{
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina dbus_bool_t bret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DBusError error;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina errno_t ret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina dbus_error_init(&error);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina switch (dbus_message_get_type(reply)) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina case DBUS_MESSAGE_TYPE_METHOD_RETURN:
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina ret = EOK;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina goto done;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina case DBUS_MESSAGE_TYPE_ERROR:
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina bret = dbus_set_error_from_message(&error, reply);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (bret == false) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to read error from message\n");
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina ret = EIO;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina goto done;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "D-Bus error [%s]: %s\n",
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina error.name, (error.message == NULL ? "(null)" : error.message));
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina ret = sbus_error_to_errno(&error);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina goto done;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina default:
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unexpected D-Bus message type?\n");
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina ret = ERR_INTERNAL;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina goto done;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březinadone:
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina dbus_error_free(&error);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return ret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina}
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel BřezinaDBusMessage *sbus_create_message_valist(TALLOC_CTX *mem_ctx,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina const char *bus,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina const char *path,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina const char *iface,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina const char *method,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina int first_arg_type,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina va_list va)
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina{
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DBusMessage *msg;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina dbus_bool_t bret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina errno_t ret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina msg = dbus_message_new_method_call(bus, path, iface, method);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (msg == NULL) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create message\n");
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return NULL;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina bret = dbus_message_append_args_valist(msg, first_arg_type, va);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (!bret) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Failed to build message\n");
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina ret = EIO;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina goto done;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina ret = sbus_talloc_bound_message(mem_ctx, msg);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březinadone:
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (ret != EOK) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina dbus_message_unref(msg);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return msg;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina}
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel BřezinaDBusMessage *_sbus_create_message(TALLOC_CTX *mem_ctx,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina const char *bus,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina const char *path,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina const char *iface,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina const char *method,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina int first_arg_type,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina ...)
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina{
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DBusMessage *msg;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina va_list va;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina va_start(va, first_arg_type);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina msg = sbus_create_message_valist(mem_ctx, bus, path, iface, method,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina first_arg_type, va);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina va_end(va);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return msg;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina}
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březinaerrno_t sbus_parse_message_valist(DBusMessage *msg,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina bool check_reply,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina int first_arg_type,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina va_list va)
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina{
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DBusError error;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina dbus_bool_t bret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina errno_t ret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (check_reply) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina ret = sbus_check_reply(msg);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (ret != EOK) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return ret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina dbus_error_init(&error);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina bret = dbus_message_get_args_valist(msg, &error, first_arg_type, va);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (bret == false) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse D-Bus message\n");
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina ret = EIO;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina goto done;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina ret = sbus_error_to_errno(&error);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina if (ret != EOK) {
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse D-Bus message [%s]: %s\n",
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina error.name, error.message);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina goto done;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina }
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březinadone:
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina dbus_error_free(&error);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return ret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina}
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březinaerrno_t _sbus_parse_message(DBusMessage *msg,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina bool check_reply,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina int first_arg_type,
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina ...)
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina{
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina errno_t ret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina va_list va;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina va_start(va, first_arg_type);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina ret = sbus_parse_message_valist(msg, check_reply, first_arg_type, va);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina va_end(va);
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina return ret;
439e08cdc5c83b3e5835cb0435983f1da2ffbaf1Pavel Březina}