From 11c621b5ee1a0cdc27610f8b172017764acc285e Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Wed, 5 Aug 2009 14:11:12 -0400 Subject: Simplify interfaces initialization Make as much as possible static, and remove use of talloc_reference and allocation/deallocation of memory when not necessary. Fix also responder use of rctx->conn, was mistakenly used for both monitor and dp connections. --- server/sbus/sbus_client.c | 9 +-- server/sbus/sbus_client.h | 2 +- server/sbus/sssd_dbus.h | 28 ++++---- server/sbus/sssd_dbus_connection.c | 137 ++++++++++++++++++------------------- server/sbus/sssd_dbus_private.h | 6 +- server/sbus/sssd_dbus_server.c | 11 ++- 6 files changed, 93 insertions(+), 100 deletions(-) (limited to 'server/sbus') diff --git a/server/sbus/sbus_client.c b/server/sbus/sbus_client.c index 82021d6e2..df5c07120 100644 --- a/server/sbus/sbus_client.c +++ b/server/sbus/sbus_client.c @@ -26,7 +26,7 @@ int sbus_client_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev, const char *server_address, - struct sbus_method_ctx *sm_ctx, + struct sbus_interface *intf, struct sbus_connection **_conn, sbus_conn_destructor_fn destructor, void *conn_pvt_data) @@ -39,12 +39,7 @@ int sbus_client_init(TALLOC_CTX *mem_ctx, return EINVAL; } - ret = sbus_new_connection(mem_ctx, ev, server_address, &conn); - if (ret != EOK) { - goto fail; - } - - ret = sbus_conn_add_method_ctx(conn, sm_ctx); + ret = sbus_new_connection(mem_ctx, ev, server_address, intf, &conn); if (ret != EOK) { goto fail; } diff --git a/server/sbus/sbus_client.h b/server/sbus/sbus_client.h index bce8f8218..742f8a10c 100644 --- a/server/sbus/sbus_client.h +++ b/server/sbus/sbus_client.h @@ -28,7 +28,7 @@ int sbus_client_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev, const char *server_address, - struct sbus_method_ctx *sm_ctx, + struct sbus_interface *intf, struct sbus_connection **_conn, sbus_conn_destructor_fn destructor, void *conn_pvt_data); diff --git a/server/sbus/sssd_dbus.h b/server/sbus/sssd_dbus.h index 6487ced63..ac02c4440 100644 --- a/server/sbus/sssd_dbus.h +++ b/server/sbus/sssd_dbus.h @@ -59,15 +59,17 @@ enum { #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_method_ctx { - char *interface; - char *path; - DBusObjectPathMessageFunction message_handler; +struct sbus_interface { + const char *interface; + const char *path; + DBusObjectPathVTable vtable; struct sbus_method *methods; sbus_msg_handler_fn introspect_fn; }; @@ -76,7 +78,7 @@ struct sbus_method_ctx { int sbus_new_server(TALLOC_CTX *mem_ctx, struct tevent_context *ev, const char *address, - struct sbus_method_ctx *ctx, + struct sbus_interface *intf, struct sbus_connection **server, sbus_server_conn_init_fn init_fn, void *init_pvt_data); @@ -92,6 +94,7 @@ int sbus_new_server(TALLOC_CTX *mem_ctx, int sbus_new_connection(TALLOC_CTX *ctx, struct tevent_context *ev, const char *address, + struct sbus_interface *intf, struct sbus_connection **conn); /* sbus_add_connection @@ -106,11 +109,12 @@ int sbus_new_connection(TALLOC_CTX *ctx, * connections, including those retrieved from * dbus_bus_get */ -int sbus_add_connection(TALLOC_CTX *ctx, - struct tevent_context *ev, - DBusConnection *dbus_conn, - struct sbus_connection **conn, - int connection_type); +int sbus_init_connection(TALLOC_CTX *ctx, + struct tevent_context *ev, + DBusConnection *dbus_conn, + struct sbus_interface *intf, + int connection_type, + struct sbus_connection **_conn); void sbus_conn_set_destructor(struct sbus_connection *conn, sbus_conn_destructor_fn destructor); @@ -121,8 +125,8 @@ DBusConnection *sbus_get_connection(struct sbus_connection *conn); void sbus_disconnect(struct sbus_connection *conn); void sbus_conn_set_private_data(struct sbus_connection *conn, void *pvt_data); void *sbus_conn_get_private_data(struct sbus_connection *conn); -int sbus_conn_add_method_ctx(struct sbus_connection *conn, - struct sbus_method_ctx *method_ctx); +int sbus_conn_add_interface(struct sbus_connection *conn, + struct sbus_interface *intf); bool sbus_conn_disconnecting(struct sbus_connection *conn); /* max_retries < 0: retry forever diff --git a/server/sbus/sssd_dbus_connection.c b/server/sbus/sssd_dbus_connection.c index f2435bfb9..ab414da05 100644 --- a/server/sbus/sssd_dbus_connection.c +++ b/server/sbus/sssd_dbus_connection.c @@ -7,14 +7,14 @@ /* Types */ struct dbus_ctx_list; -struct method_holder { - struct method_holder *prev, *next; +struct sbus_interface_p { + struct sbus_interface_p *prev, *next; struct sbus_connection *conn; - struct sbus_method_ctx *method_ctx; - DBusObjectPathVTable *dbus_vtable; + struct sbus_interface *intf; }; -static bool path_in_method_list(struct method_holder *list, const char *path); +static bool path_in_interface_list(struct sbus_interface_p *list, + const char *path); static void sbus_unreg_object_paths(struct sbus_connection *conn); static int sbus_auto_reconnect(struct sbus_connection *conn); @@ -56,8 +56,8 @@ static void sbus_dispatch(struct tevent_context *ev, DEBUG(0, ("Cannot start auto-reconnection.\n")); conn->reconnect_callback(conn, - SBUS_RECONNECT_ERROR, - conn->reconnect_pvt); + SBUS_RECONNECT_ERROR, + conn->reconnect_pvt); return; } @@ -129,11 +129,12 @@ static int sbus_conn_set_fns(struct sbus_connection *conn); * Set up a D-BUS connection to use the libevents mainloop * for handling file descriptor and timed events */ -int sbus_add_connection(TALLOC_CTX *ctx, - struct tevent_context *ev, - DBusConnection *dbus_conn, - struct sbus_connection **_conn, - int connection_type) +int sbus_init_connection(TALLOC_CTX *ctx, + struct tevent_context *ev, + DBusConnection *dbus_conn, + struct sbus_interface *intf, + int connection_type, + struct sbus_connection **_conn) { struct sbus_connection *conn; int ret; @@ -149,10 +150,16 @@ int sbus_add_connection(TALLOC_CTX *ctx, ret = sbus_conn_set_fns(conn); if (ret != EOK) { talloc_free(conn); + return ret; } - *_conn = conn; + ret = sbus_conn_add_interface(conn, intf); + if (ret != EOK) { + talloc_free(conn); + return ret; + } + *_conn = conn; return ret; } @@ -208,9 +215,10 @@ static int sbus_conn_set_fns(struct sbus_connection *conn) } int sbus_new_connection(TALLOC_CTX *ctx, struct tevent_context *ev, - const char *address, - struct sbus_connection **conn) + const char *address, struct sbus_interface *intf, + struct sbus_connection **_conn) { + struct sbus_connection *conn; DBusConnection *dbus_conn; DBusError dbus_error; int ret; @@ -226,17 +234,18 @@ int sbus_new_connection(TALLOC_CTX *ctx, struct tevent_context *ev, return EIO; } - ret = sbus_add_connection(ctx, ev, dbus_conn, - conn, SBUS_CONN_TYPE_SHARED); + ret = sbus_init_connection(ctx, ev, dbus_conn, intf, + SBUS_CONN_TYPE_SHARED, &conn); if (ret != EOK) { /* FIXME: release resources */ } /* Store the address for later reconnection */ - (*conn)->address = talloc_strdup((*conn), address); + conn->address = talloc_strdup(conn, address); - dbus_connection_set_exit_on_disconnect((*conn)->dbus.conn, FALSE); + dbus_connection_set_exit_on_disconnect(conn->dbus.conn, FALSE); + *_conn = conn; return ret; } @@ -364,7 +373,7 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn, DBusMessage *message, void *user_data) { - struct method_holder *ctx; + struct sbus_interface_p *intf_p; const char *method; const char *path; const char *msg_interface; @@ -375,7 +384,7 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn, if (!user_data) { return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - ctx = talloc_get_type(user_data, struct method_holder); + intf_p = talloc_get_type(user_data, struct sbus_interface_p); method = dbus_message_get_member(message); DEBUG(9, ("Received SBUS method [%s]\n", method)); @@ -386,18 +395,18 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn, return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; /* Validate the D-BUS path */ - if (strcmp(path, ctx->method_ctx->path) != 0) + if (strcmp(path, intf_p->intf->path) != 0) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; /* Validate the method interface */ - if (strcmp(msg_interface, ctx->method_ctx->interface) == 0) { + if (strcmp(msg_interface, intf_p->intf->interface) == 0) { found = 0; - for (i = 0; ctx->method_ctx->methods[i].method != NULL; i++) { - if (strcmp(method, ctx->method_ctx->methods[i].method) == 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 = ctx->method_ctx->methods[i].fn(message, ctx->conn); + ret = intf_p->intf->methods[i].fn(message, intf_p->conn); if (ret != EOK) { - return sbus_reply_internal_error(message, ctx->conn); + return sbus_reply_internal_error(message, intf_p->conn); } break; } @@ -407,7 +416,7 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn, /* Reply DBUS_ERROR_UNKNOWN_METHOD */ DEBUG(1, ("No matching method found for %s.\n", method)); reply = dbus_message_new_error(message, DBUS_ERROR_UNKNOWN_METHOD, NULL); - sbus_conn_send_reply(ctx->conn, reply); + sbus_conn_send_reply(intf_p->conn, reply); dbus_message_unref(reply); } } @@ -418,13 +427,13 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn, if (strcmp(msg_interface, DBUS_INTROSPECT_INTERFACE) == 0 && strcmp(method, DBUS_INTROSPECT_METHOD) == 0) { - if (ctx->method_ctx->introspect_fn) { + if (intf_p->intf->introspect_fn) { /* If we have been asked for introspection data and we have * an introspection function registered, user that. */ - ret = ctx->method_ctx->introspect_fn(message, ctx->conn); + ret = intf_p->intf->introspect_fn(message, intf_p->conn); if (ret != EOK) { - return sbus_reply_internal_error(message, ctx->conn); + return sbus_reply_internal_error(message, intf_p->conn); } } } @@ -438,49 +447,35 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn, /* Adds a new D-BUS path message handler to the connection * Note: this must be a unique path. */ -int sbus_conn_add_method_ctx(struct sbus_connection *conn, - struct sbus_method_ctx *method_ctx) +int sbus_conn_add_interface(struct sbus_connection *conn, + struct sbus_interface *intf) { - struct method_holder *mh; + struct sbus_interface_p *intf_p; dbus_bool_t dbret; const char *path; - if (!conn || !method_ctx || !method_ctx->message_handler) { + if (!conn || !intf || !intf->vtable.message_function) { return EINVAL; } - path = method_ctx->path; + path = intf->path; - if (path_in_method_list(conn->method_list, path)) { + if (path_in_interface_list(conn->intf_list, path)) { DEBUG(0, ("Cannot add method context with identical path.\n")); return EINVAL; } - mh = talloc_zero(conn, struct method_holder); - if (!mh) { - return ENOMEM; - } - mh->conn = conn; - - /* Set up the vtable for the object path */ - mh->dbus_vtable = talloc_zero(conn, DBusObjectPathVTable); - if (!mh->dbus_vtable) { - talloc_free(mh); - return ENOMEM; - } - mh->dbus_vtable->message_function = method_ctx->message_handler; - - mh->method_ctx = talloc_reference(mh, method_ctx); - if (!mh->method_ctx) { - /* talloc_reference only fails on insufficient memory */ - talloc_free(mh); + intf_p = talloc_zero(conn, struct sbus_interface_p); + if (!intf_p) { return ENOMEM; } + intf_p->conn = conn; + intf_p->intf = intf; - DLIST_ADD(conn->method_list, mh); + DLIST_ADD(conn->intf_list, intf_p); dbret = dbus_connection_register_object_path(conn->dbus.conn, - path, mh->dbus_vtable, mh); + path, &intf->vtable, intf_p); if (!dbret) { DEBUG(0, ("Could not register object path to the connection.\n")); return ENOMEM; @@ -489,9 +484,10 @@ int sbus_conn_add_method_ctx(struct sbus_connection *conn, return EOK; } -static bool path_in_method_list(struct method_holder *list, const char *path) +static bool path_in_interface_list(struct sbus_interface_p *list, + const char *path) { - struct method_holder *iter; + struct sbus_interface_p *iter; if (!list || !path) { return false; @@ -499,7 +495,7 @@ static bool path_in_method_list(struct method_holder *list, const char *path) iter = list; while (iter != NULL) { - if (strcmp(iter->method_ctx->path, path) == 0) { + if (strcmp(iter->intf->path, path) == 0) { return true; } iter = iter->next; @@ -510,16 +506,12 @@ static bool path_in_method_list(struct method_holder *list, const char *path) static void sbus_unreg_object_paths(struct sbus_connection *conn) { - struct method_holder *iter = conn->method_list; - struct method_holder *purge; + struct sbus_interface_p *iter = conn->intf_list; while (iter != NULL) { dbus_connection_unregister_object_path(conn->dbus.conn, - iter->method_ctx->path); - DLIST_REMOVE(conn->method_list, iter); - purge = iter; + iter->intf->path); iter = iter->next; - talloc_free(purge); } } @@ -538,7 +530,7 @@ static void sbus_reconnect(struct tevent_context *ev, struct timeval tv, void *data) { struct sbus_connection *conn; - struct method_holder *mh; + struct sbus_interface_p *iter; DBusError dbus_error; dbus_bool_t dbret; int ret; @@ -559,17 +551,18 @@ static void sbus_reconnect(struct tevent_context *ev, } /* Re-register object paths */ - mh = conn->method_list; - while (mh) { + iter = conn->intf_list; + while (iter) { dbret = dbus_connection_register_object_path(conn->dbus.conn, - mh->method_ctx->path, - mh->dbus_vtable, mh); + iter->intf->path, + &iter->intf->vtable, + iter); if (!dbret) { DEBUG(0, ("Could not register object path.\n")); dbus_connection_unref(conn->dbus.conn); goto failed; } - mh = mh->next; + iter = iter->next; } /* Reset retries to 0 to resume dispatch processing */ diff --git a/server/sbus/sssd_dbus_private.h b/server/sbus/sssd_dbus_private.h index 01eaf00d3..79cae2307 100644 --- a/server/sbus/sssd_dbus_private.h +++ b/server/sbus/sssd_dbus_private.h @@ -10,6 +10,8 @@ enum dbus_conn_type { SBUS_CONNECTION }; +struct sbus_interface_p; + struct sbus_connection { struct tevent_context *ev; @@ -24,7 +26,7 @@ struct sbus_connection { void *pvt_data; /* Private data for this connection */ /* dbus tables and handlers */ - struct method_holder *method_list; + struct sbus_interface_p *intf_list; /* reconnect settings */ int retries; @@ -34,7 +36,7 @@ struct sbus_connection { void *reconnect_pvt; /* server related stuff */ - struct sbus_method_ctx *server_method; + struct sbus_interface *server_intf; sbus_server_conn_init_fn srv_init_fn; void *srv_init_data; }; diff --git a/server/sbus/sssd_dbus_server.c b/server/sbus/sssd_dbus_server.c index 8a123d6dd..ef2de106d 100644 --- a/server/sbus/sssd_dbus_server.c +++ b/server/sbus/sssd_dbus_server.c @@ -49,8 +49,9 @@ static void sbus_server_init_new_connection(DBusServer *dbus_server, } DEBUG(5,("Adding connection %lX.\n", conn)); - ret = sbus_add_connection(server, server->ev, dbus_conn, - &conn, SBUS_CONN_TYPE_PRIVATE); + ret = sbus_init_connection(server, server->ev, + dbus_conn, server->server_intf, + SBUS_CONN_TYPE_PRIVATE, &conn); if (ret != 0) { dbus_connection_close(dbus_conn); DEBUG(5,("Closing connection (failed setup)")); @@ -61,8 +62,6 @@ static void sbus_server_init_new_connection(DBusServer *dbus_server, DEBUG(5,("Got a connection\n")); - sbus_conn_add_method_ctx(conn, server->server_method); - /* * Initialize connection-specific features * This may set a more detailed destructor, but @@ -87,7 +86,7 @@ static void sbus_server_init_new_connection(DBusServer *dbus_server, int sbus_new_server(TALLOC_CTX *mem_ctx, struct tevent_context *ev, const char *address, - struct sbus_method_ctx *method, + struct sbus_interface *intf, struct sbus_connection **_server, sbus_server_conn_init_fn init_fn, void *init_pvt_data) { @@ -121,7 +120,7 @@ int sbus_new_server(TALLOC_CTX *mem_ctx, server->ev = ev; server->type = SBUS_SERVER; server->dbus.server = dbus_server; - server->server_method = method; + server->server_intf = intf; server->srv_init_fn = init_fn; server->srv_init_data = init_pvt_data; -- cgit