d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/*
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Authors:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Pavel Březina <pbrezina@redhat.com>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Copyright (C) 2016 Red Hat
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina This program is free software; you can redistribute it and/or modify
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina it under the terms of the GNU General Public License as published by
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina the Free Software Foundation; either version 3 of the License, or
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina (at your option) any later version.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina This program is distributed in the hope that it will be useful,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina GNU General Public License for more details.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina You should have received a copy of the GNU General Public License
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina*/
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/backend.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/data_provider/dp_iface_generated.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/data_provider/dp_private.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/data_provider/dp_iface.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/data_provider/dp.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "sbus/sssd_dbus.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "sbus/sssd_dbus_errors.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "util/util.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct dp_client {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct data_provider *provider;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct sbus_connection *conn;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_timer *timeout;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *name;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina bool initialized;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina};
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaconst char *dp_client_to_string(enum dp_clients client)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina switch (client) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina case DPC_NSS:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return "NSS";
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina case DPC_PAM:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return "PAM";
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina case DPC_IFP:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return "InfoPipe";
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina case DPC_PAC:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return "PAC";
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina case DPC_SUDO:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return "SUDO";
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina case DPC_HOST:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return "SSH";
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina case DPC_AUTOFS:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return "autofs";
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina case DP_CLIENT_SENTINEL:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return "Invalid";
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return "Invalid";
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic int dp_client_destructor(struct dp_client *dp_cli)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct data_provider *provider;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina enum dp_clients client;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (dp_cli->provider == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return 0;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina provider = dp_cli->provider;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina for (client = 0; client != DP_CLIENT_SENTINEL; client++) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (provider->clients[client] == dp_cli) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina provider->clients[client] = NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Removed %s client\n",
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_client_to_string(client));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina break;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (client == DP_CLIENT_SENTINEL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unknown client removed...\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return 0;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic int
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadp_client_register(struct sbus_request *sbus_req,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *data,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *client_name)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct data_provider *provider;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_client *dp_cli;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct DBusError *error;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina enum dp_clients client;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina errno_t ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_cli = talloc_get_type(data, struct dp_client);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (dp_cli == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Do not send D-Bus error here. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Bug: dp_cli is NULL\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return EINVAL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina provider = dp_cli->provider;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_cli->name = talloc_strdup(dp_cli, client_name);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (dp_cli->name == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CONF_SETTINGS, "Cancel DP ID timeout [%p]\n", dp_cli->timeout);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_zfree(dp_cli->timeout);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina for (client = 0; client != DP_CLIENT_SENTINEL; client++) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (strcasecmp(client_name, dp_client_to_string(client)) == 0) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina provider->clients[client] = dp_cli;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina break;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (client == DP_CLIENT_SENTINEL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unknown client! [%s]\n", client_name);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_NOT_FOUND,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "Unknown client [%s]", client_name);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Kill this client. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_free(dp_cli);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return sbus_request_fail_and_finish(sbus_req, error);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_set_destructor(dp_cli, dp_client_destructor);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = iface_dp_client_Register_finish(sbus_req);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CONF_SETTINGS, "Unable to send ack to the client [%s], "
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "disconnecting...\n", client_name);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina sbus_disconnect(sbus_req->conn);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CONF_SETTINGS, "Added Frontend client [%s]\n", client_name);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_cli->initialized = true;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return EOK;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic void
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadp_client_handshake_timeout(struct tevent_context *ev,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct tevent_timer *te,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct timeval t,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void *ptr)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_client *dp_cli;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_OP_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "Client timed out before identification [%p]!\n", te);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_cli = talloc_get_type(ptr, struct dp_client);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina sbus_disconnect(dp_cli->conn);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_zfree(dp_cli);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaerrno_t dp_client_init(struct sbus_connection *conn, void *data)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct data_provider *provider;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct dp_client *dp_cli;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct timeval tv;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina errno_t ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina static struct iface_dp_client iface_dp_client = {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina { &iface_dp_client_meta, 0 },
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .Register = dp_client_register,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina };
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina provider = talloc_get_type(data, struct data_provider);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* When connection is lost we also free the client. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_cli = talloc_zero(conn, struct dp_client);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (dp_cli == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory, killing connection.\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_free(conn);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_cli->provider = provider;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_cli->conn = conn;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_cli->initialized = false;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_cli->timeout = NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Allow access from the SSSD user. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina sbus_allow_uid(conn, &provider->uid);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Setup timeout in case client fails to register himself in time. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina tv = tevent_timeval_current_ofs(5, 0);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_cli->timeout = tevent_add_timer(provider->ev, dp_cli, tv,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina dp_client_handshake_timeout, dp_cli);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (dp_cli->timeout == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Connection is closed in the caller. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory, killing connection\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CONF_SETTINGS,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "Set-up Backend ID timeout [%p]\n", dp_cli->timeout);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Setup D-Bus interfaces and methods. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sbus_conn_register_iface(conn, &iface_dp_client.vtable,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DP_PATH, dp_cli);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Connection is closed in the caller. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE, "Unable to register D-Bus interface, "
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "killing connection [%d]: %s\n", ret, sss_strerror(ret));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = dp_register_sbus_interface(conn, dp_cli);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Connection is closed in the caller. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE, "Unable to register D-Bus interface, "
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "killing connection [%d]: %s\n", ret, sss_strerror(ret));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct data_provider *
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadp_client_provider(struct dp_client *dp_cli)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (dp_cli == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return dp_cli->provider;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
2f18b8d67c86a1a277b59894f24ea6e09b41b7eaPavel Březinastruct be_ctx *
2f18b8d67c86a1a277b59894f24ea6e09b41b7eaPavel Březinadp_client_be(struct dp_client *dp_cli)
2f18b8d67c86a1a277b59894f24ea6e09b41b7eaPavel Březina{
2f18b8d67c86a1a277b59894f24ea6e09b41b7eaPavel Březina if (dp_cli == NULL || dp_cli->provider == NULL) {
2f18b8d67c86a1a277b59894f24ea6e09b41b7eaPavel Březina return NULL;
2f18b8d67c86a1a277b59894f24ea6e09b41b7eaPavel Březina }
2f18b8d67c86a1a277b59894f24ea6e09b41b7eaPavel Březina
2f18b8d67c86a1a277b59894f24ea6e09b41b7eaPavel Březina return dp_cli->provider->be_ctx;
2f18b8d67c86a1a277b59894f24ea6e09b41b7eaPavel Březina}
2f18b8d67c86a1a277b59894f24ea6e09b41b7eaPavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct sbus_connection *
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadp_client_conn(struct dp_client *dp_cli)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (dp_cli == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return dp_cli->conn;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}