summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am30
-rw-r--r--src/monitor/monitor.c12
-rw-r--r--src/monitor/monitor_iface.xml41
-rw-r--r--src/monitor/monitor_iface_generated.c92
-rw-r--r--src/monitor/monitor_iface_generated.h56
-rw-r--r--src/monitor/monitor_interfaces.h2
-rw-r--r--src/providers/data_provider.h1
-rw-r--r--src/providers/data_provider_be.c43
-rw-r--r--src/providers/data_provider_iface.xml38
-rw-r--r--src/providers/data_provider_iface_generated.c86
-rw-r--r--src/providers/data_provider_iface_generated.h55
-rw-r--r--src/providers/proxy/proxy_child.c16
-rw-r--r--src/providers/proxy/proxy_init.c16
-rw-r--r--src/responder/autofs/autofssrv.c35
-rw-r--r--src/responder/nss/nsssrv.c33
-rw-r--r--src/responder/pac/pacsrv.c34
-rw-r--r--src/responder/pam/pamsrv.c34
-rw-r--r--src/responder/ssh/sshsrv.c34
-rw-r--r--src/responder/sudo/sudosrv.c34
-rw-r--r--src/sbus/sssd_dbus.h11
-rw-r--r--src/sbus/sssd_dbus_connection.c67
21 files changed, 606 insertions, 164 deletions
diff --git a/Makefile.am b/Makefile.am
index 22a38eb21..0289645c9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -314,7 +314,11 @@ SSSD_RESPONDER_OBJ = \
src/responder/common/responder_common.c \
src/responder/common/responder_dp.c \
src/responder/common/responder_packet.c \
- src/responder/common/responder_get_domains.c
+ src/responder/common/responder_get_domains.c \
+ src/monitor/monitor_iface_generated.c \
+ src/monitor/monitor_iface_generated.h \
+ src/providers/data_provider_iface_generated.c \
+ src/providers/data_provider_iface_generated.h
SSSD_TOOLS_OBJ = \
src/tools/sss_sync_ops.c \
@@ -646,7 +650,9 @@ include_HEADERS = \
# Yes, the goal here is that the generated files end up in $(srcdir)
# not $(builddir). Always use $(srcdir) here.
CODEGEN_XML = \
- $(srcdir)/src/tests/sbus_codegen_tests.xml
+ $(srcdir)/src/tests/sbus_codegen_tests.xml \
+ $(srcdir)/src/monitor/monitor_iface.xml \
+ $(srcdir)/src/providers/data_provider_iface.xml
SBUS_CODEGEN = src/sbus/sbus_codegen
@@ -677,7 +683,9 @@ sssd_SOURCES = \
src/monitor/monitor.c \
src/monitor/monitor_netlink.c \
src/confdb/confdb_setup.c \
- src/util/nscd.c
+ src/util/nscd.c \
+ src/monitor/monitor_iface_generated.c \
+ src/monitor/monitor_iface_generated.h
sssd_LDADD = \
$(SSSD_LIBS) \
$(INOTIFY_LIBS) \
@@ -770,6 +778,10 @@ sssd_be_SOURCES = \
src/providers/dp_dyndns.c \
src/providers/dp_ptask.c \
src/providers/dp_refresh.c \
+ src/monitor/monitor_iface_generated.c \
+ src/monitor/monitor_iface_generated.h \
+ src/providers/data_provider_iface_generated.c \
+ src/providers/data_provider_iface_generated.h \
$(SSSD_FAILOVER_OBJ)
sssd_be_LDADD = \
$(LIBADD_DL) \
@@ -1173,6 +1185,10 @@ simple_access_tests_SOURCES = \
src/providers/data_provider_callbacks.c \
src/providers/dp_ptask.c \
src/providers/dp_refresh.c \
+ src/monitor/monitor_iface_generated.c \
+ src/monitor/monitor_iface_generated.h \
+ src/providers/data_provider_iface_generated.c \
+ src/providers/data_provider_iface_generated.h \
$(SSSD_FAILOVER_OBJ)
simple_access_tests_CFLAGS = \
$(AM_CFLAGS) \
@@ -1738,7 +1754,9 @@ libsss_proxy_la_SOURCES = \
src/providers/proxy/proxy_id.c \
src/providers/proxy/proxy_netgroup.c \
src/providers/proxy/proxy_services.c \
- src/providers/proxy/proxy_auth.c
+ src/providers/proxy/proxy_auth.c \
+ src/providers/data_provider_iface_generated.c \
+ src/providers/data_provider_iface_generated.h
libsss_proxy_la_CFLAGS = \
$(AM_CFLAGS)
libsss_proxy_la_LIBADD = \
@@ -1935,7 +1953,9 @@ ldap_child_LDADD = \
$(KRB5_LIBS)
proxy_child_SOURCES = \
- src/providers/proxy/proxy_child.c
+ src/providers/proxy/proxy_child.c \
+ src/providers/data_provider_iface_generated.c \
+ src/providers/data_provider_iface_generated.h
proxy_child_CFLAGS = \
$(AM_CFLAGS) \
$(POPT_CFLAGS)
diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c
index 9c54e98e7..20892d0bb 100644
--- a/src/monitor/monitor.c
+++ b/src/monitor/monitor.c
@@ -525,17 +525,15 @@ static int add_services_startup_timeout(struct mt_ctx *ctx)
return EOK;
}
-struct sbus_method monitor_methods[] = {
- { MON_SRV_METHOD_VERSION, get_monitor_version },
- { MON_SRV_METHOD_REGISTER, client_registration },
- { NULL, NULL }
+struct mon_srv_iface monitor_methods = {
+ { &mon_srv_iface_meta, 0 },
+ .getVersion = get_monitor_version,
+ .RegisterService = client_registration,
};
struct sbus_interface monitor_server_interface = {
- MON_SRV_INTERFACE,
MON_SRV_PATH,
- SBUS_DEFAULT_VTABLE,
- monitor_methods,
+ &monitor_methods.vtable,
NULL
};
diff --git a/src/monitor/monitor_iface.xml b/src/monitor/monitor_iface.xml
new file mode 100644
index 000000000..506b749c8
--- /dev/null
+++ b/src/monitor/monitor_iface.xml
@@ -0,0 +1,41 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.freedesktop.sssd.monitor">
+ <annotation value="mon_srv_iface" name="org.freedesktop.DBus.GLib.CSymbol"/>
+ <method name="getVersion">
+ <!-- manual argument parsing -->
+ </method>
+ <method name="RegisterService">
+ <!-- manual argument parsing -->
+ </method>
+ </interface>
+
+ <interface name="org.freedesktop.sssd.service">
+ <annotation value="mon_cli_iface" name="org.freedesktop.DBus.GLib.CSymbol"/>
+ <method name="ping">
+ <!-- no arguments -->
+ </method>
+ <method name="resInit">
+ <!-- no arguments -->
+ </method>
+ <method name="shutDown">
+ <!-- no arguments -->
+ </method>
+ <method name="goOffline">
+ <!-- no arguments -->
+ </method>
+ <method name="resetOffline">
+ <!-- no arguments -->
+ </method>
+ <method name="rotateLogs">
+ <!-- no arguments -->
+ </method>
+ <method name="clearMemcache">
+ <!-- no arguments -->
+ </method>
+ <method name="clearEnumCache">
+ <!-- no arguments -->
+ </method>
+ </interface>
+</node>
diff --git a/src/monitor/monitor_iface_generated.c b/src/monitor/monitor_iface_generated.c
new file mode 100644
index 000000000..81a7c247a
--- /dev/null
+++ b/src/monitor/monitor_iface_generated.c
@@ -0,0 +1,92 @@
+/* The following definitions are auto-generated from monitor_iface.xml */
+
+#include "util/util.h"
+#include "sbus/sssd_dbus.h"
+#include "sbus/sssd_dbus_meta.h"
+#include "monitor_iface_generated.h"
+
+/* methods for org.freedesktop.sssd.monitor */
+const struct sbus_method_meta mon_srv_iface__methods[] = {
+ {
+ "getVersion", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct mon_srv_iface, getVersion),
+ },
+ {
+ "RegisterService", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct mon_srv_iface, RegisterService),
+ },
+ { NULL, }
+};
+
+/* interface info for org.freedesktop.sssd.monitor */
+const struct sbus_interface_meta mon_srv_iface_meta = {
+ "org.freedesktop.sssd.monitor", /* name */
+ mon_srv_iface__methods,
+ NULL, /* no signals */
+ NULL, /* no propetries */
+};
+
+/* methods for org.freedesktop.sssd.service */
+const struct sbus_method_meta mon_cli_iface__methods[] = {
+ {
+ "ping", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct mon_cli_iface, ping),
+ },
+ {
+ "resInit", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct mon_cli_iface, resInit),
+ },
+ {
+ "shutDown", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct mon_cli_iface, shutDown),
+ },
+ {
+ "goOffline", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct mon_cli_iface, goOffline),
+ },
+ {
+ "resetOffline", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct mon_cli_iface, resetOffline),
+ },
+ {
+ "rotateLogs", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct mon_cli_iface, rotateLogs),
+ },
+ {
+ "clearMemcache", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct mon_cli_iface, clearMemcache),
+ },
+ {
+ "clearEnumCache", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct mon_cli_iface, clearEnumCache),
+ },
+ { NULL, }
+};
+
+/* interface info for org.freedesktop.sssd.service */
+const struct sbus_interface_meta mon_cli_iface_meta = {
+ "org.freedesktop.sssd.service", /* name */
+ mon_cli_iface__methods,
+ NULL, /* no signals */
+ NULL, /* no propetries */
+};
diff --git a/src/monitor/monitor_iface_generated.h b/src/monitor/monitor_iface_generated.h
new file mode 100644
index 000000000..cde774985
--- /dev/null
+++ b/src/monitor/monitor_iface_generated.h
@@ -0,0 +1,56 @@
+/* The following declarations are auto-generated from monitor_iface.xml */
+
+#ifndef __MONITOR_IFACE_XML__
+#define __MONITOR_IFACE_XML__
+
+#include "sbus/sssd_dbus.h"
+
+/* ------------------------------------------------------------------------
+ * DBus Vtable handler structures
+ *
+ * These structures are filled in by implementors of the different
+ * dbus interfaces to handle method calls.
+ *
+ * Handler functions of type sbus_msg_handler_fn accept raw messages,
+ * other handlers will be typed appropriately. If a handler that is
+ * set to NULL is invoked it will result in a
+ * org.freedesktop.DBus.Error.NotSupported error for the caller.
+ */
+
+/* vtable for org.freedesktop.sssd.monitor */
+struct mon_srv_iface {
+ struct sbus_vtable vtable; /* derive from sbus_vtable */
+ sbus_msg_handler_fn getVersion;
+ sbus_msg_handler_fn RegisterService;
+};
+
+/* vtable for org.freedesktop.sssd.service */
+struct mon_cli_iface {
+ struct sbus_vtable vtable; /* derive from sbus_vtable */
+ sbus_msg_handler_fn ping;
+ sbus_msg_handler_fn resInit;
+ sbus_msg_handler_fn shutDown;
+ sbus_msg_handler_fn goOffline;
+ sbus_msg_handler_fn resetOffline;
+ sbus_msg_handler_fn rotateLogs;
+ sbus_msg_handler_fn clearMemcache;
+ sbus_msg_handler_fn clearEnumCache;
+};
+
+/* ------------------------------------------------------------------------
+ * DBus Interface Metadata
+ *
+ * These structure definitions are filled in with the information about
+ * the interfaces, methods, properties and so on.
+ *
+ * The actual definitions are found in the accompanying C file next
+ * to this header.
+ */
+
+/* interface info for org.freedesktop.sssd.monitor */
+extern const struct sbus_interface_meta mon_srv_iface_meta;
+
+/* interface info for org.freedesktop.sssd.service */
+extern const struct sbus_interface_meta mon_cli_iface_meta;
+
+#endif /* __MONITOR_IFACE_XML__ */
diff --git a/src/monitor/monitor_interfaces.h b/src/monitor/monitor_interfaces.h
index f27c7d00c..308642f78 100644
--- a/src/monitor/monitor_interfaces.h
+++ b/src/monitor/monitor_interfaces.h
@@ -21,6 +21,8 @@
#include "sbus/sssd_dbus.h"
+#include "monitor/monitor_iface_generated.h"
+
/*** Monitor ***/
#define MONITOR_VERSION 0x0001
diff --git a/src/providers/data_provider.h b/src/providers/data_provider.h
index 616ff9e16..b5f6e1b38 100644
--- a/src/providers/data_provider.h
+++ b/src/providers/data_provider.h
@@ -42,6 +42,7 @@
#include "sbus/sbus_client.h"
#include "sss_client/sss_cli.h"
#include "util/authtok.h"
+#include "providers/data_provider_iface_generated.h"
#define DATA_PROVIDER_VERSION 0x0001
#define DATA_PROVIDER_PIPE "private/sbus-dp"
diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c
index df0e54293..b4f3e9175 100644
--- a/src/providers/data_provider_be.c
+++ b/src/providers/data_provider_be.c
@@ -63,20 +63,21 @@ static int data_provider_reset_offline(DBusMessage *message,
static int data_provider_logrotate(DBusMessage *message,
struct sbus_connection *conn);
-struct sbus_method monitor_be_methods[] = {
- { MON_CLI_METHOD_PING, monitor_common_pong },
- { MON_CLI_METHOD_RES_INIT, data_provider_res_init },
- { MON_CLI_METHOD_OFFLINE, data_provider_go_offline },
- { MON_CLI_METHOD_RESET_OFFLINE, data_provider_reset_offline },
- { MON_CLI_METHOD_ROTATE, data_provider_logrotate },
- { NULL, NULL }
+struct mon_cli_iface monitor_be_methods = {
+ { &mon_cli_iface_meta, 0 },
+ .ping = monitor_common_pong,
+ .resInit = data_provider_res_init,
+ .shutDown = NULL,
+ .goOffline = data_provider_go_offline,
+ .resetOffline = data_provider_reset_offline,
+ .rotateLogs = data_provider_logrotate,
+ .clearMemcache = NULL,
+ .clearEnumCache = NULL,
};
struct sbus_interface monitor_be_interface = {
- MONITOR_INTERFACE,
MONITOR_PATH,
- SBUS_DEFAULT_VTABLE,
- monitor_be_methods,
+ &monitor_be_methods.vtable,
NULL
};
@@ -88,22 +89,20 @@ static int be_autofs_handler(DBusMessage *message, struct sbus_connection *conn)
static int be_host_handler(DBusMessage *message, struct sbus_connection *conn);
static int be_get_subdomains(DBusMessage *message, struct sbus_connection *conn);
-struct sbus_method be_methods[] = {
- { DP_METHOD_REGISTER, client_registration },
- { DP_METHOD_GETACCTINFO, be_get_account_info },
- { DP_METHOD_PAMHANDLER, be_pam_handler },
- { DP_METHOD_SUDOHANDLER, be_sudo_handler },
- { DP_METHOD_AUTOFSHANDLER, be_autofs_handler },
- { DP_METHOD_HOSTHANDLER, be_host_handler },
- { DP_METHOD_GETDOMAINS, be_get_subdomains },
- { NULL, NULL }
+struct data_provider_iface be_methods = {
+ { &data_provider_iface_meta, 0 },
+ .RegisterService = client_registration,
+ .pamHandler = be_pam_handler,
+ .sudoHandler = be_sudo_handler,
+ .autofsHandler = be_autofs_handler,
+ .hostHandler = be_host_handler,
+ .getDomains = be_get_subdomains,
+ .getAccountInfo = be_get_account_info,
};
struct sbus_interface be_interface = {
- DP_INTERFACE,
DP_PATH,
- SBUS_DEFAULT_VTABLE,
- be_methods,
+ &be_methods.vtable,
NULL
};
diff --git a/src/providers/data_provider_iface.xml b/src/providers/data_provider_iface.xml
new file mode 100644
index 000000000..1f3496493
--- /dev/null
+++ b/src/providers/data_provider_iface.xml
@@ -0,0 +1,38 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.freedesktop.sssd.dataprovider">
+ <annotation value="data_provider_iface" name="org.freedesktop.DBus.GLib.CSymbol"/>
+ <method name="RegisterService">
+ <!-- arguments parsed manually -->
+ </method>
+ <method name="pamHandler">
+ <!-- arguments parsed manually -->
+ </method>
+ <method name="sudoHandler">
+ <!-- arguments parsed manually -->
+ </method>
+ <method name="autofsHandler">
+ <!-- arguments parsed manually -->
+ </method>
+ <method name="hostHandler">
+ <!-- arguments parsed manually -->
+ </method>
+ <method name="getDomains">
+ <!-- arguments parsed manually -->
+ </method>
+ <method name="getAccountInfo">
+ <!-- arguments parsed manually -->
+ </method>
+ </interface>
+
+ <interface name="org.freedesktop.sssd.dataprovider_rev">
+ <annotation value="data_provider_rev_iface" name="org.freedesktop.DBus.GLib.CSymbol"/>
+ <method name="updateCache">
+ <!-- manual argument parsing -->
+ </method>
+ <method name="initgrCheck">
+ <!-- manual argument parsing -->
+ </method>
+ </interface>
+</node>
diff --git a/src/providers/data_provider_iface_generated.c b/src/providers/data_provider_iface_generated.c
new file mode 100644
index 000000000..517b7adfe
--- /dev/null
+++ b/src/providers/data_provider_iface_generated.c
@@ -0,0 +1,86 @@
+/* The following definitions are auto-generated from data_provider_iface.xml */
+
+#include "util/util.h"
+#include "sbus/sssd_dbus.h"
+#include "sbus/sssd_dbus_meta.h"
+#include "data_provider_iface_generated.h"
+
+/* methods for org.freedesktop.sssd.dataprovider */
+const struct sbus_method_meta data_provider_iface__methods[] = {
+ {
+ "RegisterService", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct data_provider_iface, RegisterService),
+ },
+ {
+ "pamHandler", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct data_provider_iface, pamHandler),
+ },
+ {
+ "sudoHandler", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct data_provider_iface, sudoHandler),
+ },
+ {
+ "autofsHandler", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct data_provider_iface, autofsHandler),
+ },
+ {
+ "hostHandler", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct data_provider_iface, hostHandler),
+ },
+ {
+ "getDomains", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct data_provider_iface, getDomains),
+ },
+ {
+ "getAccountInfo", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct data_provider_iface, getAccountInfo),
+ },
+ { NULL, }
+};
+
+/* interface info for org.freedesktop.sssd.dataprovider */
+const struct sbus_interface_meta data_provider_iface_meta = {
+ "org.freedesktop.sssd.dataprovider", /* name */
+ data_provider_iface__methods,
+ NULL, /* no signals */
+ NULL, /* no propetries */
+};
+
+/* methods for org.freedesktop.sssd.dataprovider_rev */
+const struct sbus_method_meta data_provider_rev_iface__methods[] = {
+ {
+ "updateCache", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct data_provider_rev_iface, updateCache),
+ },
+ {
+ "initgrCheck", /* name */
+ NULL, /* no in_args */
+ NULL, /* no out_args */
+ offsetof(struct data_provider_rev_iface, initgrCheck),
+ },
+ { NULL, }
+};
+
+/* interface info for org.freedesktop.sssd.dataprovider_rev */
+const struct sbus_interface_meta data_provider_rev_iface_meta = {
+ "org.freedesktop.sssd.dataprovider_rev", /* name */
+ data_provider_rev_iface__methods,
+ NULL, /* no signals */
+ NULL, /* no propetries */
+};
diff --git a/src/providers/data_provider_iface_generated.h b/src/providers/data_provider_iface_generated.h
new file mode 100644
index 000000000..0851964b1
--- /dev/null
+++ b/src/providers/data_provider_iface_generated.h
@@ -0,0 +1,55 @@
+/* The following declarations are auto-generated from data_provider_iface.xml */
+
+#ifndef __DATA_PROVIDER_IFACE_XML__
+#define __DATA_PROVIDER_IFACE_XML__
+
+#include "sbus/sssd_dbus.h"
+
+/* ------------------------------------------------------------------------
+ * DBus Vtable handler structures
+ *
+ * These structures are filled in by implementors of the different
+ * dbus interfaces to handle method calls.
+ *
+ * Handler functions of type sbus_msg_handler_fn accept raw messages,
+ * other handlers will be typed appropriately. If a handler that is
+ * set to NULL is invoked it will result in a
+ * org.freedesktop.DBus.Error.NotSupported error for the caller.
+ */
+
+/* vtable for org.freedesktop.sssd.dataprovider */
+struct data_provider_iface {
+ struct sbus_vtable vtable; /* derive from sbus_vtable */
+ sbus_msg_handler_fn RegisterService;
+ sbus_msg_handler_fn pamHandler;
+ sbus_msg_handler_fn sudoHandler;
+ sbus_msg_handler_fn autofsHandler;
+ sbus_msg_handler_fn hostHandler;
+ sbus_msg_handler_fn getDomains;
+ sbus_msg_handler_fn getAccountInfo;
+};
+
+/* vtable for org.freedesktop.sssd.dataprovider_rev */
+struct data_provider_rev_iface {
+ struct sbus_vtable vtable; /* derive from sbus_vtable */
+ sbus_msg_handler_fn updateCache;
+ sbus_msg_handler_fn initgrCheck;
+};
+
+/* ------------------------------------------------------------------------
+ * DBus Interface Metadata
+ *
+ * These structure definitions are filled in with the information about
+ * the interfaces, methods, properties and so on.
+ *
+ * The actual definitions are found in the accompanying C file next
+ * to this header.
+ */
+
+/* interface info for org.freedesktop.sssd.dataprovider */
+extern const struct sbus_interface_meta data_provider_iface_meta;
+
+/* interface info for org.freedesktop.sssd.dataprovider_rev */
+extern const struct sbus_interface_meta data_provider_rev_iface_meta;
+
+#endif /* __DATA_PROVIDER_IFACE_XML__ */
diff --git a/src/providers/proxy/proxy_child.c b/src/providers/proxy/proxy_child.c
index 3a0ea02fe..395868087 100644
--- a/src/providers/proxy/proxy_child.c
+++ b/src/providers/proxy/proxy_child.c
@@ -49,16 +49,20 @@
static int pc_pam_handler(DBusMessage *message, struct sbus_connection *conn);
-struct sbus_method pc_methods[] = {
- { DP_METHOD_PAMHANDLER, pc_pam_handler },
- { NULL, NULL }
+struct data_provider_iface pc_methods = {
+ { &data_provider_iface_meta, 0 },
+ .RegisterService = NULL,
+ .pamHandler = pc_pam_handler,
+ .sudoHandler = NULL,
+ .autofsHandler = NULL,
+ .hostHandler = NULL,
+ .getDomains = NULL,
+ .getAccountInfo = NULL,
};
struct sbus_interface pc_interface = {
- DP_INTERFACE,
DP_PATH,
- SBUS_DEFAULT_VTABLE,
- pc_methods,
+ &pc_methods.vtable,
NULL
};
diff --git a/src/providers/proxy/proxy_init.c b/src/providers/proxy/proxy_init.c
index ae73fe702..60ae4a950 100644
--- a/src/providers/proxy/proxy_init.c
+++ b/src/providers/proxy/proxy_init.c
@@ -30,16 +30,20 @@
static int client_registration(DBusMessage *message,
struct sbus_connection *conn);
-static struct sbus_method proxy_methods[] = {
- { DP_METHOD_REGISTER, client_registration },
- { NULL, NULL }
+static struct data_provider_iface proxy_methods = {
+ { &data_provider_iface_meta, 0 },
+ .RegisterService = client_registration,
+ .pamHandler = NULL,
+ .sudoHandler = NULL,
+ .autofsHandler = NULL,
+ .hostHandler = NULL,
+ .getDomains = NULL,
+ .getAccountInfo = NULL,
};
struct sbus_interface proxy_interface = {
- DP_INTERFACE,
DP_PATH,
- SBUS_DEFAULT_VTABLE,
- proxy_methods,
+ &proxy_methods.vtable,
NULL
};
diff --git a/src/responder/autofs/autofssrv.c b/src/responder/autofs/autofssrv.c
index 12f318eee..5ce9ae023 100644
--- a/src/responder/autofs/autofssrv.c
+++ b/src/responder/autofs/autofssrv.c
@@ -32,31 +32,38 @@
static int autofs_clean_hash_table(DBusMessage *message,
struct sbus_connection *conn);
-struct sbus_method monitor_autofs_methods[] = {
- { MON_CLI_METHOD_PING, monitor_common_pong },
- { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
- { MON_CLI_METHOD_ROTATE, responder_logrotate },
- { MON_CLI_METHOD_CLEAR_ENUM_CACHE, autofs_clean_hash_table },
- { NULL, NULL }
+struct mon_cli_iface monitor_autofs_methods = {
+ { &mon_cli_iface_meta, 0 },
+ .ping = monitor_common_pong,
+ .resInit = monitor_common_res_init,
+ .shutDown = NULL,
+ .goOffline = NULL,
+ .resetOffline = NULL,
+ .rotateLogs = responder_logrotate,
+ .clearMemcache = NULL,
+ .clearEnumCache = autofs_clean_hash_table,
};
struct sbus_interface monitor_autofs_interface = {
- MONITOR_INTERFACE,
MONITOR_PATH,
- SBUS_DEFAULT_VTABLE,
- monitor_autofs_methods,
+ &monitor_autofs_methods.vtable,
NULL
};
-static struct sbus_method autofs_dp_methods[] = {
- { NULL, NULL }
+static struct data_provider_iface autofs_dp_methods = {
+ { &data_provider_iface_meta, 0 },
+ .RegisterService = NULL,
+ .pamHandler = NULL,
+ .sudoHandler = NULL,
+ .autofsHandler = NULL,
+ .hostHandler = NULL,
+ .getDomains = NULL,
+ .getAccountInfo = NULL,
};
struct sbus_interface autofs_dp_interface = {
- DP_INTERFACE,
DP_PATH,
- SBUS_DEFAULT_VTABLE,
- autofs_dp_methods,
+ &autofs_dp_methods.vtable,
NULL
};
diff --git a/src/responder/nss/nsssrv.c b/src/responder/nss/nsssrv.c
index a99cc73bb..05408db59 100644
--- a/src/responder/nss/nsssrv.c
+++ b/src/responder/nss/nsssrv.c
@@ -60,20 +60,21 @@ static int nss_clear_memcache(DBusMessage *message,
static int nss_clear_netgroup_hash_table(DBusMessage *message,
struct sbus_connection *conn);
-struct sbus_method monitor_nss_methods[] = {
- { MON_CLI_METHOD_PING, monitor_common_pong },
- { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
- { MON_CLI_METHOD_ROTATE, responder_logrotate },
- { MON_CLI_METHOD_CLEAR_MEMCACHE, nss_clear_memcache},
- { MON_CLI_METHOD_CLEAR_ENUM_CACHE, nss_clear_netgroup_hash_table},
- { NULL, NULL }
+struct mon_cli_iface monitor_nss_methods = {
+ { &mon_cli_iface_meta, 0 },
+ .ping = monitor_common_pong,
+ .resInit = monitor_common_res_init,
+ .shutDown = NULL,
+ .goOffline = NULL,
+ .resetOffline = NULL,
+ .rotateLogs = responder_logrotate,
+ .clearMemcache = nss_clear_memcache,
+ .clearEnumCache = nss_clear_netgroup_hash_table
};
struct sbus_interface monitor_nss_interface = {
- MONITOR_INTERFACE,
MONITOR_PATH,
- SBUS_DEFAULT_VTABLE,
- monitor_nss_methods,
+ &monitor_nss_methods.vtable,
NULL
};
@@ -372,17 +373,15 @@ static int nss_memcache_initgr_check(DBusMessage *message,
return EOK;
}
-static struct sbus_method nss_dp_methods[] = {
- { DP_REV_METHOD_UPDATE_CACHE, nss_update_memcache },
- { DP_REV_METHOD_INITGR_CHECK, nss_memcache_initgr_check },
- { NULL, NULL }
+static struct data_provider_rev_iface nss_dp_methods = {
+ { &data_provider_rev_iface_meta, 0 },
+ .updateCache = nss_update_memcache,
+ .initgrCheck = nss_memcache_initgr_check
};
struct sbus_interface nss_dp_interface = {
- DP_REV_INTERFACE,
DP_PATH,
- SBUS_DEFAULT_VTABLE,
- nss_dp_methods,
+ &nss_dp_methods.vtable,
NULL
};
diff --git a/src/responder/pac/pacsrv.c b/src/responder/pac/pacsrv.c
index ee64dc866..81eb303ae 100644
--- a/src/responder/pac/pacsrv.c
+++ b/src/responder/pac/pacsrv.c
@@ -48,30 +48,38 @@
#define DEFAULT_PAC_FD_LIMIT 8192
#define DEFAULT_ALLOWED_UIDS "0"
-struct sbus_method monitor_pac_methods[] = {
- { MON_CLI_METHOD_PING, monitor_common_pong },
- { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
- { MON_CLI_METHOD_ROTATE, responder_logrotate },
- { NULL, NULL }
+struct mon_cli_iface monitor_pac_methods = {
+ { &mon_cli_iface_meta, 0 },
+ .ping = monitor_common_pong,
+ .resInit = monitor_common_res_init,
+ .shutDown = NULL,
+ .goOffline = NULL,
+ .resetOffline = NULL,
+ .rotateLogs = responder_logrotate,
+ .clearMemcache = NULL,
+ .clearEnumCache = NULL,
};
struct sbus_interface monitor_pac_interface = {
- MONITOR_INTERFACE,
MONITOR_PATH,
- SBUS_DEFAULT_VTABLE,
- monitor_pac_methods,
+ &monitor_pac_methods.vtable,
NULL
};
-static struct sbus_method pac_dp_methods[] = {
- { NULL, NULL }
+static struct data_provider_iface pac_dp_methods = {
+ { &data_provider_iface_meta, 0 },
+ .RegisterService = NULL,
+ .pamHandler = NULL,
+ .sudoHandler = NULL,
+ .autofsHandler = NULL,
+ .hostHandler = NULL,
+ .getDomains = NULL,
+ .getAccountInfo = NULL,
};
struct sbus_interface pac_dp_interface = {
- DP_INTERFACE,
DP_PATH,
- SBUS_DEFAULT_VTABLE,
- pac_dp_methods,
+ &pac_dp_methods.vtable,
NULL
};
diff --git a/src/responder/pam/pamsrv.c b/src/responder/pam/pamsrv.c
index 54416a8d3..af1d1493d 100644
--- a/src/responder/pam/pamsrv.c
+++ b/src/responder/pam/pamsrv.c
@@ -47,30 +47,38 @@
#define DEFAULT_PAM_FD_LIMIT 8192
-struct sbus_method monitor_pam_methods[] = {
- { MON_CLI_METHOD_PING, monitor_common_pong },
- { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
- { MON_CLI_METHOD_ROTATE, responder_logrotate },
- { NULL, NULL }
+struct mon_cli_iface monitor_pam_methods = {
+ { &mon_cli_iface_meta, 0 },
+ .ping = monitor_common_pong,
+ .resInit = monitor_common_res_init,
+ .shutDown = NULL,
+ .goOffline = NULL,
+ .resetOffline = NULL,
+ .rotateLogs = responder_logrotate,
+ .clearMemcache = NULL,
+ .clearEnumCache = NULL,
};
struct sbus_interface monitor_pam_interface = {
- MONITOR_INTERFACE,
MONITOR_PATH,
- SBUS_DEFAULT_VTABLE,
- monitor_pam_methods,
+ &monitor_pam_methods.vtable,
NULL
};
-static struct sbus_method pam_dp_methods[] = {
- { NULL, NULL }
+static struct data_provider_iface pam_dp_methods = {
+ { &data_provider_iface_meta, 0 },
+ .RegisterService = NULL,
+ .pamHandler = NULL,
+ .sudoHandler = NULL,
+ .autofsHandler = NULL,
+ .hostHandler = NULL,
+ .getDomains = NULL,
+ .getAccountInfo = NULL,
};
struct sbus_interface pam_dp_interface = {
- DP_INTERFACE,
DP_PATH,
- SBUS_DEFAULT_VTABLE,
- pam_dp_methods,
+ &pam_dp_methods.vtable,
NULL
};
diff --git a/src/responder/ssh/sshsrv.c b/src/responder/ssh/sshsrv.c
index ea943afda..fb0738f6c 100644
--- a/src/responder/ssh/sshsrv.c
+++ b/src/responder/ssh/sshsrv.c
@@ -28,30 +28,38 @@
#include "responder/ssh/sshsrv_private.h"
#include "providers/data_provider.h"
-struct sbus_method monitor_ssh_methods[] = {
- { MON_CLI_METHOD_PING, monitor_common_pong },
- { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
- { MON_CLI_METHOD_ROTATE, responder_logrotate },
- { NULL, NULL }
+struct mon_cli_iface monitor_ssh_methods = {
+ { &mon_cli_iface_meta, 0 },
+ .ping = monitor_common_pong,
+ .resInit = monitor_common_res_init,
+ .shutDown = NULL,
+ .goOffline = NULL,
+ .resetOffline = NULL,
+ .rotateLogs = responder_logrotate,
+ .clearMemcache = NULL,
+ .clearEnumCache = NULL,
};
struct sbus_interface monitor_ssh_interface = {
- MONITOR_INTERFACE,
MONITOR_PATH,
- SBUS_DEFAULT_VTABLE,
- monitor_ssh_methods,
+ &monitor_ssh_methods.vtable,
NULL
};
-static struct sbus_method ssh_dp_methods[] = {
- { NULL, NULL }
+static struct data_provider_iface ssh_dp_methods = {
+ { &data_provider_iface_meta, 0 },
+ .RegisterService = NULL,
+ .pamHandler = NULL,
+ .sudoHandler = NULL,
+ .autofsHandler = NULL,
+ .hostHandler = NULL,
+ .getDomains = NULL,
+ .getAccountInfo = NULL,
};
struct sbus_interface ssh_dp_interface = {
- DP_INTERFACE,
DP_PATH,
- SBUS_DEFAULT_VTABLE,
- ssh_dp_methods,
+ &ssh_dp_methods.vtable,
NULL
};
diff --git a/src/responder/sudo/sudosrv.c b/src/responder/sudo/sudosrv.c
index b821c96cd..1ad260b35 100644
--- a/src/responder/sudo/sudosrv.c
+++ b/src/responder/sudo/sudosrv.c
@@ -28,30 +28,38 @@
#include "responder/sudo/sudosrv_private.h"
#include "providers/data_provider.h"
-struct sbus_method monitor_sudo_methods[] = {
- { MON_CLI_METHOD_PING, monitor_common_pong },
- { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
- { MON_CLI_METHOD_ROTATE, responder_logrotate },
- { NULL, NULL }
+struct mon_cli_iface monitor_sudo_methods = {
+ { &mon_cli_iface_meta, 0 },
+ .ping = monitor_common_pong,
+ .resInit = monitor_common_res_init,
+ .shutDown = NULL,
+ .goOffline = NULL,
+ .resetOffline = NULL,
+ .rotateLogs = responder_logrotate,
+ .clearMemcache = NULL,
+ .clearEnumCache = NULL,
};
struct sbus_interface monitor_sudo_interface = {
- MONITOR_INTERFACE,
MONITOR_PATH,
- SBUS_DEFAULT_VTABLE,
- monitor_sudo_methods,
+ &monitor_sudo_methods.vtable,
NULL
};
-static struct sbus_method sudo_dp_methods[] = {
- { NULL, NULL }
+static struct data_provider_iface sudo_dp_methods = {
+ { &data_provider_iface_meta, 0 },
+ .RegisterService = NULL,
+ .pamHandler = NULL,
+ .sudoHandler = NULL,
+ .autofsHandler = NULL,
+ .hostHandler = NULL,
+ .getDomains = NULL,
+ .getAccountInfo = NULL,
};
struct sbus_interface sudo_dp_interface = {
- DP_INTERFACE,
DP_PATH,
- SBUS_DEFAULT_VTABLE,
- sudo_dp_methods,
+ &sudo_dp_methods.vtable,
NULL
};
diff --git a/src/sbus/sssd_dbus.h b/src/sbus/sssd_dbus.h
index 5e9c1c69e..3c99b3100 100644
--- a/src/sbus/sssd_dbus.h
+++ b/src/sbus/sssd_dbus.h
@@ -74,18 +74,9 @@ struct sbus_vtable {
#define DBUS_INTROSPECT_INTERFACE "org.freedesktop.DBus.Introspectable"
#define DBUS_INTROSPECT_METHOD "Introspect"
-#define SBUS_DEFAULT_VTABLE { NULL, sbus_message_handler, NULL, NULL, NULL, NULL }
-
-struct sbus_method {
- const char *method;
- sbus_msg_handler_fn fn;
-};
-
struct sbus_interface {
- const char *interface;
const char *path;
- DBusObjectPathVTable vtable;
- struct sbus_method *methods;
+ struct sbus_vtable *vtable;
sbus_msg_handler_fn introspect_fn;
};
diff --git a/src/sbus/sssd_dbus_connection.c b/src/sbus/sssd_dbus_connection.c
index b32164827..e3f5e163d 100644
--- a/src/sbus/sssd_dbus_connection.c
+++ b/src/sbus/sssd_dbus_connection.c
@@ -24,10 +24,14 @@
#include "dbus/dbus.h"
#include "sbus/sssd_dbus.h"
#include "sbus/sssd_dbus_private.h"
+#include "sbus/sssd_dbus_meta.h"
/* Types */
struct dbus_ctx_list;
+static DBusObjectPathVTable dbus_object_path_vtable =
+ { NULL, sbus_message_handler, NULL, NULL, NULL, NULL };
+
struct sbus_interface_p {
struct sbus_interface_p *prev, *next;
struct sbus_connection *conn;
@@ -393,6 +397,10 @@ static int sbus_reply_internal_error(DBusMessage *message,
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
+/* Looks up a vtable func, in a struct derived from struct sbus_vtable */
+#define VTABLE_FUNC(vtable, offset) \
+ (*((void **)((char *)(vtable) + (offset))))
+
/* messsage_handler
* Receive messages and process them
*/
@@ -401,24 +409,26 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn,
void *user_data)
{
struct sbus_interface_p *intf_p;
- const char *method;
+ const char *msg_method;
const char *path;
const char *msg_interface;
DBusMessage *reply = NULL;
- int i, ret;
- int found;
+ const struct sbus_method_meta *method;
+ const struct sbus_interface_meta *interface;
+ sbus_msg_handler_fn handler_fn;
+ int ret;
if (!user_data) {
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
intf_p = talloc_get_type(user_data, struct sbus_interface_p);
- method = dbus_message_get_member(message);
- DEBUG(SSSDBG_TRACE_ALL, "Received SBUS method [%s]\n", method);
+ msg_method = dbus_message_get_member(message);
+ DEBUG(SSSDBG_TRACE_ALL, "Received SBUS method [%s]\n", msg_method);
path = dbus_message_get_path(message);
msg_interface = dbus_message_get_interface(message);
- if (!method || !path || !msg_interface)
+ if (!msg_method || !path || !msg_interface)
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
/* Validate the D-BUS path */
@@ -426,26 +436,33 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn,
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
/* Validate the method interface */
- if (strcmp(msg_interface, intf_p->intf->interface) == 0) {
- found = 0;
- for (i = 0; intf_p->intf->methods[i].method != NULL; i++) {
- if (strcmp(method, intf_p->intf->methods[i].method) == 0) {
- found = 1;
- ret = intf_p->intf->methods[i].fn(message, intf_p->conn);
- if (ret != EOK) {
- return sbus_reply_internal_error(message, intf_p->conn);
- }
- break;
- }
- }
-
- if (!found) {
+ interface = intf_p->intf->vtable->meta;
+ if (strcmp(msg_interface, interface->name) == 0) {
+ handler_fn = NULL;
+ method = sbus_meta_find_method(interface, msg_method);
+ if (method && method->vtable_offset)
+ handler_fn = VTABLE_FUNC(intf_p->intf->vtable, method->vtable_offset);
+
+ if (!method) {
/* Reply DBUS_ERROR_UNKNOWN_METHOD */
DEBUG(SSSDBG_CRIT_FAILURE,
- "No matching method found for %s.\n", method);
+ "No matching method found for %s.\n", msg_method);
reply = dbus_message_new_error(message, DBUS_ERROR_UNKNOWN_METHOD, NULL);
sbus_conn_send_reply(intf_p->conn, reply);
dbus_message_unref(reply);
+
+ } else if (!handler_fn) {
+ /* Reply DBUS_ERROR_NOT_SUPPORTED */
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ "No handler provided found for %s.\n", msg_method);
+ reply = dbus_message_new_error(message, DBUS_ERROR_NOT_SUPPORTED, NULL);
+ sbus_conn_send_reply(intf_p->conn, reply);
+ dbus_message_unref(reply);
+
+ } else {
+ ret = handler_fn(message, intf_p->conn);
+ if (ret != EOK)
+ return sbus_reply_internal_error(message, intf_p->conn);
}
}
else {
@@ -453,7 +470,7 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn,
* This is usually only useful for system bus connections
*/
if (strcmp(msg_interface, DBUS_INTROSPECT_INTERFACE) == 0 &&
- strcmp(method, DBUS_INTROSPECT_METHOD) == 0)
+ strcmp(msg_method, DBUS_INTROSPECT_METHOD) == 0)
{
if (intf_p->intf->introspect_fn) {
/* If we have been asked for introspection data and we have
@@ -482,7 +499,7 @@ int sbus_conn_add_interface(struct sbus_connection *conn,
dbus_bool_t dbret;
const char *path;
- if (!conn || !intf || !intf->vtable.message_function) {
+ if (!conn || !intf || !intf->vtable || !intf->vtable->meta) {
return EINVAL;
}
@@ -504,7 +521,7 @@ int sbus_conn_add_interface(struct sbus_connection *conn,
DLIST_ADD(conn->intf_list, intf_p);
dbret = dbus_connection_register_object_path(conn->dbus.conn,
- path, &intf->vtable, intf_p);
+ path, &dbus_object_path_vtable, intf_p);
if (!dbret) {
DEBUG(SSSDBG_FATAL_FAILURE,
"Could not register object path to the connection.\n");
@@ -585,7 +602,7 @@ static void sbus_reconnect(struct tevent_context *ev,
while (iter) {
dbret = dbus_connection_register_object_path(conn->dbus.conn,
iter->intf->path,
- &iter->intf->vtable,
+ &dbus_object_path_vtable,
iter);
if (!dbret) {
DEBUG(SSSDBG_FATAL_FAILURE,