diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2016-11-02 17:18:07 +0100 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2017-02-15 14:51:11 +0100 |
commit | b3ee4be9e1794fa823696d70d4958f3b0269939c (patch) | |
tree | 861def55882be1f8edbdc53b10374c0565116178 | |
parent | 205a0b9e9234327730fa808be95b2e1db7ffee95 (diff) | |
download | sssd-b3ee4be9e1794fa823696d70d4958f3b0269939c.tar.gz sssd-b3ee4be9e1794fa823696d70d4958f3b0269939c.tar.xz sssd-b3ee4be9e1794fa823696d70d4958f3b0269939c.zip |
DP: Add internal DP interface to set domain state
Adds functions to the interface Data Provider publishes towards back
ends that allows the back ends to notify responders that a domain has
been enabled or disabled.
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | src/providers/data_provider/dp.h | 5 | ||||
-rw-r--r-- | src/providers/data_provider/dp_resp_client.c | 93 |
3 files changed, 99 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am index aa28a27f9..5cf496002 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1464,6 +1464,7 @@ sssd_be_SOURCES = \ src/providers/data_provider/dp_iface_backend.c \ src/providers/data_provider/dp_iface_failover.c \ src/providers/data_provider/dp_client.c \ + src/providers/data_provider/dp_resp_client.c \ src/providers/data_provider/dp_iface_generated.c \ src/providers/data_provider/dp_request.c \ src/providers/data_provider/dp_request_reply.c \ diff --git a/src/providers/data_provider/dp.h b/src/providers/data_provider/dp.h index 5b36baf34..68db75521 100644 --- a/src/providers/data_provider/dp.h +++ b/src/providers/data_provider/dp.h @@ -161,4 +161,9 @@ bool dp_method_enabled(struct data_provider *provider, void dp_terminate_domain_requests(struct data_provider *provider, const char *domain); +void dp_sbus_domain_active(struct data_provider *provider, + struct sss_domain_info *dom); +void dp_sbus_domain_inconsistent(struct data_provider *provider, + struct sss_domain_info *dom); + #endif /* _DP_H_ */ diff --git a/src/providers/data_provider/dp_resp_client.c b/src/providers/data_provider/dp_resp_client.c new file mode 100644 index 000000000..3d386eac1 --- /dev/null +++ b/src/providers/data_provider/dp_resp_client.c @@ -0,0 +1,93 @@ +/* + SSSD + + Data Provider Responder client - DP calls responder interface + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "config.h" +#include <talloc.h> +#include <tevent.h> + +#include "confdb/confdb.h" +#include "sbus/sssd_dbus.h" +#include "providers/data_provider.h" +#include "providers/data_provider/dp_private.h" +#include "responder/common/iface/responder_iface.h" +#include "src/responder/nss/nss_iface.h" + +static void send_msg_to_all_clients(struct data_provider *provider, + struct DBusMessage *msg) +{ + struct dp_client *cli; + int i; + + for (i = 0; provider->clients[i] != NULL; i++) { + cli = provider->clients[i]; + if (cli != NULL) { + sbus_conn_send_reply(dp_client_conn(cli), msg); + } + } +} + +static void dp_sbus_set_domain_state(struct data_provider *provider, + struct sss_domain_info *dom, + enum sss_domain_state state) +{ + DBusMessage *msg; + const char *method = NULL; + + switch (state) { + case DOM_ACTIVE: + DEBUG(SSSDBG_TRACE_FUNC, "Ordering responders to enable domain %s\n", + dom->name); + method = IFACE_RESPONDER_DOMAIN_SETACTIVE; + break; + case DOM_INCONSISTENT: + DEBUG(SSSDBG_TRACE_FUNC, "Ordering responders to disable domain %s\n", + dom->name); + method = IFACE_RESPONDER_DOMAIN_SETINCONSISTENT; + break; + default: + /* No other methods provided at the moment */ + return; + } + + sss_domain_set_state(dom, state); + + msg = sbus_create_message(NULL, NULL, RESPONDER_PATH, + IFACE_RESPONDER_DOMAIN, method, + DBUS_TYPE_STRING, &dom->name); + if (msg == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n"); + return; + } + + send_msg_to_all_clients(provider, msg); + dbus_message_unref(msg); + return; +} + +void dp_sbus_domain_active(struct data_provider *provider, + struct sss_domain_info *dom) +{ + return dp_sbus_set_domain_state(provider, dom, DOM_ACTIVE); +} + +void dp_sbus_domain_inconsistent(struct data_provider *provider, + struct sss_domain_info *dom) +{ + return dp_sbus_set_domain_state(provider, dom, DOM_INCONSISTENT); +} |