ldap_id_services.c revision 4fcc50e133f90cd4c5931a3ac48c84cb628b16fc
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/*
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen SSSD
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen Authors:
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen Stephen Gallagher <sgallagh@redhat.com>
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen Copyright (C) 2012 Red Hat
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen This program is free software; you can redistribute it and/or modify
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen it under the terms of the GNU General Public License as published by
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen the Free Software Foundation; either version 3 of the License, or
51dbc2d559815da774f8ee5faf0e28df3c8d40c0Timo Sirainen (at your option) any later version.
51dbc2d559815da774f8ee5faf0e28df3c8d40c0Timo Sirainen
51dbc2d559815da774f8ee5faf0e28df3c8d40c0Timo Sirainen This program is distributed in the hope that it will be useful,
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen GNU General Public License for more details.
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen You should have received a copy of the GNU General Public License
6b0e35b29f65a95fe8ae22ed8b5f0f36720c9f45Timo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen*/
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#include <errno.h>
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#include "util/util.h"
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen#include "util/strtonum.h"
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#include "db/sysdb.h"
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen#include "db/sysdb_services.h"
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen#include "providers/ldap/ldap_common.h"
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#include "providers/ldap/sdap_async.h"
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
9b61a6db87c026656f8d2ae214e4486b98a069c0Timo Sirainenstruct sdap_services_get_state {
9b61a6db87c026656f8d2ae214e4486b98a069c0Timo Sirainen struct tevent_context *ev;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen struct sdap_id_ctx *id_ctx;
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen struct sdap_domain *sdom;
9346506a9f4dd9a6285fe8595588e73161849235Timo Sirainen struct sdap_id_op *op;
eca38954bcf972618f6b85932a3690acbd2b673aTimo Sirainen struct sysdb_ctx *sysdb;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen struct sss_domain_info *domain;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct sdap_id_conn_ctx *conn;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen
9b61a6db87c026656f8d2ae214e4486b98a069c0Timo Sirainen const char *name;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen const char *protocol;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen char *filter;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen const char **attrs;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen int filter_type;
9c0cd052c03799d764938ffe500cf510bf9eb464Timo Sirainen
65e14cef911d5d3fac8993c8a76911a587f05cd7Timo Sirainen int dp_error;
65e14cef911d5d3fac8993c8a76911a587f05cd7Timo Sirainen int sdap_ret;
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen bool noexist_delete;
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen};
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen
9c0cd052c03799d764938ffe500cf510bf9eb464Timo Sirainenstatic errno_t
3f7583189249a28892cd5bd69e15681c7a8a619bTimo Sirainenservices_get_retry(struct tevent_req *req);
3f7583189249a28892cd5bd69e15681c7a8a619bTimo Sirainenstatic void
9c0cd052c03799d764938ffe500cf510bf9eb464Timo Sirainenservices_get_connect_done(struct tevent_req *subreq);
d19d3aa4eafa34b48b7d7d311c9db31e1898576aTimo Sirainenstatic void
d19d3aa4eafa34b48b7d7d311c9db31e1898576aTimo Sirainenservices_get_done(struct tevent_req *subreq);
6b0e35b29f65a95fe8ae22ed8b5f0f36720c9f45Timo Sirainen
6b0e35b29f65a95fe8ae22ed8b5f0f36720c9f45Timo Sirainenstruct tevent_req *
6b0e35b29f65a95fe8ae22ed8b5f0f36720c9f45Timo Sirainenservices_get_send(TALLOC_CTX *mem_ctx,
9c0cd052c03799d764938ffe500cf510bf9eb464Timo Sirainen struct tevent_context *ev,
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen struct sdap_id_ctx *id_ctx,
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen struct sdap_domain *sdom,
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen struct sdap_id_conn_ctx *conn,
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen const char *name,
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen const char *protocol,
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen int filter_type,
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen bool noexist_delete)
9c0cd052c03799d764938ffe500cf510bf9eb464Timo Sirainen{
9c0cd052c03799d764938ffe500cf510bf9eb464Timo Sirainen errno_t ret;
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen struct tevent_req *req;
9c0cd052c03799d764938ffe500cf510bf9eb464Timo Sirainen struct sdap_services_get_state *state;
65e14cef911d5d3fac8993c8a76911a587f05cd7Timo Sirainen const char *attr_name;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen char *clean_name;
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen char *clean_protocol = NULL;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen req = tevent_req_create(mem_ctx, &state, struct sdap_services_get_state);
e5acc283bf030b0b5c79ca4e52d315c516a299faPascal Volk if (!req) return NULL;
f0339f522dc9c8e2e8a29ef9a3f937c431c6bd1bTimo Sirainen
65e14cef911d5d3fac8993c8a76911a587f05cd7Timo Sirainen state->ev = ev;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen state->id_ctx = id_ctx;
92d1458b00f4f236c4cec96a696253d3bbf8b05aTimo Sirainen state->sdom = sdom;
92d1458b00f4f236c4cec96a696253d3bbf8b05aTimo Sirainen state->conn = conn;
efe78d3ba24fc866af1c79b9223dc0809ba26cadStephan Bosch state->dp_error = DP_ERR_FATAL;
9346506a9f4dd9a6285fe8595588e73161849235Timo Sirainen state->domain = sdom->dom;
9346506a9f4dd9a6285fe8595588e73161849235Timo Sirainen state->sysdb = sdom->dom->sysdb;
9346506a9f4dd9a6285fe8595588e73161849235Timo Sirainen state->name = name;
9346506a9f4dd9a6285fe8595588e73161849235Timo Sirainen state->protocol = protocol;
20e04227229970d148801c507946666e2a9bd838Timo Sirainen state->filter_type = filter_type;
9b61a6db87c026656f8d2ae214e4486b98a069c0Timo Sirainen state->noexist_delete = noexist_delete;
10399559650f552a23949772be79eb6a80198c5aTimo Sirainen
eca38954bcf972618f6b85932a3690acbd2b673aTimo Sirainen state->op = sdap_id_op_create(state, state->conn->conn_cache);
10399559650f552a23949772be79eb6a80198c5aTimo Sirainen if (!state->op) {
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen DEBUG(SSSDBG_MINOR_FAILURE, ("sdap_id_op_create failed\n"));
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen ret = ENOMEM;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen goto error;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen }
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen switch(filter_type) {
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen case BE_FILTER_NAME:
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen attr_name = id_ctx->opts->service_map[SDAP_AT_SERVICE_NAME].name;
3764f786a6d13b23c49c9990b816be1e23a1adccAki Tuomi break;
3764f786a6d13b23c49c9990b816be1e23a1adccAki Tuomi case BE_FILTER_IDNUM:
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen attr_name = id_ctx->opts->service_map[SDAP_AT_SERVICE_PORT].name;
3764f786a6d13b23c49c9990b816be1e23a1adccAki Tuomi break;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen default:
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen ret = EINVAL;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen goto error;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen }
43d32cbe60fdaef2699d99f1ca259053e9350411Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen ret = sss_filter_sanitize(state, name, &clean_name);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen if (ret != EOK) goto error;
e392fcb39a06609af20a9e79017683f194de3ddeTimo Sirainen
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen if (protocol) {
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen ret = sss_filter_sanitize(state, protocol, &clean_protocol);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen if (ret != EOK) goto error;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen }
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen if (clean_protocol) {
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen state->filter = talloc_asprintf(
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen state, "(&(%s=%s)(%s=%s)(objectclass=%s))",
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen attr_name, clean_name,
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen id_ctx->opts->service_map[SDAP_AT_SERVICE_PROTOCOL].name,
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen clean_protocol,
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen id_ctx->opts->service_map[SDAP_OC_SERVICE].name);
2b682d8d3661800f16aceaa45fa4de9b6b140a59Timo Sirainen } else {
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen state->filter =
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen talloc_asprintf(state, "(&(%s=%s)(objectclass=%s))",
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen attr_name, clean_name,
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen id_ctx->opts->service_map[SDAP_OC_SERVICE].name);
8595bafebf582a04fdff49af3cc69919c5332a0dTimo Sirainen }
6b0e35b29f65a95fe8ae22ed8b5f0f36720c9f45Timo Sirainen talloc_zfree(clean_name);
6b0e35b29f65a95fe8ae22ed8b5f0f36720c9f45Timo Sirainen talloc_zfree(clean_protocol);
6b0e35b29f65a95fe8ae22ed8b5f0f36720c9f45Timo Sirainen if (!state->filter) {
6b0e35b29f65a95fe8ae22ed8b5f0f36720c9f45Timo Sirainen DEBUG(SSSDBG_MINOR_FAILURE,
6b0e35b29f65a95fe8ae22ed8b5f0f36720c9f45Timo Sirainen ("Failed to build the base filter\n"));
6b0e35b29f65a95fe8ae22ed8b5f0f36720c9f45Timo Sirainen ret = ENOMEM;
6b0e35b29f65a95fe8ae22ed8b5f0f36720c9f45Timo Sirainen goto error;
6b0e35b29f65a95fe8ae22ed8b5f0f36720c9f45Timo Sirainen }
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen DEBUG(SSSDBG_TRACE_LIBS,
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen ("Preparing to search for services with filter [%s]\n",
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen state->filter));
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen ret = build_attrs_from_map(state, id_ctx->opts->service_map,
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen SDAP_OPTS_SERVICES, NULL,
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen &state->attrs, NULL);
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen if (ret != EOK) goto error;
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen ret = services_get_retry(req);
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen if (ret != EOK) goto error;
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen return req;
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainenerror:
f8ead0942a9b7c8fcf91414ed1b534d5807ca555Timo Sirainen tevent_req_error(req, ret);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen tevent_req_post(req, ev);
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen return req;
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen}
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainenstatic errno_t
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainenservices_get_retry(struct tevent_req *req)
51dbc2d559815da774f8ee5faf0e28df3c8d40c0Timo Sirainen{
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen errno_t ret;
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen struct sdap_services_get_state *state =
b5052fbfdbc2678cc8f12899afe55c998f43b740Timo Sirainen tevent_req_data(req, struct sdap_services_get_state);
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen struct tevent_req *subreq;
b5052fbfdbc2678cc8f12899afe55c998f43b740Timo Sirainen
b5052fbfdbc2678cc8f12899afe55c998f43b740Timo Sirainen subreq = sdap_id_op_connect_send(state->op, state, &ret);
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen if (!subreq) {
b5052fbfdbc2678cc8f12899afe55c998f43b740Timo Sirainen return ret;
b5052fbfdbc2678cc8f12899afe55c998f43b740Timo Sirainen }
b5052fbfdbc2678cc8f12899afe55c998f43b740Timo Sirainen
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen tevent_req_set_callback(subreq, services_get_connect_done, req);
b5052fbfdbc2678cc8f12899afe55c998f43b740Timo Sirainen return EOK;
e48f289d2e5b2546a2c5dcc90f7ab624cc58cca2Stephan Bosch}
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainenstatic void
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainenservices_get_connect_done(struct tevent_req *subreq)
e48f289d2e5b2546a2c5dcc90f7ab624cc58cca2Stephan Bosch{
e48f289d2e5b2546a2c5dcc90f7ab624cc58cca2Stephan Bosch errno_t ret;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen struct tevent_req *req =
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen tevent_req_callback_data(subreq, struct tevent_req);
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen struct sdap_services_get_state *state =
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen tevent_req_data(req, struct sdap_services_get_state);
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen int dp_error = DP_ERR_FATAL;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen ret = sdap_id_op_connect_recv(subreq, &dp_error);
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen talloc_zfree(subreq);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen if (ret != EOK) {
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen state->dp_error = dp_error;
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen tevent_req_error(req, ret);
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen return;
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen }
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen subreq = sdap_get_services_send(state, state->ev,
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen state->domain, state->sysdb,
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen state->id_ctx->opts,
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen state->sdom->service_search_bases,
661998e2ccd772ad92a9d4a75cb712692a8c94b3Timo Sirainen sdap_id_op_handle(state->op),
661998e2ccd772ad92a9d4a75cb712692a8c94b3Timo Sirainen state->attrs, state->filter,
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen dp_opt_get_int(state->id_ctx->opts->basic,
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen SDAP_SEARCH_TIMEOUT),
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen false);
661998e2ccd772ad92a9d4a75cb712692a8c94b3Timo Sirainen if (!subreq) {
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen tevent_req_error(req, ENOMEM);
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen return;
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen }
661998e2ccd772ad92a9d4a75cb712692a8c94b3Timo Sirainen tevent_req_set_callback(subreq, services_get_done, req);
661998e2ccd772ad92a9d4a75cb712692a8c94b3Timo Sirainen}
661998e2ccd772ad92a9d4a75cb712692a8c94b3Timo Sirainen
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainenstatic void
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainenservices_get_done(struct tevent_req *subreq)
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen{
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen errno_t ret;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen uint16_t port;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct tevent_req *req =
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen tevent_req_callback_data(subreq, struct tevent_req);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct sdap_services_get_state *state =
51dbc2d559815da774f8ee5faf0e28df3c8d40c0Timo Sirainen tevent_req_data(req, struct sdap_services_get_state);
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen int dp_error = DP_ERR_FATAL;
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen
39dea5f2e78f6bfc3adc0655176f596ee211938fTimo Sirainen ret = sdap_get_services_recv(NULL, subreq, NULL);
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen talloc_zfree(subreq);
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen /* Check whether we need to try again with another
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen * failover server.
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen */
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen ret = sdap_id_op_done(state->op, ret, &dp_error);
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen if (dp_error == DP_ERR_OK && ret != EOK) {
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen /* retry */
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen ret = services_get_retry(req);
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen if (ret != EOK) {
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen tevent_req_error(req, ret);
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen return;
8f7e81b327b8b5bf34262f6755df6d4481760d23Timo Sirainen }
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen /* Return to the mainloop to retry */
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen return;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen }
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen state->sdap_ret = ret;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
048e40f9364fa68482bc276dd4a5d595a3d742e9Timo Sirainen /* An error occurred. */
048e40f9364fa68482bc276dd4a5d595a3d742e9Timo Sirainen if (ret && ret != ENOENT) {
048e40f9364fa68482bc276dd4a5d595a3d742e9Timo Sirainen state->dp_error = dp_error;
048e40f9364fa68482bc276dd4a5d595a3d742e9Timo Sirainen tevent_req_error(req, ret);
c4478af52de63804efef2055580adf1dfc8679c6Timo Sirainen return;
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen }
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen
c4478af52de63804efef2055580adf1dfc8679c6Timo Sirainen if (ret == ENOENT && state->noexist_delete == true) {
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen /* Ensure that this entry is removed from the sysdb */
048e40f9364fa68482bc276dd4a5d595a3d742e9Timo Sirainen switch(state->filter_type) {
048e40f9364fa68482bc276dd4a5d595a3d742e9Timo Sirainen case BE_FILTER_NAME:
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen ret = sysdb_svc_delete(state->domain, state->name,
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen 0, state->protocol);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen if (ret != EOK) {
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen tevent_req_error(req, ret);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen return;
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen }
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen break;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen case BE_FILTER_IDNUM:
cb931f84e3ec8e3deda253a1c0ae0409023de096Timo Sirainen port = strtouint16(state->name, NULL, 10);
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen if (errno) {
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen tevent_req_error(req, errno);
6d6bbe8787354bbb69d0c03187adfe0f497d70b8Timo Sirainen return;
048e40f9364fa68482bc276dd4a5d595a3d742e9Timo Sirainen }
048e40f9364fa68482bc276dd4a5d595a3d742e9Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen ret = sysdb_svc_delete(state->domain, NULL, port,
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen state->protocol);
if (ret != EOK) {
tevent_req_error(req, ret);
return;
}
break;
default:
tevent_req_error(req, EINVAL);
return;
}
}
state->dp_error = DP_ERR_OK;
tevent_req_done(req);
}
errno_t
services_get_recv(struct tevent_req *req, int *dp_error_out, int *sdap_ret)
{
struct sdap_services_get_state *state =
tevent_req_data(req, struct sdap_services_get_state);
if (dp_error_out) {
*dp_error_out = state->dp_error;
}
if (sdap_ret) {
*sdap_ret = state->sdap_ret;
}
TEVENT_REQ_RETURN_ON_ERROR(req);
return EOK;
}