diff options
Diffstat (limited to 'src/responder/ifp/ifp_domains.c')
-rw-r--r-- | src/responder/ifp/ifp_domains.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/responder/ifp/ifp_domains.c b/src/responder/ifp/ifp_domains.c index 5ad9952c9..5333b2527 100644 --- a/src/responder/ifp/ifp_domains.c +++ b/src/responder/ifp/ifp_domains.c @@ -28,6 +28,9 @@ #include "confdb/confdb.h" #include "responder/common/responder.h" #include "responder/ifp/ifp_domains.h" +#include "responder/common/data_provider/rdp.h" +#include "sbus/sssd_dbus_errors.h" +#include "providers/data_provider/dp_responder_iface.h" #define RETURN_DOM_PROP_AS_STRING(dbus_req, pvt_data, out, property) do { \ struct sss_domain_info *__dom; \ @@ -534,3 +537,116 @@ void ifp_dom_get_parent_domain(struct sbus_request *dbus_req, *_out = sbus_opath_compose(dbus_req, IFP_PATH_DOMAINS, dom->parent->name); } + +static void ifp_domains_domain_is_online_done(struct tevent_req *req); + +int ifp_domains_domain_is_online(struct sbus_request *sbus_req, + void *data) +{ + struct ifp_ctx *ifp_ctx; + struct sss_domain_info *dom; + struct tevent_req *req; + DBusError *error; + + ifp_ctx = talloc_get_type(data, struct ifp_ctx); + + dom = get_domain_info_from_req(sbus_req, data); + if (dom == NULL) { + error = sbus_error_new(sbus_req, SBUS_ERROR_UNKNOWN_DOMAIN, + "Unknown domain"); + sbus_request_fail_and_finish(sbus_req, error); + return EOK; + } + + req = rdp_message_send(sbus_req, ifp_ctx->rctx, dom, DP_PATH, + IFACE_DP_BACKEND, IFACE_DP_BACKEND_ISONLINE, + DBUS_TYPE_STRING, &dom->name); + if (req == NULL) { + return ENOMEM; + } + + tevent_req_set_callback(req, ifp_domains_domain_is_online_done, sbus_req); + + return EOK; +} + +static void ifp_domains_domain_is_online_done(struct tevent_req *req) +{ + struct sbus_request *sbus_req; + DBusError *error; + bool is_online; + errno_t ret; + + sbus_req = tevent_req_callback_data(req, struct sbus_request); + + ret = rdp_message_recv(req, DBUS_TYPE_BOOLEAN, &is_online); + if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, "Unable to get online status [%d]: %s\n", + ret, sss_strerror(ret)); + error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, + "Unable to get online status [%d]: %s", + ret, sss_strerror(ret)); + sbus_request_fail_and_finish(sbus_req, error); + return; + } + + iface_ifp_domains_domain_IsOnline_finish(sbus_req, is_online); +} + +static void ifp_domains_domain_list_services_done(struct tevent_req *req); + +int ifp_domains_domain_list_services(struct sbus_request *sbus_req, + void *data) +{ + struct ifp_ctx *ifp_ctx; + struct sss_domain_info *dom; + struct tevent_req *req; + DBusError *error; + + ifp_ctx = talloc_get_type(data, struct ifp_ctx); + + dom = get_domain_info_from_req(sbus_req, data); + if (dom == NULL) { + error = sbus_error_new(sbus_req, SBUS_ERROR_UNKNOWN_DOMAIN, + "Unknown domain"); + sbus_request_fail_and_finish(sbus_req, error); + return EOK; + } + + req = rdp_message_send(sbus_req, ifp_ctx->rctx, dom, DP_PATH, + IFACE_DP_FAILOVER, IFACE_DP_FAILOVER_LISTSERVICES, + DBUS_TYPE_STRING, &dom->name); + if (req == NULL) { + return ENOMEM; + } + + tevent_req_set_callback(req, ifp_domains_domain_list_services_done, sbus_req); + + return EOK; +} + +static void ifp_domains_domain_list_services_done(struct tevent_req *req) +{ + struct sbus_request *sbus_req; + DBusError *error; + int num_services; + const char **services; + errno_t ret; + + sbus_req = tevent_req_callback_data(req, struct sbus_request); + + ret = rdp_message_recv(req, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, + &services, &num_services); + if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, "Unable to get failover services [%d]: %s\n", + ret, sss_strerror(ret)); + error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, + "Unable to get failover services [%d]: %s", + ret, sss_strerror(ret)); + sbus_request_fail_and_finish(sbus_req, error); + return; + } + + iface_ifp_domains_domain_ListServices_finish(sbus_req, services, + num_services); +} |