summaryrefslogtreecommitdiffstats
path: root/server/sbus/sssd_dbus_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/sbus/sssd_dbus_server.c')
-rw-r--r--server/sbus/sssd_dbus_server.c101
1 files changed, 37 insertions, 64 deletions
diff --git a/server/sbus/sssd_dbus_server.c b/server/sbus/sssd_dbus_server.c
index 5c247fcc3..8a123d6dd 100644
--- a/server/sbus/sssd_dbus_server.c
+++ b/server/sbus/sssd_dbus_server.c
@@ -25,24 +25,6 @@
#include "sbus/sssd_dbus.h"
#include "sbus/sssd_dbus_private.h"
-/* Types */
-struct sbus_srv_ctx {
- DBusServer *dbus_server;
- /*
- * sd_ctx here describes the object path that will be
- * presented to all clients of this server. Additional
- * connection-specific paths can be specified by the
- * init_fn, which is called every time a new connection
- * is established.
- * There should only be one global object path (for
- * simplicity's sake)
- */
- struct tevent_context *ev;
- struct sbus_method_ctx *sd_ctx;
- sbus_server_conn_init_fn init_fn;
- void *init_pvt_data;
-};
-
static int sbus_server_destructor(void *ctx);
/*
@@ -56,19 +38,18 @@ static void sbus_server_init_new_connection(DBusServer *dbus_server,
DBusConnection *dbus_conn,
void *data)
{
- struct sbus_srv_ctx *srv_ctx;
+ struct sbus_connection *server;
struct sbus_connection *conn;
- struct sbus_method_ctx *iter;
int ret;
DEBUG(5,("Entering.\n"));
- srv_ctx = talloc_get_type(data, struct sbus_srv_ctx);
- if (srv_ctx == NULL) {
+ server = talloc_get_type(data, struct sbus_connection);
+ if (!server) {
return;
}
DEBUG(5,("Adding connection %lX.\n", conn));
- ret = sbus_add_connection(srv_ctx, srv_ctx->ev, dbus_conn,
+ ret = sbus_add_connection(server, server->ev, dbus_conn,
&conn, SBUS_CONN_TYPE_PRIVATE);
if (ret != 0) {
dbus_connection_close(dbus_conn);
@@ -80,12 +61,7 @@ static void sbus_server_init_new_connection(DBusServer *dbus_server,
DEBUG(5,("Got a connection\n"));
- /* Set up global methods */
- iter = srv_ctx->sd_ctx;
- while (iter != NULL) {
- sbus_conn_add_method_ctx(conn, iter);
- iter = iter->next;
- }
+ sbus_conn_add_method_ctx(conn, server->server_method);
/*
* Initialize connection-specific features
@@ -95,9 +71,11 @@ static void sbus_server_init_new_connection(DBusServer *dbus_server,
* This function (or its callbacks) should also
* set up connection-specific methods.
*/
- ret = srv_ctx->init_fn(conn, srv_ctx->init_pvt_data);
+ ret = server->srv_init_fn(conn, server->srv_init_data);
if (ret != EOK) {
DEBUG(1,("Initialization failed!\n"));
+ dbus_connection_close(dbus_conn);
+ talloc_zfree(conn);
}
}
@@ -107,18 +85,19 @@ static void sbus_server_init_new_connection(DBusServer *dbus_server,
* for handling file descriptor and timed events
*/
int sbus_new_server(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev, struct sbus_method_ctx *ctx,
- struct sbus_srv_ctx **_srv_ctx, const char *address,
+ struct tevent_context *ev,
+ const char *address,
+ struct sbus_method_ctx *method,
+ struct sbus_connection **_server,
sbus_server_conn_init_fn init_fn, void *init_pvt_data)
{
- struct sbus_generic_dbus_ctx *gen_ctx;
- struct sbus_srv_ctx *srv_ctx;
+ struct sbus_connection *server;
DBusServer *dbus_server;
DBusError dbus_error;
dbus_bool_t dbret;
char *tmp;
- *_srv_ctx = NULL;
+ *_server = NULL;
/* Set up D-BUS server */
dbus_error_init(&dbus_error);
@@ -134,66 +113,60 @@ int sbus_new_server(TALLOC_CTX *mem_ctx,
DEBUG(3, ("D-BUS Server listening on %s\n", tmp));
free(tmp);
- srv_ctx = talloc_zero(mem_ctx, struct sbus_srv_ctx);
- if (!srv_ctx) {
+ server = talloc_zero(mem_ctx, struct sbus_connection);
+ if (!server) {
return ENOMEM;
}
- srv_ctx->ev = ev;
- srv_ctx->dbus_server = dbus_server;
- srv_ctx->sd_ctx = ctx;
- srv_ctx->init_fn = init_fn;
- srv_ctx->init_pvt_data = init_pvt_data;
+ server->ev = ev;
+ server->type = SBUS_SERVER;
+ server->dbus.server = dbus_server;
+ server->server_method = method;
+ server->srv_init_fn = init_fn;
+ server->srv_init_data = init_pvt_data;
- gen_ctx = talloc_zero(srv_ctx, struct sbus_generic_dbus_ctx);
- if (!gen_ctx) {
- talloc_free(srv_ctx);
- return ENOMEM;
- }
- gen_ctx->ev = ev;
- gen_ctx->type = SBUS_SERVER;
- gen_ctx->dbus.server = dbus_server;
-
- talloc_set_destructor((TALLOC_CTX *)srv_ctx, sbus_server_destructor);
+ talloc_set_destructor((TALLOC_CTX *)server, sbus_server_destructor);
/* Set up D-BUS new connection handler */
- dbus_server_set_new_connection_function(srv_ctx->dbus_server,
+ dbus_server_set_new_connection_function(server->dbus.server,
sbus_server_init_new_connection,
- srv_ctx, NULL);
+ server, NULL);
/* Set up DBusWatch functions */
- dbret = dbus_server_set_watch_functions(srv_ctx->dbus_server,
+ dbret = dbus_server_set_watch_functions(server->dbus.server,
sbus_add_watch,
sbus_remove_watch,
sbus_toggle_watch,
- gen_ctx, NULL);
+ server, NULL);
if (!dbret) {
DEBUG(4, ("Error setting up D-BUS server watch functions"));
- talloc_free(srv_ctx);
+ talloc_free(server);
return EIO;
}
/* Set up DBusTimeout functions */
- dbret = dbus_server_set_timeout_functions(srv_ctx->dbus_server,
+ dbret = dbus_server_set_timeout_functions(server->dbus.server,
sbus_add_timeout,
sbus_remove_timeout,
sbus_toggle_timeout,
- gen_ctx, NULL);
+ server, NULL);
if (!dbret) {
DEBUG(4,("Error setting up D-BUS server timeout functions"));
- dbus_server_set_watch_functions(srv_ctx->dbus_server,
+ dbus_server_set_watch_functions(server->dbus.server,
NULL, NULL, NULL, NULL, NULL);
- talloc_free(srv_ctx);
+ talloc_free(server);
return EIO;
}
- *_srv_ctx = srv_ctx;
+ *_server = server;
return EOK;
}
static int sbus_server_destructor(void *ctx)
{
- struct sbus_srv_ctx *srv_ctx = talloc_get_type(ctx, struct sbus_srv_ctx);
- dbus_server_disconnect(srv_ctx->dbus_server);
+ struct sbus_connection *server;
+
+ server = talloc_get_type(ctx, struct sbus_connection);
+ dbus_server_disconnect(server->dbus.server);
return 0;
}