summaryrefslogtreecommitdiffstats
path: root/src/sbus
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2014-12-17 13:26:16 +0100
committerJakub Hrozek <jhrozek@redhat.com>2015-02-17 15:53:39 +0100
commitdf4e1db5d41c903ae57fd880acc76a0ad84aa7b2 (patch)
treefa052523b587c0728638b513582694e61134f409 /src/sbus
parente8058322725ba050014777ee2484f7e833ab1e3a (diff)
downloadsssd-df4e1db5d41c903ae57fd880acc76a0ad84aa7b2.tar.gz
sssd-df4e1db5d41c903ae57fd880acc76a0ad84aa7b2.tar.xz
sssd-df4e1db5d41c903ae57fd880acc76a0ad84aa7b2.zip
sbus: use hard coded getters instead of generated
Properties are single value of a small number of predefined D-Bus types. There is no need to generate them with codegen. Actually, the source generator for property getters is already quite mess with branching for array, strings and object paths. Adding any more complex type in the future (such as dictionary) would require even more branching or creating a separate path for it. Hard coding the getters will simplify creating new ones for more complex types. This patch also reduces lots of code duplication and creates a simple function for GetAll. Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
Diffstat (limited to 'src/sbus')
-rwxr-xr-xsrc/sbus/sbus_codegen133
-rw-r--r--src/sbus/sssd_dbus_invokers.c465
-rw-r--r--src/sbus/sssd_dbus_invokers.h120
-rw-r--r--src/sbus/sssd_dbus_meta.h15
-rw-r--r--src/sbus/sssd_dbus_properties.c51
5 files changed, 636 insertions, 148 deletions
diff --git a/src/sbus/sbus_codegen b/src/sbus/sbus_codegen
index 78ba89d4b..f93cb33a4 100755
--- a/src/sbus/sbus_codegen
+++ b/src/sbus/sbus_codegen
@@ -190,7 +190,7 @@ class Property(Typed):
def getter_name(self):
return "%s_get_%s" % (self.iface.c_name(), self.c_name())
def getter_invoker_name(self):
- return "invoke_get_%s" % self.type
+ return "sbus_invoke_get_%s" % self.type
def getter_signature(self, name):
sig = "void (*%s)(struct sbus_request *, void *data, %s *" % (name, self.sssd_type)
if self.is_array:
@@ -306,108 +306,6 @@ def source_prop_handler(prop, type_prefix=False):
out(" %s", prop.getter_signature("%shandler" % prefix), new_line=False)
out(";")
-def source_getter_invoker(prop):
- out("")
- if prop.is_array:
- out("/* invokes a getter with an array of '%s' DBus type */", prop.dbus_type)
- else:
- out("/* invokes a getter with a '%s' DBus type */", prop.dbus_type)
- out("static int %s(struct sbus_request *dbus_req, void *function_ptr)",
- prop.getter_invoker_name())
- out("{")
-
- source_prop_types(prop)
-
- out("")
- out(" %s", prop.getter_signature("handler"), new_line=False)
- out(" = function_ptr;")
- out("")
-
- out(" (handler)(dbus_req, dbus_req->intf->handler_data, &prop_val", new_line=False)
- if prop.is_array:
- out(", &prop_len", new_line=False)
- out(");")
-
- out("")
- if prop.type == "s":
- out(" out_val = prop_val == NULL ? \"\" : prop_val;")
- elif prop.type == "o":
- out(" out_val = prop_val == NULL ? \"/\" : prop_val;")
- else:
- out(" out_val = prop_val;")
- if prop.is_array:
- out(" return sbus_request_return_array_as_variant(dbus_req, %s, (uint8_t*)out_val, prop_len, sizeof(%s));", prop.dbus_constant, prop.sssd_type)
- else:
- out(" return sbus_request_return_as_variant(dbus_req, %s, &out_val);", prop.dbus_constant)
- out("}")
-
-def source_getall_invoker(iface, prop_invokers):
- out("")
- out("/* invokes GetAll for the '%s' interface */", iface.name)
- out("static int invoke_%s_get_all(struct sbus_request *dbus_req, void *function_ptr)",
- iface.c_name())
- out("{")
- out(" DBusMessage *reply;")
- out(" dbus_bool_t dbret;")
- out(" DBusMessageIter iter;")
- out(" DBusMessageIter iter_dict;")
- if iface.properties:
- out(" int ret;")
- out(" struct sbus_interface *intf = dbus_req->intf;")
- out(" const struct sbus_property_meta *property;")
-
- iface_types = [ p.type for p in iface.properties ]
- for prop in [ p for p in prop_invokers.values() if p.type in iface_types ]:
- source_prop_types(prop, type_prefix=True)
- source_prop_handler(prop, type_prefix=True)
- out("")
-
- out(" reply = dbus_message_new_method_return(dbus_req->message);")
- out(" if (!reply) return ENOMEM;")
- out(" dbus_message_iter_init_append(reply, &iter);")
- out(" dbret = dbus_message_iter_open_container(")
- out(" &iter, DBUS_TYPE_ARRAY,")
- out(" DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING")
- out(" DBUS_TYPE_STRING_AS_STRING")
- out(" DBUS_TYPE_VARIANT_AS_STRING")
- out(" DBUS_DICT_ENTRY_END_CHAR_AS_STRING,")
- out(" &iter_dict);")
- out(" if (!dbret) return ENOMEM;")
- out("")
-
- for prop in iface.properties:
- out(" property = sbus_meta_find_property(intf->vtable->meta, \"%s\");", prop.c_name())
- out(" if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {")
- out(" %s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);", prop.type)
- out(" if (%s_handler) {", prop.type)
- out(" (%s_handler)(dbus_req, dbus_req->intf->handler_data, &%s_prop_val", prop.type, prop.type, new_line=False)
- if prop.is_array:
- out(", &%s_prop_len", prop.type, new_line=False)
- out(");")
- if prop.type == "s":
- out(" %s_out_val = %s_prop_val == NULL ? \"\" : %s_prop_val;",
- prop.type, prop.type, prop.type)
- elif prop.type == "o":
- out(" %s_out_val = %s_prop_val == NULL ? \"/\" : %s_prop_val;",
- prop.type, prop.type, prop.type)
- else:
- out(" %s_out_val = %s_prop_val;", prop.type, prop.type)
- if prop.is_array:
- out(" ret = sbus_add_array_as_variant_to_dict(&iter_dict, \"%s\", %s, (uint8_t*)%s_out_val, %s_prop_len, sizeof(%s));", prop.c_name(), prop.dbus_constant, prop.type, prop.type, prop.sssd_type)
- else:
- out(" ret = sbus_add_variant_to_dict(&iter_dict, \"%s\", %s, &%s_out_val);", prop.c_name(), prop.dbus_constant, prop.type)
- out(" if (ret != EOK) return ret;")
- out(" }")
- out(" }")
- out("")
-
- out(" dbret = dbus_message_iter_close_container(&iter, &iter_dict);")
- out(" if (!dbret) return ENOMEM;")
- out("")
-
- out(" return sbus_request_finish(dbus_req, reply);")
- out("}")
-
def forward_method_invokers(ifaces):
invokers = { }
for iface in ifaces:
@@ -425,27 +323,6 @@ def source_method_invokers(invokers):
for (signature, meth) in invokers.items():
source_method_invoker(signature, meth.in_args)
-def forward_prop_invoker(prop):
- out("static int %s(struct sbus_request *dbus_req, void *function_ptr);",
- prop.getter_invoker_name())
-
-def forward_prop_invokers(ifaces):
- invokers = { }
- for iface in ifaces:
- for prop in iface.properties:
- if not prop.is_basic:
- continue
- if prop.type in invokers:
- continue
- forward_prop_invoker(prop)
- invokers[prop.type] = prop
- return invokers
-
-def source_prop_invokers(invokers):
- for (type, prop) in invokers.items():
- if prop.readable:
- source_getter_invoker(prop)
-
def source_finisher(meth):
out("")
out("int %s_finish(struct sbus_request *req%s)",
@@ -590,7 +467,7 @@ def source_interface(iface):
out(" %s__properties,", iface.c_name())
else:
out(" NULL, /* no properties */")
- out(" invoke_%s_get_all, /* GetAll invoker */", iface.c_name())
+ out(" sbus_invoke_get_all, /* GetAll invoker */")
out("};")
def generate_source(ifaces, filename, include_header=None):
@@ -602,11 +479,11 @@ def generate_source(ifaces, filename, include_header=None):
out("#include \"util/util.h\"")
out("#include \"sbus/sssd_dbus.h\"")
out("#include \"sbus/sssd_dbus_meta.h\"")
+ out("#include \"sbus/sssd_dbus_invokers.h\"")
if include_header:
out("#include \"%s\"", os.path.basename(include_header))
meth_invokers = forward_method_invokers(ifaces)
- prop_invokers = forward_prop_invokers(ifaces)
for iface in ifaces:
@@ -622,14 +499,10 @@ def generate_source(ifaces, filename, include_header=None):
if iface.properties:
source_properties(iface, iface.properties)
- # always generate getall, for interfaces without properties
- # let's return an empty array
- source_getall_invoker(iface, prop_invokers)
# The sbus_interface structure
source_interface(iface)
source_method_invokers(meth_invokers)
- source_prop_invokers(prop_invokers)
def header_finisher(iface, meth):
if meth.use_raw_handler():
diff --git a/src/sbus/sssd_dbus_invokers.c b/src/sbus/sssd_dbus_invokers.c
new file mode 100644
index 000000000..df9104f63
--- /dev/null
+++ b/src/sbus/sssd_dbus_invokers.c
@@ -0,0 +1,465 @@
+/*
+ Authors:
+ Pavel Březina <pbrezina@redhat.com>
+
+ Copyright (C) 2014 Red Hat
+
+ SBUS: Interface introspection
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "config.h"
+
+#include <dbus/dbus.h>
+#include <errno.h>
+
+#include "util/util.h"
+#include "sbus/sssd_dbus.h"
+#include "sbus/sssd_dbus_meta.h"
+#include "sbus/sssd_dbus_private.h"
+#include "sbus/sssd_dbus_invokers.h"
+
+static int
+sbus_invoke_get_basic(struct sbus_request *sbus_req,
+ void *function_ptr,
+ void *value_ptr,
+ int dbus_type,
+ DBusMessageIter *iter)
+{
+ void (*handler_fn)(struct sbus_request *, void *, void *);
+ dbus_bool_t value_bool;
+ dbus_bool_t dbret;
+
+ handler_fn = function_ptr;
+ handler_fn(sbus_req, sbus_req->intf->handler_data, value_ptr);
+
+ if (dbus_type == DBUS_TYPE_BOOLEAN) {
+ /* Special case to convert bool into dbus_bool_t. */
+ value_bool = *((bool *) value_ptr);
+ value_ptr = &value_bool;
+ }
+
+ dbret = dbus_message_iter_append_basic(iter, dbus_type, value_ptr);
+ return dbret ? EOK : EIO;
+}
+
+static int
+sbus_invoke_get_string(struct sbus_request *sbus_req,
+ void *function_ptr,
+ const char *default_value,
+ int dbus_type,
+ DBusMessageIter *iter)
+{
+ void (*handler_fn)(struct sbus_request *, void *, const char **);
+ const char *value = NULL;
+ dbus_bool_t dbret;
+
+ handler_fn = function_ptr;
+ handler_fn(sbus_req, sbus_req->intf->handler_data, &value);
+
+ value = value == NULL ? default_value : value;
+
+ dbret = dbus_message_iter_append_basic(iter, dbus_type, &value);
+ return dbret ? EOK : EIO;
+}
+
+static int
+sbus_invoke_get_array(struct sbus_request *sbus_req,
+ void *function_ptr,
+ unsigned int item_size,
+ int dbus_type,
+ DBusMessageIter *iter)
+{
+ void (*handler_fn)(struct sbus_request *, void *, void *, int *);
+ const char array_type[2] = {dbus_type, '\0'};
+ DBusMessageIter array;
+ dbus_bool_t dbret;
+ uint8_t *values;
+ void *addr;
+ int num_values;
+ int i;
+
+ handler_fn = function_ptr;
+ handler_fn(sbus_req, sbus_req->intf->handler_data, &values, &num_values);
+
+ dbret = dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+ array_type, &array);
+ if (!dbret) {
+ return EIO;
+ }
+
+ for (i = 0; i < num_values; i++) {
+ addr = values + i * item_size;
+
+ dbret = dbus_message_iter_append_basic(&array, dbus_type, addr);
+ if (!dbret) {
+ return ENOMEM;
+ }
+ }
+
+ dbret = dbus_message_iter_close_container(iter, &array);
+ if (!dbret) {
+ return EIO;
+ }
+
+ return EOK;
+}
+
+int sbus_invoke_get_y(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ uint8_t value;
+
+ return sbus_invoke_get_basic(sbus_req, function_ptr, &value,
+ DBUS_TYPE_BYTE, iter);
+}
+
+int sbus_invoke_get_b(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ bool value;
+
+ return sbus_invoke_get_basic(sbus_req, function_ptr, &value,
+ DBUS_TYPE_BOOLEAN, iter);
+}
+
+int sbus_invoke_get_n(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ int16_t value;
+
+ return sbus_invoke_get_basic(sbus_req, function_ptr, &value,
+ DBUS_TYPE_INT16, iter);
+}
+
+int sbus_invoke_get_q(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ uint16_t value;
+
+ return sbus_invoke_get_basic(sbus_req, function_ptr, &value,
+ DBUS_TYPE_UINT16, iter);
+}
+
+int sbus_invoke_get_i(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ int32_t value;
+
+ return sbus_invoke_get_basic(sbus_req, function_ptr, &value,
+ DBUS_TYPE_INT32, iter);
+}
+
+int sbus_invoke_get_u(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ uint32_t value;
+
+ return sbus_invoke_get_basic(sbus_req, function_ptr, &value,
+ DBUS_TYPE_UINT32, iter);
+}
+
+int sbus_invoke_get_x(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ int64_t value;
+
+ return sbus_invoke_get_basic(sbus_req, function_ptr, &value,
+ DBUS_TYPE_INT64, iter);
+}
+
+int sbus_invoke_get_t(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ uint64_t value;
+
+ return sbus_invoke_get_basic(sbus_req, function_ptr, &value,
+ DBUS_TYPE_UINT64, iter);
+}
+
+int sbus_invoke_get_d(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ double value;
+
+ return sbus_invoke_get_basic(sbus_req, function_ptr, &value,
+ DBUS_TYPE_DOUBLE, iter);
+}
+
+int sbus_invoke_get_s(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ return sbus_invoke_get_string(sbus_req, function_ptr, "",
+ DBUS_TYPE_STRING, iter);
+}
+
+int sbus_invoke_get_o(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ return sbus_invoke_get_string(sbus_req, function_ptr, "/",
+ DBUS_TYPE_OBJECT_PATH, iter);
+}
+
+int sbus_invoke_get_ay(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ return sbus_invoke_get_array(sbus_req, function_ptr, sizeof(uint8_t),
+ DBUS_TYPE_BYTE, iter);
+}
+
+int sbus_invoke_get_an(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ return sbus_invoke_get_array(sbus_req, function_ptr, sizeof(int16_t),
+ DBUS_TYPE_INT16, iter);
+}
+
+int sbus_invoke_get_aq(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ return sbus_invoke_get_array(sbus_req, function_ptr, sizeof(uint16_t),
+ DBUS_TYPE_UINT16, iter);
+}
+
+int sbus_invoke_get_ai(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ return sbus_invoke_get_array(sbus_req, function_ptr, sizeof(int32_t),
+ DBUS_TYPE_INT32, iter);
+}
+
+int sbus_invoke_get_au(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ return sbus_invoke_get_array(sbus_req, function_ptr, sizeof(uint32_t),
+ DBUS_TYPE_UINT32, iter);
+}
+
+int sbus_invoke_get_ax(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ return sbus_invoke_get_array(sbus_req, function_ptr, sizeof(int64_t),
+ DBUS_TYPE_INT64, iter);
+}
+
+int sbus_invoke_get_at(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ return sbus_invoke_get_array(sbus_req, function_ptr, sizeof(uint64_t),
+ DBUS_TYPE_UINT64, iter);
+}
+
+int sbus_invoke_get_ad(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ return sbus_invoke_get_array(sbus_req, function_ptr, sizeof(double),
+ DBUS_TYPE_DOUBLE, iter);
+}
+
+int sbus_invoke_get_as(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ return sbus_invoke_get_array(sbus_req, function_ptr, sizeof(const char *),
+ DBUS_TYPE_STRING, iter);
+}
+
+int sbus_invoke_get_ao(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr)
+{
+ return sbus_invoke_get_array(sbus_req, function_ptr, sizeof(const char *),
+ DBUS_TYPE_OBJECT_PATH, iter);
+}
+
+void sbus_invoke_get(struct sbus_request *sbus_req,
+ const char *type,
+ sbus_get_invoker_fn invoker_fn,
+ sbus_msg_handler_fn handler_fn)
+{
+ DBusMessage *reply = NULL;
+ DBusMessageIter iter;
+ DBusMessageIter variant;
+ dbus_bool_t dbret;
+ errno_t ret;
+
+ reply = dbus_message_new_method_return(sbus_req->message);
+ if (reply == NULL) {
+ ret = ENOMEM;
+ goto fail;
+ }
+
+ dbus_message_iter_init_append(reply, &iter);
+
+ dbret = dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
+ type, &variant);
+ if (!dbret) {
+ ret = ENOMEM;
+ goto fail;
+ }
+
+ ret = invoker_fn(&variant, sbus_req, handler_fn);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ "Invoker error [%d]: %s\n", ret, sss_strerror(ret));
+ goto fail;
+ }
+
+ dbret = dbus_message_iter_close_container(&iter, &variant);
+ if (!dbret) {
+ ret = EIO;
+ goto fail;
+ }
+
+ sbus_request_finish(sbus_req, reply);
+ return;
+
+fail:
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ "Unable to reply [%d]: %s\n", ret, sss_strerror(ret));
+
+ if (reply != NULL) {
+ dbus_message_unref(reply);
+ }
+ sbus_request_finish(sbus_req, NULL);
+
+ return;
+}
+
+void sbus_invoke_get_all(struct sbus_request *sbus_req)
+{
+ const struct sbus_property_meta *props;
+ sbus_msg_handler_fn *handler_fn;
+ DBusMessage *reply = NULL;
+ DBusMessageIter iter;
+ DBusMessageIter array;
+ DBusMessageIter dict;
+ DBusMessageIter variant;
+ dbus_bool_t dbret;
+ errno_t ret;
+ int i;
+
+ reply = dbus_message_new_method_return(sbus_req->message);
+ if (reply == NULL) {
+ ret = ENOMEM;
+ goto fail;
+ }
+
+ dbus_message_iter_init_append(reply, &iter);
+
+ dbret = dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+ DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_TYPE_VARIANT_AS_STRING
+ DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+ &array);
+ if (!dbret) {
+ ret = ENOMEM;
+ goto fail;
+ }
+
+ props = sbus_req->intf->vtable->meta->properties;
+
+ if (props != NULL) {
+ for (i = 0; props[i].name != NULL; i++) {
+ dbret = dbus_message_iter_open_container(&array,
+ DBUS_TYPE_DICT_ENTRY, NULL,
+ &dict);
+ if (!dbret) {
+ ret = ENOMEM;
+ goto fail;
+ }
+
+ /* key */
+ dbret = dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING,
+ &props[i].name);
+ if (!dbret) {
+ ret = ENOMEM;
+ goto fail;
+ }
+
+ /* value */
+ dbret = dbus_message_iter_open_container(&dict, DBUS_TYPE_VARIANT,
+ props[i].type, &variant);
+ if (!dbret) {
+ ret = ENOMEM;
+ goto fail;
+ }
+
+ handler_fn = VTABLE_FUNC(sbus_req->intf->vtable,
+ props[i].vtable_offset_get);
+ if (handler_fn == NULL) {
+ ret = ERR_INTERNAL;
+ goto fail;
+ }
+
+ ret = props[i].invoker_get(&variant, sbus_req, handler_fn);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ "Invoker error [%d]: %s\n", ret, sss_strerror(ret));
+ goto fail;
+ }
+
+ dbret = dbus_message_iter_close_container(&dict, &variant);
+ if (!dbret) {
+ ret = EIO;
+ goto fail;
+ }
+
+ dbret = dbus_message_iter_close_container(&array, &dict);
+ if (!dbret) {
+ ret = EIO;
+ goto fail;
+ }
+ }
+ }
+
+ dbret = dbus_message_iter_close_container(&iter, &array);
+ if (!dbret) {
+ ret = EIO;
+ goto fail;
+ }
+
+ sbus_request_finish(sbus_req, reply);
+ return;
+
+fail:
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ "Unable to reply [%d]: %s\n", ret, sss_strerror(ret));
+
+ dbus_message_unref(reply);
+ sbus_request_finish(sbus_req, NULL);
+
+ return;
+}
diff --git a/src/sbus/sssd_dbus_invokers.h b/src/sbus/sssd_dbus_invokers.h
new file mode 100644
index 000000000..8fd498594
--- /dev/null
+++ b/src/sbus/sssd_dbus_invokers.h
@@ -0,0 +1,120 @@
+/*
+ Authors:
+ Pavel Březina <pbrezina@redhat.com>
+
+ Copyright (C) 2014 Red Hat
+
+ SBUS: Interface introspection
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef SSSD_DBUS_INVOKER_H_
+#define SSSD_DBUS_INVOKER_H_
+
+#include "sbus/sssd_dbus.h"
+
+int sbus_invoke_get_y(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_b(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_n(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_q(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_i(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_u(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_x(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_t(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_d(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_s(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_o(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_ay(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_an(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_aq(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_ai(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_au(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_ax(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_at(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_ad(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_as(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+int sbus_invoke_get_ao(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *function_ptr);
+
+void sbus_invoke_get(struct sbus_request *sbus_req,
+ const char *type,
+ sbus_get_invoker_fn invoker_fn,
+ sbus_msg_handler_fn handler_fn);
+
+void sbus_invoke_get_all(struct sbus_request *sbus_req);
+
+
+#endif /* SSSD_DBUS_INVOKER_H_ */
diff --git a/src/sbus/sssd_dbus_meta.h b/src/sbus/sssd_dbus_meta.h
index e7de9dfdf..83c2f0517 100644
--- a/src/sbus/sssd_dbus_meta.h
+++ b/src/sbus/sssd_dbus_meta.h
@@ -21,6 +21,8 @@
#ifndef _SSSD_DBUS_META_H_
#define _SSSD_DBUS_META_H_
+#include <dbus/dbus.h>
+
/*
* Interface metadata
*
@@ -45,7 +47,14 @@ struct sbus_arg_meta {
struct sbus_request;
struct sbus_interface;
-typedef int (* sbus_method_invoker_fn)(struct sbus_request *dbus_req, void *handler_fn);
+typedef int (* sbus_get_invoker_fn)(DBusMessageIter *iter,
+ struct sbus_request *sbus_req,
+ void *handler_fn);
+
+typedef void (* sbus_get_all_invoker_fn)(struct sbus_request *sbus_req);
+
+typedef int (* sbus_method_invoker_fn)(struct sbus_request *sbus_req,
+ void *handler_fn);
struct sbus_method_meta {
const char *name;
@@ -65,7 +74,7 @@ struct sbus_property_meta {
const char *type;
int flags;
size_t vtable_offset_get;
- sbus_method_invoker_fn invoker_get;
+ sbus_get_invoker_fn invoker_get;
size_t vtable_offset_set;
sbus_method_invoker_fn invoker_set;
};
@@ -80,7 +89,7 @@ struct sbus_interface_meta {
const struct sbus_method_meta *methods;
const struct sbus_signal_meta *signals;
const struct sbus_property_meta *properties;
- sbus_method_invoker_fn invoker_get_all;
+ sbus_get_all_invoker_fn invoker_get_all;
};
const struct sbus_method_meta *
diff --git a/src/sbus/sssd_dbus_properties.c b/src/sbus/sssd_dbus_properties.c
index 060da584e..15bc6a937 100644
--- a/src/sbus/sssd_dbus_properties.c
+++ b/src/sbus/sssd_dbus_properties.c
@@ -25,6 +25,7 @@
#include "sbus/sssd_dbus.h"
#include "sbus/sssd_dbus_meta.h"
#include "sbus/sssd_dbus_private.h"
+#include "sbus/sssd_dbus_invokers.h"
#define CHECK_SIGNATURE_OR_FAIL(req, error, label, exp) do { \
const char *__sig; \
@@ -124,11 +125,9 @@ sbus_properties_vtable(void)
return &iface.vtable;
}
-static int sbus_properties_invoke(struct sbus_request *sbus_req,
- struct sbus_interface *iface,
- sbus_msg_handler_fn handler_fn,
- void *handler_data,
- sbus_method_invoker_fn invoker_fn)
+static struct sbus_request *
+sbus_properties_subreq(struct sbus_request *sbus_req,
+ struct sbus_interface *iface)
{
struct sbus_request *sbus_subreq;
@@ -137,20 +136,18 @@ static int sbus_properties_invoke(struct sbus_request *sbus_req,
* so it is freed together. */
sbus_subreq = sbus_new_request(sbus_req->conn, iface, sbus_req->message);
if (sbus_subreq == NULL) {
- return ENOMEM;
+ return NULL;
}
talloc_steal(sbus_subreq, sbus_req);
- sbus_request_invoke_or_finish(sbus_subreq, handler_fn, handler_data,
- invoker_fn);
-
- return EOK;
+ return sbus_subreq;
}
static int sbus_properties_get(struct sbus_request *sbus_req, void *pvt)
{
DBusError *error;
+ struct sbus_request *sbus_subreq;
struct sbus_connection *conn;
struct sbus_interface *iface;
const struct sbus_property_meta *prop;
@@ -202,8 +199,15 @@ static int sbus_properties_get(struct sbus_request *sbus_req, void *pvt)
goto fail;
}
- return sbus_properties_invoke(sbus_req, iface, handler_fn,
- iface->handler_data, prop->invoker_get);
+ sbus_subreq = sbus_properties_subreq(sbus_req, iface);
+ if (sbus_subreq == NULL) {
+ error = NULL;
+ goto fail;
+ }
+
+ sbus_invoke_get(sbus_subreq, prop->type,
+ prop->invoker_get, handler_fn);
+ return EOK;
fail:
return sbus_request_fail_and_finish(sbus_req, error);
@@ -218,6 +222,7 @@ static int sbus_properties_set(struct sbus_request *sbus_req, void *pvt)
DBusError *error;
DBusMessageIter iter;
DBusMessageIter iter_variant;
+ struct sbus_request *sbus_subreq;
struct sbus_connection *conn;
struct sbus_interface *iface;
const struct sbus_property_meta *prop;
@@ -276,9 +281,17 @@ static int sbus_properties_set(struct sbus_request *sbus_req, void *pvt)
goto fail;
}
- return sbus_properties_invoke(sbus_req, iface, handler_fn,
+ sbus_subreq = sbus_properties_subreq(sbus_req, iface);
+ if (sbus_subreq == NULL) {
+ error = NULL;
+ goto fail;
+ }
+
+ sbus_request_invoke_or_finish(sbus_subreq, handler_fn,
iface->handler_data, prop->invoker_set);
+ return EOK;
+
fail:
return sbus_request_fail_and_finish(sbus_req, error);
}
@@ -286,6 +299,7 @@ fail:
static int sbus_properties_get_all(struct sbus_request *sbus_req, void *pvt)
{
DBusError *error;
+ struct sbus_request *sbus_subreq;
struct sbus_connection *conn;
struct sbus_interface *iface;
const char *interface_name;
@@ -312,8 +326,15 @@ static int sbus_properties_get_all(struct sbus_request *sbus_req, void *pvt)
goto fail;
}
- return sbus_properties_invoke(sbus_req, iface, NULL, NULL,
- iface->vtable->meta->invoker_get_all);
+ sbus_subreq = sbus_properties_subreq(sbus_req, iface);
+ if (sbus_subreq == NULL) {
+ error = NULL;
+ goto fail;
+ }
+
+ iface->vtable->meta->invoker_get_all(sbus_subreq);
+
+ return EOK;
fail:
return sbus_request_fail_and_finish(sbus_req, error);