summaryrefslogtreecommitdiffstats
path: root/src/responder
diff options
context:
space:
mode:
authorStef Walter <stefw@redhat.com>2014-02-18 14:32:54 +0100
committerJakub Hrozek <jhrozek@redhat.com>2014-03-14 13:42:20 +0100
commit07e941c1bbdc752142bbd3b838c540bc7ecd0ed7 (patch)
tree56453ab3ece875a6f80fc374fadaef07584484b7 /src/responder
parentd9577dbd92555b0755881e37724019ef9c578404 (diff)
downloadsssd-07e941c1bbdc752142bbd3b838c540bc7ecd0ed7.tar.gz
sssd-07e941c1bbdc752142bbd3b838c540bc7ecd0ed7.tar.xz
sssd-07e941c1bbdc752142bbd3b838c540bc7ecd0ed7.zip
sbus: Refactor how we export DBus interfaces
Most importantly, stop using per connection private data. This doesn't scale when you have more than one thing exporting or exported on a connection. Remove struct sbus_interface and expand sbus_conn_add_interface() function. Remove various struct sbus_interface args to connection initialization functions and make callers use sbus_conn_add_interface() directly. The old method was optimized for exporting one interface on a connection. We'll have connections that export zero, one or more interfaces. To export an interface on a DBus server, call sbus_conn_add_interface() from within the sbus_server_conn_init_fn. To export an interface on a DBus client, call sbus_conn_add_interface() after sbus_new_connection() returns. As before struct sbus_interface represents an object exported via DBus. However it is now talloc allocated. One can set instance data on the struct sbus_interface. This instance data is passed to the various handlers and used in their implementation. However, we now have type safe interface exporting in the various high level sss_process_init() sss_monitor_init() and so on. Introspection support was not in use, and is now gone until we implement it using the metadata (future patch). Reviewed-by: Jakub Hrozek <jhrozek@redhat.com> Reviewed-by: Pavel Březina <pbrezina@redhat.com> Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
Diffstat (limited to 'src/responder')
-rw-r--r--src/responder/autofs/autofssrv.c23
-rw-r--r--src/responder/common/responder.h18
-rw-r--r--src/responder/common/responder_common.c27
-rw-r--r--src/responder/nss/nsssrv.c41
-rw-r--r--src/responder/pac/pacsrv.c17
-rw-r--r--src/responder/pam/pamsrv.c17
-rw-r--r--src/responder/ssh/sshsrv.c16
-rw-r--r--src/responder/sudo/sudosrv.c16
8 files changed, 56 insertions, 119 deletions
diff --git a/src/responder/autofs/autofssrv.c b/src/responder/autofs/autofssrv.c
index b447a0634..9b5aa02dd 100644
--- a/src/responder/autofs/autofssrv.c
+++ b/src/responder/autofs/autofssrv.c
@@ -29,7 +29,7 @@
#include "providers/data_provider.h"
#include "responder/autofs/autofs_private.h"
-static int autofs_clean_hash_table(struct sbus_request *dbus_req);
+static int autofs_clean_hash_table(struct sbus_request *dbus_req, void *data);
struct mon_cli_iface monitor_autofs_methods = {
{ &mon_cli_iface_meta, 0 },
@@ -43,12 +43,6 @@ struct mon_cli_iface monitor_autofs_methods = {
.clearEnumCache = autofs_clean_hash_table,
};
-struct sbus_interface monitor_autofs_interface = {
- MONITOR_PATH,
- &monitor_autofs_methods.vtable,
- NULL
-};
-
static struct data_provider_iface autofs_dp_methods = {
{ &data_provider_iface_meta, 0 },
.RegisterService = NULL,
@@ -60,12 +54,6 @@ static struct data_provider_iface autofs_dp_methods = {
.getAccountInfo = NULL,
};
-struct sbus_interface autofs_dp_interface = {
- DP_PATH,
- &autofs_dp_methods.vtable,
- NULL
-};
-
static errno_t
autofs_get_config(struct autofs_ctx *actx,
struct confdb_ctx *cdb)
@@ -111,10 +99,9 @@ autofs_dp_reconnect_init(struct sbus_connection *conn,
be_conn->domain->name);
}
-static int autofs_clean_hash_table(struct sbus_request *dbus_req)
+static int autofs_clean_hash_table(struct sbus_request *dbus_req, void *data)
{
- struct resp_ctx *rctx = talloc_get_type(sbus_conn_get_private_data(dbus_req->conn),
- struct resp_ctx);
+ struct resp_ctx *rctx = talloc_get_type(data, struct resp_ctx);
struct autofs_ctx *actx =
talloc_get_type(rctx->pvt_ctx, struct autofs_ctx);
errno_t ret;
@@ -148,9 +135,9 @@ autofs_process_init(TALLOC_CTX *mem_ctx,
CONFDB_AUTOFS_CONF_ENTRY,
SSS_AUTOFS_SBUS_SERVICE_NAME,
SSS_AUTOFS_SBUS_SERVICE_VERSION,
- &monitor_autofs_interface,
+ &monitor_autofs_methods,
"autofs",
- &autofs_dp_interface,
+ &autofs_dp_methods.vtable,
&rctx);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE, "sss_process_init() failed\n");
diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h
index 3cf801516..479cd4c5e 100644
--- a/src/responder/common/responder.h
+++ b/src/responder/common/responder.h
@@ -70,7 +70,6 @@ struct be_conn {
struct sss_domain_info *domain;
char *sbus_address;
- struct sbus_interface *intf;
struct sbus_connection *conn;
};
@@ -144,7 +143,16 @@ struct sss_cmd_table {
int (*fn)(struct cli_ctx *cctx);
};
-/* responder_common.c */
+/* from generated code */
+struct mon_cli_iface;
+
+/*
+ * responder_common.c
+ *
+ * NOTE: We would like to use more strong typing for the @dp_vtable argument
+ * but can't since it accepts either a struct data_provider_iface
+ * or struct data_provider_rev_iface. So pass the base struct: sbus_vtable
+ */
int sss_process_init(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct confdb_ctx *cdb,
@@ -154,9 +162,9 @@ int sss_process_init(TALLOC_CTX *mem_ctx,
const char *confdb_service_path,
const char *svc_name,
uint16_t svc_version,
- struct sbus_interface *monitor_intf,
+ struct mon_cli_iface *monitor_intf,
const char *cli_name,
- struct sbus_interface *dp_intf,
+ struct sbus_vtable *dp_intf,
struct resp_ctx **responder_ctx);
int sss_dp_get_domain_conn(struct resp_ctx *rctx, const char *domain,
@@ -207,7 +215,7 @@ struct dp_callback_ctx {
void handle_requests_after_reconnect(struct resp_ctx *rctx);
-int responder_logrotate(struct sbus_request *dbus_req);
+int responder_logrotate(struct sbus_request *dbus_req, void *data);
/* Each responder-specific request must create a constructor
* function that creates a DBus Message that would be sent to
diff --git a/src/responder/common/responder_common.c b/src/responder/common/responder_common.c
index 209bf5b01..9abda18d0 100644
--- a/src/responder/common/responder_common.c
+++ b/src/responder/common/responder_common.c
@@ -535,10 +535,11 @@ static void idle_handler(struct tevent_context *ev,
}
static int sss_dp_init(struct resp_ctx *rctx,
- struct sbus_interface *intf,
+ struct sbus_vtable *dp_intf,
const char *cli_name,
struct sss_domain_info *domain)
{
+ struct sbus_interface *intf;
struct be_conn *be_conn;
int ret;
@@ -547,7 +548,6 @@ static int sss_dp_init(struct resp_ctx *rctx,
be_conn->cli_name = cli_name;
be_conn->domain = domain;
- be_conn->intf = intf;
be_conn->rctx = rctx;
/* Set up SBUS connection to the monitor */
@@ -558,13 +558,23 @@ static int sss_dp_init(struct resp_ctx *rctx,
}
ret = sbus_client_init(rctx, rctx->ev,
be_conn->sbus_address,
- intf, &be_conn->conn,
- NULL, rctx);
+ &be_conn->conn);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE, "Failed to connect to monitor services.\n");
return ret;
}
+ intf = sbus_new_interface(rctx, DP_PATH, dp_intf, rctx);
+ if (!intf) {
+ ret = ENOMEM;
+ } else {
+ ret = sbus_conn_add_interface(be_conn->conn, intf);
+ }
+ if (ret != EOK) {
+ DEBUG(SSSDBG_FATAL_FAILURE, "Failed to export data provider.\n");
+ return ret;
+ }
+
DLIST_ADD_END(rctx->be_conns, be_conn, struct be_conn *);
/* Identify ourselves to the DP */
@@ -763,9 +773,9 @@ int sss_process_init(TALLOC_CTX *mem_ctx,
const char *confdb_service_path,
const char *svc_name,
uint16_t svc_version,
- struct sbus_interface *monitor_intf,
+ struct mon_cli_iface *monitor_intf,
const char *cli_name,
- struct sbus_interface *dp_intf,
+ struct sbus_vtable *dp_intf,
struct resp_ctx **responder_ctx)
{
struct resp_ctx *rctx;
@@ -990,11 +1000,10 @@ done:
return ret;
}
-int responder_logrotate(struct sbus_request *dbus_req)
+int responder_logrotate(struct sbus_request *dbus_req, void *data)
{
errno_t ret;
- struct resp_ctx *rctx = talloc_get_type(sbus_conn_get_private_data(dbus_req->conn),
- struct resp_ctx);
+ struct resp_ctx *rctx = talloc_get_type(data, struct resp_ctx);
ret = monitor_common_rotate_logs(rctx->cdb, rctx->confdb_service_path);
if (ret != EOK) return ret;
diff --git a/src/responder/nss/nsssrv.c b/src/responder/nss/nsssrv.c
index 05bcdda07..ca4fbfd02 100644
--- a/src/responder/nss/nsssrv.c
+++ b/src/responder/nss/nsssrv.c
@@ -55,8 +55,8 @@
#define SHELL_REALLOC_INCREMENT 5
#define SHELL_REALLOC_MAX 50
-static int nss_clear_memcache(struct sbus_request *dbus_req);
-static int nss_clear_netgroup_hash_table(struct sbus_request *dbus_req);
+static int nss_clear_memcache(struct sbus_request *dbus_req, void *data);
+static int nss_clear_netgroup_hash_table(struct sbus_request *dbus_req, void *data);
struct mon_cli_iface monitor_nss_methods = {
{ &mon_cli_iface_meta, 0 },
@@ -70,18 +70,11 @@ struct mon_cli_iface monitor_nss_methods = {
.clearEnumCache = nss_clear_netgroup_hash_table
};
-struct sbus_interface monitor_nss_interface = {
- MONITOR_PATH,
- &monitor_nss_methods.vtable,
- NULL,
-};
-
-static int nss_clear_memcache(struct sbus_request *dbus_req)
+static int nss_clear_memcache(struct sbus_request *dbus_req, void *data)
{
errno_t ret;
int memcache_timeout;
- struct resp_ctx *rctx = talloc_get_type(sbus_conn_get_private_data(dbus_req->conn),
- struct resp_ctx);
+ struct resp_ctx *rctx = talloc_get_type(data, struct resp_ctx);
struct nss_ctx *nctx = (struct nss_ctx*) rctx->pvt_ctx;
ret = unlink(SSS_NSS_MCACHE_DIR"/"CLEAR_MC_FLAG);
@@ -134,11 +127,10 @@ done:
return sbus_request_return_and_finish(dbus_req, DBUS_TYPE_INVALID);
}
-static int nss_clear_netgroup_hash_table(struct sbus_request *dbus_req)
+static int nss_clear_netgroup_hash_table(struct sbus_request *dbus_req, void *data)
{
errno_t ret;
- struct resp_ctx *rctx = talloc_get_type(sbus_conn_get_private_data(dbus_req->conn),
- struct resp_ctx);
+ struct resp_ctx *rctx = talloc_get_type(data, struct resp_ctx);
struct nss_ctx *nctx = (struct nss_ctx*) rctx->pvt_ctx;
ret = nss_orphan_netgroups(nctx);
@@ -304,10 +296,9 @@ done:
return ret;
}
-static int nss_update_memcache(struct sbus_request *dbus_req)
+static int nss_update_memcache(struct sbus_request *dbus_req, void *data)
{
- struct resp_ctx *rctx = talloc_get_type(sbus_conn_get_private_data(dbus_req->conn),
- struct resp_ctx);
+ struct resp_ctx *rctx = talloc_get_type(data, struct resp_ctx);
struct nss_ctx *nctx = talloc_get_type(rctx->pvt_ctx, struct nss_ctx);
nss_update_pw_memcache(nctx);
@@ -316,10 +307,9 @@ static int nss_update_memcache(struct sbus_request *dbus_req)
return EOK;
}
-static int nss_memcache_initgr_check(struct sbus_request *dbus_req)
+static int nss_memcache_initgr_check(struct sbus_request *dbus_req, void *data)
{
- struct resp_ctx *rctx = talloc_get_type(sbus_conn_get_private_data(dbus_req->conn),
- struct resp_ctx);
+ struct resp_ctx *rctx = talloc_get_type(data, struct resp_ctx);
struct nss_ctx *nctx = talloc_get_type(rctx->pvt_ctx, struct nss_ctx);
DBusError dbus_error;
dbus_bool_t dbret;
@@ -359,13 +349,6 @@ static struct data_provider_rev_iface nss_dp_methods = {
.initgrCheck = nss_memcache_initgr_check
};
-struct sbus_interface nss_dp_interface = {
- DP_PATH,
- &nss_dp_methods.vtable,
- NULL
-};
-
-
static void nss_dp_reconnect_init(struct sbus_connection *conn,
int status, void *pvt)
{
@@ -417,8 +400,8 @@ int nss_process_init(TALLOC_CTX *mem_ctx,
CONFDB_NSS_CONF_ENTRY,
NSS_SBUS_SERVICE_NAME,
NSS_SBUS_SERVICE_VERSION,
- &monitor_nss_interface,
- "NSS", &nss_dp_interface,
+ &monitor_nss_methods,
+ "NSS", &nss_dp_methods.vtable,
&rctx);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE, "sss_process_init() failed\n");
diff --git a/src/responder/pac/pacsrv.c b/src/responder/pac/pacsrv.c
index 04a6200e0..bff15058a 100644
--- a/src/responder/pac/pacsrv.c
+++ b/src/responder/pac/pacsrv.c
@@ -60,12 +60,6 @@ struct mon_cli_iface monitor_pac_methods = {
.clearEnumCache = NULL,
};
-struct sbus_interface monitor_pac_interface = {
- MONITOR_PATH,
- &monitor_pac_methods.vtable,
- NULL
-};
-
static struct data_provider_iface pac_dp_methods = {
{ &data_provider_iface_meta, 0 },
.RegisterService = NULL,
@@ -77,13 +71,6 @@ static struct data_provider_iface pac_dp_methods = {
.getAccountInfo = NULL,
};
-struct sbus_interface pac_dp_interface = {
- DP_PATH,
- &pac_dp_methods.vtable,
- NULL
-};
-
-
/* TODO: check if this can be made generic for all responders */
static void pac_dp_reconnect_init(struct sbus_connection *conn,
int status, void *pvt)
@@ -135,8 +122,8 @@ int pac_process_init(TALLOC_CTX *mem_ctx,
CONFDB_PAC_CONF_ENTRY,
PAC_SBUS_SERVICE_NAME,
PAC_SBUS_SERVICE_VERSION,
- &monitor_pac_interface,
- "PAC", &pac_dp_interface,
+ &monitor_pac_methods,
+ "PAC", &pac_dp_methods.vtable,
&rctx);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE, "sss_process_init() failed\n");
diff --git a/src/responder/pam/pamsrv.c b/src/responder/pam/pamsrv.c
index 1fc9f6282..2823f01a0 100644
--- a/src/responder/pam/pamsrv.c
+++ b/src/responder/pam/pamsrv.c
@@ -59,12 +59,6 @@ struct mon_cli_iface monitor_pam_methods = {
.clearEnumCache = NULL,
};
-struct sbus_interface monitor_pam_interface = {
- MONITOR_PATH,
- &monitor_pam_methods.vtable,
- NULL
-};
-
static struct data_provider_iface pam_dp_methods = {
{ &data_provider_iface_meta, 0 },
.RegisterService = NULL,
@@ -76,13 +70,6 @@ static struct data_provider_iface pam_dp_methods = {
.getAccountInfo = NULL,
};
-struct sbus_interface pam_dp_interface = {
- DP_PATH,
- &pam_dp_methods.vtable,
- NULL
-};
-
-
static void pam_dp_reconnect_init(struct sbus_connection *conn, int status, void *pvt)
{
struct be_conn *be_conn = talloc_get_type(pvt, struct be_conn);
@@ -131,8 +118,8 @@ static int pam_process_init(TALLOC_CTX *mem_ctx,
CONFDB_PAM_CONF_ENTRY,
SSS_PAM_SBUS_SERVICE_NAME,
SSS_PAM_SBUS_SERVICE_VERSION,
- &monitor_pam_interface,
- "PAM", &pam_dp_interface,
+ &monitor_pam_methods,
+ "PAM", &pam_dp_methods.vtable,
&rctx);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE, "sss_process_init() failed\n");
diff --git a/src/responder/ssh/sshsrv.c b/src/responder/ssh/sshsrv.c
index fb0738f6c..30142ae0d 100644
--- a/src/responder/ssh/sshsrv.c
+++ b/src/responder/ssh/sshsrv.c
@@ -40,12 +40,6 @@ struct mon_cli_iface monitor_ssh_methods = {
.clearEnumCache = NULL,
};
-struct sbus_interface monitor_ssh_interface = {
- MONITOR_PATH,
- &monitor_ssh_methods.vtable,
- NULL
-};
-
static struct data_provider_iface ssh_dp_methods = {
{ &data_provider_iface_meta, 0 },
.RegisterService = NULL,
@@ -57,12 +51,6 @@ static struct data_provider_iface ssh_dp_methods = {
.getAccountInfo = NULL,
};
-struct sbus_interface ssh_dp_interface = {
- DP_PATH,
- &ssh_dp_methods.vtable,
- NULL
-};
-
static void ssh_dp_reconnect_init(struct sbus_connection *conn,
int status, void *pvt)
{
@@ -107,9 +95,9 @@ int ssh_process_init(TALLOC_CTX *mem_ctx,
CONFDB_SSH_CONF_ENTRY,
SSS_SSH_SBUS_SERVICE_NAME,
SSS_SSH_SBUS_SERVICE_VERSION,
- &monitor_ssh_interface,
+ &monitor_ssh_methods,
"SSH",
- &ssh_dp_interface,
+ &ssh_dp_methods.vtable,
&rctx);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE, "sss_process_init() failed\n");
diff --git a/src/responder/sudo/sudosrv.c b/src/responder/sudo/sudosrv.c
index 1ad260b35..a70d944a9 100644
--- a/src/responder/sudo/sudosrv.c
+++ b/src/responder/sudo/sudosrv.c
@@ -40,12 +40,6 @@ struct mon_cli_iface monitor_sudo_methods = {
.clearEnumCache = NULL,
};
-struct sbus_interface monitor_sudo_interface = {
- MONITOR_PATH,
- &monitor_sudo_methods.vtable,
- NULL
-};
-
static struct data_provider_iface sudo_dp_methods = {
{ &data_provider_iface_meta, 0 },
.RegisterService = NULL,
@@ -57,12 +51,6 @@ static struct data_provider_iface sudo_dp_methods = {
.getAccountInfo = NULL,
};
-struct sbus_interface sudo_dp_interface = {
- DP_PATH,
- &sudo_dp_methods.vtable,
- NULL
-};
-
static void sudo_dp_reconnect_init(struct sbus_connection *conn,
int status,
void *pvt)
@@ -108,9 +96,9 @@ int sudo_process_init(TALLOC_CTX *mem_ctx,
CONFDB_SUDO_CONF_ENTRY,
SSS_SUDO_SBUS_SERVICE_NAME,
SSS_SUDO_SBUS_SERVICE_VERSION,
- &monitor_sudo_interface,
+ &monitor_sudo_methods,
"SUDO",
- &sudo_dp_interface,
+ &sudo_dp_methods.vtable,
&rctx);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE, "sss_process_init() failed\n");