From 07e941c1bbdc752142bbd3b838c540bc7ecd0ed7 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Tue, 18 Feb 2014 14:32:54 +0100 Subject: sbus: Refactor how we export DBus interfaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Pavel Březina Reviewed-by: Lukáš Slebodník --- src/monitor/monitor.c | 23 +++++++++-------------- src/monitor/monitor_interfaces.h | 6 +++--- src/monitor/monitor_sbus.c | 22 ++++++++++++++++------ 3 files changed, 28 insertions(+), 23 deletions(-) (limited to 'src/monitor') diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c index 2e0f5230f..9470075b5 100644 --- a/src/monitor/monitor.c +++ b/src/monitor/monitor.c @@ -217,7 +217,7 @@ static void network_status_change_cb(void *cb_data) /* dbus_get_monitor_version * Return the monitor version over D-BUS */ -static int get_monitor_version(struct sbus_request *dbus_req) +static int get_monitor_version(struct sbus_request *dbus_req, void *data) { dbus_uint16_t version = MONITOR_VERSION; @@ -236,19 +236,17 @@ static int add_svc_conn_spy(struct mt_svc *svc); /* registers a new client. * if operation is successful also sends back the Monitor version */ -static int client_registration(struct sbus_request *dbus_req) +static int client_registration(struct sbus_request *dbus_req, void *data) { dbus_uint16_t version = MONITOR_VERSION; struct mon_init_conn *mini; struct mt_svc *svc; - void *data; DBusError dbus_error; dbus_uint16_t svc_ver; char *svc_name; dbus_bool_t dbret; int ret; - data = sbus_conn_get_private_data(dbus_req->conn); mini = talloc_get_type(data, struct mon_init_conn); if (!mini) { DEBUG(SSSDBG_FATAL_FAILURE, "Connection holds no valid init data\n"); @@ -503,12 +501,6 @@ struct mon_srv_iface monitor_methods = { .RegisterService = client_registration, }; -struct sbus_interface monitor_server_interface = { - MON_SRV_PATH, - &monitor_methods.vtable, - NULL -}; - /* monitor_dbus_init * Set up the monitor service as a D-BUS Server */ static int monitor_dbus_init(struct mt_ctx *ctx) @@ -521,8 +513,7 @@ static int monitor_dbus_init(struct mt_ctx *ctx) return ret; } - ret = sbus_new_server(ctx, ctx->ev, - monitor_address, &monitor_server_interface, + ret = sbus_new_server(ctx, ctx->ev, monitor_address, false, &ctx->sbus_srv, monitor_service_init, ctx); talloc_free(monitor_address); @@ -2309,6 +2300,7 @@ static void init_timeout(struct tevent_context *ev, */ static int monitor_service_init(struct sbus_connection *conn, void *data) { + struct sbus_interface *intf; struct mt_ctx *ctx; struct mon_init_conn *mini; struct timeval tv; @@ -2336,9 +2328,12 @@ static int monitor_service_init(struct sbus_connection *conn, void *data) return ENOMEM; } - sbus_conn_set_private_data(conn, mini); + intf = sbus_new_interface(conn, MON_SRV_PATH, &monitor_methods.vtable, mini); + if (!intf) { + return ENOMEM; + } - return EOK; + return sbus_conn_add_interface(conn, intf); } /* service_send_ping diff --git a/src/monitor/monitor_interfaces.h b/src/monitor/monitor_interfaces.h index 2970251df..c015fbc66 100644 --- a/src/monitor/monitor_interfaces.h +++ b/src/monitor/monitor_interfaces.h @@ -38,14 +38,14 @@ int monitor_get_sbus_address(TALLOC_CTX *mem_ctx, char **address); int monitor_common_send_id(struct sbus_connection *conn, const char *name, uint16_t version); -int monitor_common_pong(struct sbus_request *dbus_req); -int monitor_common_res_init(struct sbus_request *dbus_req); +int monitor_common_pong(struct sbus_request *dbus_req, void *data); +int monitor_common_res_init(struct sbus_request *dbus_req, void *data); int monitor_common_rotate_logs(struct confdb_ctx *confdb, const char *conf_entry); errno_t sss_monitor_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev, - struct sbus_interface *intf, + struct mon_cli_iface *mon_iface, const char *svc_name, uint16_t svc_version, void *pvt, diff --git a/src/monitor/monitor_sbus.c b/src/monitor/monitor_sbus.c index 92d483233..544407ca2 100644 --- a/src/monitor/monitor_sbus.c +++ b/src/monitor/monitor_sbus.c @@ -144,12 +144,12 @@ int monitor_common_send_id(struct sbus_connection *conn, return retval; } -int monitor_common_pong(struct sbus_request *dbus_req) +int monitor_common_pong(struct sbus_request *dbus_req, void *data) { return sbus_request_return_and_finish(dbus_req, DBUS_TYPE_INVALID); } -int monitor_common_res_init(struct sbus_request *dbus_req) +int monitor_common_res_init(struct sbus_request *dbus_req, void *data) { int ret; @@ -198,7 +198,7 @@ errno_t monitor_common_rotate_logs(struct confdb_ctx *confdb, errno_t sss_monitor_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev, - struct sbus_interface *intf, + struct mon_cli_iface *mon_iface, const char *svc_name, uint16_t svc_version, void *pvt, @@ -206,6 +206,7 @@ errno_t sss_monitor_init(TALLOC_CTX *mem_ctx, { errno_t ret; char *sbus_address; + struct sbus_interface *intf; struct sbus_connection *conn; /* Set up SBUS connection to the monitor */ @@ -215,9 +216,7 @@ errno_t sss_monitor_init(TALLOC_CTX *mem_ctx, return ret; } - ret = sbus_client_init(mem_ctx, ev, sbus_address, - intf, &conn, - NULL, pvt); + ret = sbus_client_init(mem_ctx, ev, sbus_address, &conn); if (ret != EOK) { DEBUG(SSSDBG_FATAL_FAILURE, "Failed to connect to monitor services.\n"); talloc_free(sbus_address); @@ -225,6 +224,17 @@ errno_t sss_monitor_init(TALLOC_CTX *mem_ctx, } talloc_free(sbus_address); + intf = sbus_new_interface(mem_ctx, MONITOR_PATH, &mon_iface->vtable, pvt); + if (!intf) { + ret = ENOMEM; + } else { + ret = sbus_conn_add_interface(conn, intf); + } + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, "Failed to export monitor client.\n"); + return ret; + } + /* Identify ourselves to the monitor */ ret = monitor_common_send_id(conn, svc_name, svc_version); if (ret != EOK) { -- cgit