From 7e02fba2dd32894ee20b53af0354a4b4e7939e9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= Date: Thu, 16 Jun 2016 13:55:14 +0200 Subject: [PATCH 20/27] DP: Add org.freedesktop.sssd.DataProvider.Backend --- Makefile.am | 1 + src/providers/data_provider/dp_iface.c | 6 +++ src/providers/data_provider/dp_iface.h | 5 ++ src/providers/data_provider/dp_iface.xml | 8 +++ src/providers/data_provider/dp_iface_backend.c | 65 ++++++++++++++++++++++++ src/providers/data_provider/dp_iface_generated.c | 41 +++++++++++++++ src/providers/data_provider/dp_iface_generated.h | 16 ++++++ 7 files changed, 142 insertions(+) create mode 100644 src/providers/data_provider/dp_iface_backend.c diff --git a/Makefile.am b/Makefile.am index 927b26abd97d92a962ae99654f4819ee8730be11..27750bc5af2d6e4098ed03da61a06c23b4e2c59f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1344,6 +1344,7 @@ sssd_be_SOURCES = \ src/providers/data_provider/dp_methods.c \ src/providers/data_provider/dp_builtin.c \ src/providers/data_provider/dp_iface.c \ + src/providers/data_provider/dp_iface_backend.c \ src/providers/data_provider/dp_client.c \ src/providers/data_provider/dp_iface_generated.c \ src/providers/data_provider/dp_request.c \ diff --git a/src/providers/data_provider/dp_iface.c b/src/providers/data_provider/dp_iface.c index 6a6ca676943ee46f8359e6697e1e21759bae17b7..7bd740ad60bb8bad1a2a10e7f20546c7c670ec76 100644 --- a/src/providers/data_provider/dp_iface.c +++ b/src/providers/data_provider/dp_iface.c @@ -36,8 +36,14 @@ struct iface_dp iface_dp = { .getAccountInfo = dp_get_account_info_handler }; +struct iface_dp_backend iface_dp_backend = { + {&iface_dp_backend_meta, 0}, + .IsOnline = dp_backend_is_online +}; + static struct sbus_iface_map dp_map[] = { { DP_PATH, &iface_dp.vtable }, + { DP_PATH, &iface_dp_backend.vtable }, { NULL, NULL } }; diff --git a/src/providers/data_provider/dp_iface.h b/src/providers/data_provider/dp_iface.h index eeef220e3b2fa9b457864aacd759a4e5525b798c..8354b1d3a21092f823ba7cab62c0466f7348e3ff 100644 --- a/src/providers/data_provider/dp_iface.h +++ b/src/providers/data_provider/dp_iface.h @@ -59,4 +59,9 @@ errno_t dp_subdomains_handler(struct sbus_request *sbus_req, void *dp_cli, const char *domain_hint); +/* org.freedesktop.sssd.DataProvider.Backend */ +errno_t dp_backend_is_online(struct sbus_request *sbus_req, + void *dp_cli, + const char *domain); + #endif /* DP_IFACE_H_ */ diff --git a/src/providers/data_provider/dp_iface.xml b/src/providers/data_provider/dp_iface.xml index f508968c8b93286ef2edbd669c862d5d090e5d42..da16eb6396e1a70623c73b9107d2adf41f6e4e1c 100644 --- a/src/providers/data_provider/dp_iface.xml +++ b/src/providers/data_provider/dp_iface.xml @@ -8,6 +8,14 @@ + + + + + + + + diff --git a/src/providers/data_provider/dp_iface_backend.c b/src/providers/data_provider/dp_iface_backend.c new file mode 100644 index 0000000000000000000000000000000000000000..f55fa0f8f2e2ea0325b48e1310c9e85dc50f15a7 --- /dev/null +++ b/src/providers/data_provider/dp_iface_backend.c @@ -0,0 +1,65 @@ +/* + Authors: + Pavel Březina + + Copyright (C) 2016 Red Hat + + 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 . +*/ + +#include +#include + +#include "sbus/sssd_dbus.h" +#include "sbus/sssd_dbus_errors.h" +#include "providers/data_provider/dp_private.h" +#include "providers/data_provider/dp_iface.h" +#include "providers/backend.h" +#include "util/util.h" + +errno_t dp_backend_is_online(struct sbus_request *sbus_req, + void *dp_cli, + const char *domname) +{ + struct be_ctx *be_ctx; + struct sss_domain_info *domain; + DBusError *error; + bool online; + + be_ctx = dp_client_be(dp_cli); + + if (domname == '\0') { + domain = be_ctx->domain; + } else { + domain = find_domain_by_name(be_ctx->domain, domname, false); + if (domain == NULL) { + error = sbus_error_new(sbus_req, SBUS_ERROR_UNKNOWN_DOMAIN, + "Unknown domain %s", domname); + if (error == NULL) { + return ENOMEM; + } + + return sbus_request_fail_and_finish(sbus_req, error); + } + } + + if (domain == be_ctx->domain) { + online = be_is_offline(be_ctx) == false; + } else { + online = domain->state == DOM_ACTIVE; + } + + iface_dp_backend_IsOnline_finish(sbus_req, online); + return EOK; +} diff --git a/src/providers/data_provider/dp_iface_generated.c b/src/providers/data_provider/dp_iface_generated.c index 7fee5326d414976d16a777d00882f7010e0b9d5a..388aa39d20dfe38973f8bfdb800ae1bc61b46226 100644 --- a/src/providers/data_provider/dp_iface_generated.c +++ b/src/providers/data_provider/dp_iface_generated.c @@ -51,6 +51,47 @@ const struct sbus_interface_meta iface_dp_client_meta = { sbus_invoke_get_all, /* GetAll invoker */ }; +/* arguments for org.freedesktop.sssd.DataProvider.Backend.IsOnline */ +const struct sbus_arg_meta iface_dp_backend_IsOnline__in[] = { + { "domain_name", "s" }, + { NULL, } +}; + +/* arguments for org.freedesktop.sssd.DataProvider.Backend.IsOnline */ +const struct sbus_arg_meta iface_dp_backend_IsOnline__out[] = { + { "status", "b" }, + { NULL, } +}; + +int iface_dp_backend_IsOnline_finish(struct sbus_request *req, bool arg_status) +{ + dbus_bool_t cast_status = arg_status; + return sbus_request_return_and_finish(req, + DBUS_TYPE_BOOLEAN, &cast_status, + DBUS_TYPE_INVALID); +} + +/* methods for org.freedesktop.sssd.DataProvider.Backend */ +const struct sbus_method_meta iface_dp_backend__methods[] = { + { + "IsOnline", /* name */ + iface_dp_backend_IsOnline__in, + iface_dp_backend_IsOnline__out, + offsetof(struct iface_dp_backend, IsOnline), + invoke_s_method, + }, + { NULL, } +}; + +/* interface info for org.freedesktop.sssd.DataProvider.Backend */ +const struct sbus_interface_meta iface_dp_backend_meta = { + "org.freedesktop.sssd.DataProvider.Backend", /* name */ + iface_dp_backend__methods, + NULL, /* no signals */ + NULL, /* no properties */ + sbus_invoke_get_all, /* GetAll invoker */ +}; + /* arguments for org.freedesktop.sssd.dataprovider.autofsHandler */ const struct sbus_arg_meta iface_dp_autofsHandler__in[] = { { "dp_flags", "u" }, diff --git a/src/providers/data_provider/dp_iface_generated.h b/src/providers/data_provider/dp_iface_generated.h index f1bcf17d07224ef0e396ab15e4fcd3a822bc9c9c..28b0183546eaf9174d598f967cf303ec67c973af 100644 --- a/src/providers/data_provider/dp_iface_generated.h +++ b/src/providers/data_provider/dp_iface_generated.h @@ -15,6 +15,10 @@ #define IFACE_DP_CLIENT "org.freedesktop.sssd.DataProvider.Client" #define IFACE_DP_CLIENT_REGISTER "Register" +/* constants for org.freedesktop.sssd.DataProvider.Backend */ +#define IFACE_DP_BACKEND "org.freedesktop.sssd.DataProvider.Backend" +#define IFACE_DP_BACKEND_ISONLINE "IsOnline" + /* constants for org.freedesktop.sssd.dataprovider */ #define IFACE_DP "org.freedesktop.sssd.dataprovider" #define IFACE_DP_PAMHANDLER "pamHandler" @@ -51,6 +55,15 @@ struct iface_dp_client { /* finish function for Register */ int iface_dp_client_Register_finish(struct sbus_request *req); +/* vtable for org.freedesktop.sssd.DataProvider.Backend */ +struct iface_dp_backend { + struct sbus_vtable vtable; /* derive from sbus_vtable */ + int (*IsOnline)(struct sbus_request *req, void *data, const char *arg_domain_name); +}; + +/* finish function for IsOnline */ +int iface_dp_backend_IsOnline_finish(struct sbus_request *req, bool arg_status); + /* vtable for org.freedesktop.sssd.dataprovider */ struct iface_dp { struct sbus_vtable vtable; /* derive from sbus_vtable */ @@ -87,6 +100,9 @@ int iface_dp_getAccountInfo_finish(struct sbus_request *req, uint16_t arg_dp_err /* interface info for org.freedesktop.sssd.DataProvider.Client */ extern const struct sbus_interface_meta iface_dp_client_meta; +/* interface info for org.freedesktop.sssd.DataProvider.Backend */ +extern const struct sbus_interface_meta iface_dp_backend_meta; + /* interface info for org.freedesktop.sssd.dataprovider */ extern const struct sbus_interface_meta iface_dp_meta; -- 2.4.11