/* * new_connection_callback * Actions to be run upon each new client connection * Must either perform dbus_connection_ref() on the * new connection or else close the connection with * dbus_connection_close() */ static void sbus_server_init_new_connection(DBusServer *dbus_server, DBusConnection *dbus_conn, void *data) { struct sbus_connection *server; struct sbus_connection *conn; int ret; DEBUG(SSSDBG_FUNC_DATA,"Entering.\n"); server = talloc_get_type(data, struct sbus_connection); if (!server) { return; } DEBUG(SSSDBG_FUNC_DATA,"Adding connection %p.\n", dbus_conn); ret = sbus_init_connection(server, server->ev, dbus_conn, SBUS_CONN_TYPE_PRIVATE, &conn); if (ret != 0) { dbus_connection_close(dbus_conn); DEBUG(SSSDBG_FUNC_DATA, "Closing connection (failed setup)\n"); return; } dbus_connection_ref(dbus_conn); DEBUG(SSSDBG_FUNC_DATA,"Got a connection\n"); /* * Initialize connection-specific features * This function (or its callbacks) should also * set up connection-specific methods. */ ret = server->srv_init_fn(conn, server->srv_init_data); if (ret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE,"Initialization failed!\n"); dbus_connection_close(dbus_conn); talloc_zfree(conn); } }
static errno_t sysbus_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev, const char *dbus_name, void *pvt, struct sysbus_ctx **sysbus) { DBusError dbus_error; DBusConnection *conn = NULL; struct sysbus_ctx *system_bus = NULL; errno_t ret; system_bus = talloc_zero(mem_ctx, struct sysbus_ctx); if (system_bus == NULL) { return ENOMEM; } dbus_error_init(&dbus_error); /* Connect to the well-known system bus */ conn = dbus_bus_get(DBUS_BUS_SYSTEM, &dbus_error); if (conn == NULL) { DEBUG(SSSDBG_CRIT_FAILURE, "Failed to connect to D-BUS system bus: [%s]\n", dbus_error.message); ret = ERR_NO_SYSBUS; goto fail; } dbus_connection_set_exit_on_disconnect(conn, FALSE); ret = dbus_bus_request_name(conn, dbus_name, /* We want exclusive access */ DBUS_NAME_FLAG_DO_NOT_QUEUE, &dbus_error); if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { /* We were unable to register on the system bus */ DEBUG(SSSDBG_CRIT_FAILURE, "Unable to request name on the system bus: [%s]\n", dbus_error.message); ret = EIO; goto fail; } DEBUG(SSSDBG_TRACE_FUNC, "Listening on %s\n", dbus_name); /* Integrate with tevent loop */ ret = sbus_init_connection(system_bus, ev, conn, SBUS_CONN_TYPE_SYSBUS, &system_bus->conn); if (ret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, "Could not integrate D-BUS into mainloop.\n"); goto fail; } ret = ifp_register_sbus_interface(system_bus->conn, pvt); if (ret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, "Could not register interfaces\n"); goto fail; } ifp_register_nodes(pvt, system_bus->conn); *sysbus = system_bus; return EOK; fail: if (dbus_error_is_set(&dbus_error)) { DEBUG(SSSDBG_OP_FAILURE, "DBus error message: %s\n", dbus_error.message); dbus_error_free(&dbus_error); } if (conn) dbus_connection_unref(conn); talloc_free(system_bus); return ret; }