autofssrv_cmd.c revision 129310e872a0a70e721ba59363e518176ef406d6
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/*
657afb33796f8216c568ad813627da89970760beTimo Sirainen Authors:
08d6658a4e2ec8104cd1307f6baa75fdb07a24f8Mark Washenberger Jakub Hrozek <jhrozek@redhat.com>
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
a550b0fbcf7e876eeb88f4528209ed28cc416752Timo Sirainen Copyright (C) 2012 Red Hat
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen Autofs responder: commands
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen This program is free software; you can redistribute it and/or modify
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen it under the terms of the GNU General Public License as published by
d99107ddf4d9bccb710994482daf65276a9d6321Timo Sirainen the Free Software Foundation; either version 3 of the License, or
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen (at your option) any later version.
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
ecb1b2d6236942bf82f822e8d0167f0e160b206dTimo Sirainen This program is distributed in the hope that it will be useful,
657afb33796f8216c568ad813627da89970760beTimo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
657afb33796f8216c568ad813627da89970760beTimo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen GNU General Public License for more details.
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
a3b3e5b452be15049a1f8bfd5b3bb640af41121cTimo Sirainen You should have received a copy of the GNU General Public License
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen*/
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen#include <talloc.h>
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen#include "util/util.h"
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen#include "responder/common/responder.h"
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen#include "responder/common/responder_packet.h"
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen#include "responder/autofs/autofs_private.h"
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen#include "db/sysdb.h"
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen#include "db/sysdb_autofs.h"
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen#include "confdb/confdb.h"
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainenstatic int autofs_cmd_send_error(struct autofs_cmd_ctx *cmdctx, int err)
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen{
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen return sss_cmd_send_error(cmdctx->cctx, err);
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen}
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainenstatic int
657afb33796f8216c568ad813627da89970760beTimo Sirainenautofs_cmd_send_empty(struct autofs_cmd_ctx *cmdctx)
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen{
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen return sss_cmd_send_empty(cmdctx->cctx, cmdctx);
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen}
657afb33796f8216c568ad813627da89970760beTimo Sirainen
9be4e6701d086c009f3db1913a148139ea180420Timo Sirainenstatic int
ad49932dae8ba31e07544b66bbc4f4de707a751cTimo Sirainenautofs_cmd_done(struct autofs_cmd_ctx *cmdctx, int ret)
657afb33796f8216c568ad813627da89970760beTimo Sirainen{
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen switch (ret) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen case EOK:
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* all fine, just return here */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen break;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen case ENOENT:
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ret = autofs_cmd_send_empty(cmdctx);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (ret) {
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen return EFAULT;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen break;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen case EAGAIN:
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* async processing, just return here */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen break;
a7e2c98560cf54dc656711a237cb07da8a5a9ee4Timo Sirainen
a7e2c98560cf54dc656711a237cb07da8a5a9ee4Timo Sirainen case EFAULT:
a7e2c98560cf54dc656711a237cb07da8a5a9ee4Timo Sirainen /* very bad error */
a7e2c98560cf54dc656711a237cb07da8a5a9ee4Timo Sirainen return EFAULT;
a7e2c98560cf54dc656711a237cb07da8a5a9ee4Timo Sirainen
a7e2c98560cf54dc656711a237cb07da8a5a9ee4Timo Sirainen default:
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen ret = autofs_cmd_send_error(cmdctx, ret);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (ret) {
f19cf95ae8fc233567b1c7751595eb66876d684aTimo Sirainen return EFAULT;
f19cf95ae8fc233567b1c7751595eb66876d684aTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen sss_cmd_done(cmdctx->cctx, cmdctx);
f19cf95ae8fc233567b1c7751595eb66876d684aTimo Sirainen break;
f19cf95ae8fc233567b1c7751595eb66876d684aTimo Sirainen }
f19cf95ae8fc233567b1c7751595eb66876d684aTimo Sirainen
f19cf95ae8fc233567b1c7751595eb66876d684aTimo Sirainen return EOK;
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainen}
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainen
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainenstatic errno_t
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainenautofs_setent_add_ref(TALLOC_CTX *memctx,
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainen struct autofs_map_ctx *map_ctx,
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainen struct tevent_req *req)
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainen{
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainen return setent_add_ref(memctx, map_ctx, &map_ctx->reqs, req);
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainen}
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainen
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainenstatic void
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainenautofs_setent_notify(struct autofs_map_ctx *map_ctx, errno_t ret)
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainen{
cc4d0d30fbba883d5d1b600646491fb77bdb989cTimo Sirainen setent_notify(&map_ctx->reqs, ret);
f19cf95ae8fc233567b1c7751595eb66876d684aTimo Sirainen}
f19cf95ae8fc233567b1c7751595eb66876d684aTimo Sirainen
8c6c6b95f482d2a2cdc74db5582aeb24871e3579Timo Sirainenstatic errno_t
8c6c6b95f482d2a2cdc74db5582aeb24871e3579Timo Sirainenget_autofs_map(struct autofs_ctx *actx,
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen char *mapname,
fbee9bffb56d882b98146dd0de76a5bcccc2bdc3Timo Sirainen struct autofs_map_ctx **map)
fbee9bffb56d882b98146dd0de76a5bcccc2bdc3Timo Sirainen{
fbee9bffb56d882b98146dd0de76a5bcccc2bdc3Timo Sirainen hash_key_t key;
fbee9bffb56d882b98146dd0de76a5bcccc2bdc3Timo Sirainen hash_value_t value;
fbee9bffb56d882b98146dd0de76a5bcccc2bdc3Timo Sirainen int hret;
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen key.type = HASH_KEY_STRING;
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen key.str = mapname;
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen hret = hash_lookup(actx->maps, &key, &value);
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen if (hret == HASH_SUCCESS) {
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen *map = talloc_get_type(value.ptr, struct autofs_map_ctx);
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen return EOK;
fbee9bffb56d882b98146dd0de76a5bcccc2bdc3Timo Sirainen } else if (hret == HASH_ERROR_KEY_NOT_FOUND) {
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen return ENOENT;
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen }
fbee9bffb56d882b98146dd0de76a5bcccc2bdc3Timo Sirainen
fbee9bffb56d882b98146dd0de76a5bcccc2bdc3Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen ("Unexpected error reading from autofs map hash [%d][%s]\n",
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen hret, hash_error_string(hret)));
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen return EIO;
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen}
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainenstatic int autofs_map_hash_remove (TALLOC_CTX *ctx);
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainenstatic errno_t
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainenset_autofs_map(struct autofs_ctx *actx,
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen struct autofs_map_ctx *map)
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen{
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen hash_key_t key;
70905e51a5148bd5613cb04720807177474a2496Timo Sirainen hash_value_t value;
70905e51a5148bd5613cb04720807177474a2496Timo Sirainen int hret;
70905e51a5148bd5613cb04720807177474a2496Timo Sirainen
657afb33796f8216c568ad813627da89970760beTimo Sirainen if (map->mapname == NULL) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Missing netgroup name.\n"));
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen return EINVAL;
657afb33796f8216c568ad813627da89970760beTimo Sirainen }
657afb33796f8216c568ad813627da89970760beTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* Add this entry to the hash table */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen key.type = HASH_KEY_STRING;
657afb33796f8216c568ad813627da89970760beTimo Sirainen key.str = map->mapname;
48ac75465ae154b1d705f18de6d95045ab714b65Timo Sirainen value.type = HASH_VALUE_PTR;
48ac75465ae154b1d705f18de6d95045ab714b65Timo Sirainen value.ptr = map;
ea95a057fa5f02d50027122cacd3147fce7679faTimo Sirainen hret = hash_enter(actx->maps, &key, &value);
ea95a057fa5f02d50027122cacd3147fce7679faTimo Sirainen if (hret != EOK) {
ea95a057fa5f02d50027122cacd3147fce7679faTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
ea95a057fa5f02d50027122cacd3147fce7679faTimo Sirainen ("Unable to add hash table entry for [%s]", key.str));
ea95a057fa5f02d50027122cacd3147fce7679faTimo Sirainen DEBUG(SSSDBG_MINOR_FAILURE,
ea95a057fa5f02d50027122cacd3147fce7679faTimo Sirainen ("Hash error [%d][%s]", hret, hash_error_string(hret)));
e69e7b734b625de1f8921b7e0d92afa1df6b900dTimo Sirainen return EIO;
e69e7b734b625de1f8921b7e0d92afa1df6b900dTimo Sirainen }
e69e7b734b625de1f8921b7e0d92afa1df6b900dTimo Sirainen talloc_steal(actx->maps, map);
e69e7b734b625de1f8921b7e0d92afa1df6b900dTimo Sirainen talloc_set_destructor((TALLOC_CTX *) map, autofs_map_hash_remove);
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen return EOK;
657afb33796f8216c568ad813627da89970760beTimo Sirainen}
657afb33796f8216c568ad813627da89970760beTimo Sirainen
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainenstatic int
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainenautofs_map_hash_remove(TALLOC_CTX *ctx)
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen{
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen int hret;
8bb360f9e5de1c25e4f875205bb06e8bf15dae14Timo Sirainen hash_key_t key;
662a9000b1788f1cdf765e6b1c89df9a42cc3e32Timo Sirainen struct autofs_map_ctx *map =
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen talloc_get_type(ctx, struct autofs_map_ctx);
bbf81c8fc6f21382707673dc6bd7b87ffc27981bTimo Sirainen
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen key.type = HASH_KEY_STRING;
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen key.str = map->mapname;
bbf81c8fc6f21382707673dc6bd7b87ffc27981bTimo Sirainen
1e0bdb2d0fa7bbd0a0a254754680f6c6d0195333Timo Sirainen /* Remove the netgroup result object from the lookup table */
aefe17424820c57bcb05b0aaec4a930e8222baccTimo Sirainen hret = hash_delete(map->map_table, &key);
aefe17424820c57bcb05b0aaec4a930e8222baccTimo Sirainen if (hret != HASH_SUCCESS) {
aefe17424820c57bcb05b0aaec4a930e8222baccTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
aefe17424820c57bcb05b0aaec4a930e8222baccTimo Sirainen ("Could not remove key from table! [%d][%s]\n",
aefe17424820c57bcb05b0aaec4a930e8222baccTimo Sirainen hret, hash_error_string(hret)));
1e0bdb2d0fa7bbd0a0a254754680f6c6d0195333Timo Sirainen return -1;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
3c296d819c54e21ce05c3d2eeeedc79be42ac593Timo Sirainen return 0;
8bb360f9e5de1c25e4f875205bb06e8bf15dae14Timo Sirainen}
1e0bdb2d0fa7bbd0a0a254754680f6c6d0195333Timo Sirainen
662a9000b1788f1cdf765e6b1c89df9a42cc3e32Timo Sirainenstatic struct tevent_req *
662a9000b1788f1cdf765e6b1c89df9a42cc3e32Timo Sirainensetautomntent_send(TALLOC_CTX *mem_ctx,
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen const char *rawname,
1e0bdb2d0fa7bbd0a0a254754680f6c6d0195333Timo Sirainen struct autofs_cmd_ctx *cmdctx);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainenstatic errno_t setautomntent_recv(struct tevent_req *req);
662a9000b1788f1cdf765e6b1c89df9a42cc3e32Timo Sirainenstatic void sss_autofs_cmd_setautomntent_done(struct tevent_req *req);
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen/* FIXME - file a ticket to have per-responder private
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen * data instead of growing the cli_ctx structure */
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainenstatic int
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainensss_autofs_cmd_setautomntent(struct cli_ctx *client)
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen{
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen struct autofs_cmd_ctx *cmdctx;
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen uint8_t *body;
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen size_t blen;
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen errno_t ret = EOK;
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen const char *rawname;
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen struct tevent_req *req;
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen
662a9000b1788f1cdf765e6b1c89df9a42cc3e32Timo Sirainen DEBUG(SSSDBG_TRACE_INTERNAL, ("sss_autofs_cmd_setautomntent\n"));
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen cmdctx = talloc_zero(client, struct autofs_cmd_ctx);
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen if (!cmdctx) {
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen return ENOMEM;
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen }
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen cmdctx->cctx = client;
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen sss_packet_get_body(client->creq->in, &body, &blen);
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen /* if not terminated fail */
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen if (body[blen -1] != '\0') {
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen ret = EINVAL;
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen goto done;
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen }
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen /* If the body isn't valid UTF-8, fail */
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen if (!sss_utf8_check(body, blen -1)) {
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen ret = EINVAL;
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen goto done;
9d75363d3fbabc2fbc2d80f06672e3ed8965804aTimo Sirainen }
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen rawname = (const char *)body;
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen DEBUG(SSSDBG_TRACE_FUNC,
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen ("Got request for automount map named %s\n", rawname));
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen req = setautomntent_send(cmdctx, rawname, cmdctx);
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen if (!req) {
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen DEBUG(0, ("Fatal error calling setautomntent_send\n"));
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen ret = EIO;
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen goto done;
2c8ff32886e56a5e037169c9ebef4219f85a5629Timo Sirainen }
2c8ff32886e56a5e037169c9ebef4219f85a5629Timo Sirainen tevent_req_set_callback(req, sss_autofs_cmd_setautomntent_done, cmdctx);
2c8ff32886e56a5e037169c9ebef4219f85a5629Timo Sirainen
2c8ff32886e56a5e037169c9ebef4219f85a5629Timo Sirainen ret = EOK;
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainendone:
48ac75465ae154b1d705f18de6d95045ab714b65Timo Sirainen return autofs_cmd_done(cmdctx, ret);
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen}
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainenstatic void sss_autofs_cmd_setautomntent_done(struct tevent_req *req)
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen{
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen struct autofs_cmd_ctx *cmdctx =
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen tevent_req_callback_data(req, struct autofs_cmd_ctx);
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen errno_t ret;
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen errno_t reqret;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen struct sss_packet *packet;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen uint8_t *body;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen size_t blen;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen DEBUG(SSSDBG_TRACE_INTERNAL, ("setautomntent done\n"));
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen reqret = setautomntent_recv(req);
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen talloc_zfree(req);
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen if (reqret != EOK && reqret != ENOENT) {
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("setautomntent_recv failed\n"));
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen autofs_cmd_done(cmdctx, reqret);
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen return;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen }
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen /* Either we succeeded or no domains were eligible */
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen ret = sss_packet_new(cmdctx->cctx->creq, 0,
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen sss_packet_get_cmd(cmdctx->cctx->creq->in),
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen &cmdctx->cctx->creq->out);
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen if (ret == EOK) {
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen if (reqret == ENOENT) {
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen DEBUG(SSSDBG_TRACE_FUNC, ("setautomntent did not find requested map\n"));
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen /* Notify the caller that this entry wasn't found */
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen sss_cmd_empty_packet(cmdctx->cctx->creq->out);
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen } else {
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen DEBUG(SSSDBG_TRACE_FUNC, ("setautomntent found data\n"));
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen packet = cmdctx->cctx->creq->out;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen ret = sss_packet_grow(packet, 2*sizeof(uint32_t));
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen if (ret != EOK) {
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Couldn't grow the packet\n"));
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen talloc_free(cmdctx);
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen return;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen }
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen sss_packet_get_body(packet, &body, &blen);
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen ((uint32_t *)body)[0] = 1; /* Got some results */
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen ((uint32_t *)body)[1] = 0; /* reserved */
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen }
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen sss_cmd_done(cmdctx->cctx, NULL);
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen return;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen }
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Error creating packet\n"));
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen return;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen}
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainenstruct setautomntent_state {
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen struct autofs_cmd_ctx *cmdctx;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen struct autofs_dom_ctx *dctx;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen char *mapname;
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen struct autofs_map_ctx *map;
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen};
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainenstruct setautomntent_lookup_ctx {
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen struct autofs_ctx *actx;
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen struct autofs_dom_ctx *dctx;
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen struct resp_ctx *rctx;
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen struct cli_ctx *cctx;
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen bool returned_to_mainloop;
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen char *mapname;
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen struct autofs_map_ctx *map;
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen};
190d84a496d6893ed54fe5bdb9e503285583d13fTimo Sirainen
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainenstatic errno_t
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainenlookup_automntmap_step(struct setautomntent_lookup_ctx *lookup_ctx);
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainenstatic void
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainenautofs_map_result_timeout(struct tevent_context *ev,
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen struct tevent_timer *te,
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen struct timeval current_time,
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen void *pvt)
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen{
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen struct autofs_map_ctx *map =
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen talloc_get_type(pvt, struct autofs_map_ctx);
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen /* Free the autofs map result context
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen * The destructor for the autofs map will remove itself
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen * from the hash table
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen */
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen talloc_free(map);
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen}
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainenstatic void
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainenset_autofs_map_lifetime(uint32_t lifetime,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen struct setautomntent_lookup_ctx *lookup_ctx,
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen struct autofs_map_ctx *map)
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen{
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen struct timeval tv;
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen struct tevent_timer *te;
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen tv = tevent_timeval_current_ofs(lifetime, 0);
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen te = tevent_add_timer(lookup_ctx->rctx->ev,
e8a96ad5c10e9d5c0c4e2e88dd09a38fdb3e34b4Timo Sirainen lookup_ctx->rctx, tv,
e8a96ad5c10e9d5c0c4e2e88dd09a38fdb3e34b4Timo Sirainen autofs_map_result_timeout,
e8a96ad5c10e9d5c0c4e2e88dd09a38fdb3e34b4Timo Sirainen map);
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen if (!te) {
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ("Could not set up life timer for autofs maps. "
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen "Entries may become stale.\n"));
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen }
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen}
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainenstatic struct tevent_req *
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainensetautomntent_send(TALLOC_CTX *mem_ctx,
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen const char *rawname,
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen struct autofs_cmd_ctx *cmdctx)
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen{
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen char *domname;
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen errno_t ret;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen struct tevent_req *req;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen struct setautomntent_state *state;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen struct cli_ctx *client = cmdctx->cctx;
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen struct autofs_dom_ctx *dctx;
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen struct autofs_ctx *actx =
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen talloc_get_type(client->rctx->pvt_ctx, struct autofs_ctx);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen struct setautomntent_lookup_ctx *lookup_ctx;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen req = tevent_req_create(mem_ctx, &state, struct setautomntent_state);
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen if (!req) {
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE,
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen ("Could not create tevent request for setautomntent\n"));
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen goto fail;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen }
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen state->cmdctx = cmdctx;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen dctx = talloc_zero(state, struct autofs_dom_ctx);
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen if (!dctx) {
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, ("Out of memory\n"));
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen goto fail;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen dctx->cmd_ctx = state->cmdctx;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen state->dctx = dctx;
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ret = sss_parse_name(state, client->rctx->names, rawname,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen &domname, &state->mapname);
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen if (ret != EOK) {
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE,
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen ("Invalid name received [%s]\n", rawname));
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen goto fail;
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen }
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen DEBUG(SSSDBG_TRACE_FUNC,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ("Requesting info for automount map [%s] from [%s]\n",
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen state->mapname, domname?domname:"<ALL>"));
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (domname) {
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen dctx->domain = responder_get_domain(client->rctx->domains, domname);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (!dctx->domain) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen goto fail;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen client->automntmap_name = talloc_strdup(client, rawname);
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen if (!client->automntmap_name) {
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen goto fail;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen } else {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* this is a multidomain search */
657afb33796f8216c568ad813627da89970760beTimo Sirainen dctx->domain = client->rctx->domains;
657afb33796f8216c568ad813627da89970760beTimo Sirainen cmdctx->check_next = true;
48ac75465ae154b1d705f18de6d95045ab714b65Timo Sirainen
48ac75465ae154b1d705f18de6d95045ab714b65Timo Sirainen client->automntmap_name = talloc_strdup(client, state->mapname);
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen if (!client->automntmap_name) {
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen goto fail;
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen }
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen }
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen dctx->check_provider = NEED_CHECK_PROVIDER(dctx->domain->provider);
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen /* Is the result context already available?
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen * Check for existing lookups for this map
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen */
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen ret = get_autofs_map(actx, state->mapname, &state->map);
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen if (ret == EOK) {
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen /* Another process already requested this map
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen * Check whether it's ready for processing.
a72dde3805d0e9148de4caf44d6f4dc167431380Timo Sirainen */
48ac75465ae154b1d705f18de6d95045ab714b65Timo Sirainen if (state->map->ready) {
48ac75465ae154b1d705f18de6d95045ab714b65Timo Sirainen if (state->map->found) {
48ac75465ae154b1d705f18de6d95045ab714b65Timo Sirainen DEBUG(SSSDBG_TRACE_LIBS,
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen ("Map %s is ready to be processed\n", state->mapname));
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen tevent_req_done(req);
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen tevent_req_post(req, actx->rctx->ev);
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen return req;
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen } else {
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen DEBUG(SSSDBG_TRACE_LIBS,
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen ("Map %s was marked as nonexistent\n", state->mapname));
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen tevent_req_error(req, ENOENT);
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen tevent_req_post(req, actx->rctx->ev);
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen return req;
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen }
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen }
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen /* Result object is still being constructed
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen * Register for notification when it's ready
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen */
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen DEBUG(SSSDBG_TRACE_LIBS,
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen ("Map %s is being looked up, registering for notification\n",
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen state->mapname));
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen ret = autofs_setent_add_ref(state, state->map, req);
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen if (ret != EOK) {
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen goto fail;
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen }
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen /* Will return control below */
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen } else if (ret == ENOENT) {
657afb33796f8216c568ad813627da89970760beTimo Sirainen DEBUG(SSSDBG_TRACE_LIBS,
7242e1ce7803b83bc82e239ef111b47c1c72dd4bAndrey Panin ("Map %s needs to be looked up\n", state->mapname));
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen state->map = talloc_zero(actx, struct autofs_map_ctx);
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen if (!state->map) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ret = ENOMEM;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen goto fail;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen dctx->map_ctx = state->map;
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen state->map->mapname = talloc_strdup(state->map, state->mapname);
3c296d819c54e21ce05c3d2eeeedc79be42ac593Timo Sirainen if (!state->map->mapname) {
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen talloc_free(state->map);
5363f51ad46344f4e5952f2fef211a7cf8f95ddcTimo Sirainen ret = ENOMEM;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen goto fail;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen state->map->map_table = actx->maps;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ret = autofs_setent_add_ref(state, state->map, req);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (ret != EOK) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen talloc_free(state->map);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen goto fail;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ret = set_autofs_map(actx, state->map);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (ret != EOK) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen talloc_free(state->map);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen goto fail;
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen }
48ac75465ae154b1d705f18de6d95045ab714b65Timo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* Perform lookup */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen lookup_ctx = talloc_zero(state->map, struct setautomntent_lookup_ctx);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (!lookup_ctx) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen talloc_free(state->map);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ret = ENOMEM;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen goto fail;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* Steal the dom_ctx onto the lookup_ctx so it doesn't go out of scope if
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen * this request is canceled while other requests are in-progress.
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen lookup_ctx->dctx = talloc_steal(lookup_ctx, state->dctx);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen lookup_ctx->actx = actx;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen lookup_ctx->map = state->map;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen lookup_ctx->rctx = client->rctx;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen lookup_ctx->mapname =
ab122a3bbae3b5fd2aad66e2f2840149d98cee52Timo Sirainen talloc_strdup(lookup_ctx, state->mapname);
70c181da837ed85fc5b0426c010b65609bda5329Timo Sirainen if (!lookup_ctx->mapname) {
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen talloc_free(state->map);
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen ret = ENOMEM;
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen goto fail;
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen }
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen ret = lookup_automntmap_step(lookup_ctx);
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen if (ret == EAGAIN) {
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen DEBUG(SSSDBG_TRACE_INTERNAL, ("lookup_automntmap_step "
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen "is refreshing the cache, re-entering the mainloop\n"));
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen return req;
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen } else if (ret != EOK) {
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Could not get data from cache\n"));
7904d81873b36f8464c96be415881f92518452e6Timo Sirainen talloc_free(state->map);
382c7aec3e3449ed8271c2a202b67cefaa31dc8eTimo Sirainen goto fail;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen tevent_req_done(req);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen tevent_req_post(req, cmdctx->cctx->ev);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen return req;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen } else {
7904d81873b36f8464c96be415881f92518452e6Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ("Unexpected error from get_autofs_map [%d]: %s\n",
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ret, strerror(ret)));
b5322c8270616a28f2e65cb3a09580c410bb0941Timo Sirainen goto fail;
b5322c8270616a28f2e65cb3a09580c410bb0941Timo Sirainen }
b5322c8270616a28f2e65cb3a09580c410bb0941Timo Sirainen
b5322c8270616a28f2e65cb3a09580c410bb0941Timo Sirainen return req;
b5322c8270616a28f2e65cb3a09580c410bb0941Timo Sirainen
b5322c8270616a28f2e65cb3a09580c410bb0941Timo Sirainenfail:
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen talloc_free(req);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen return NULL;
d99107ddf4d9bccb710994482daf65276a9d6321Timo Sirainen}
48ac75465ae154b1d705f18de6d95045ab714b65Timo Sirainen
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainenstatic errno_t
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainenlookup_automntmap_update_cache(struct setautomntent_lookup_ctx *lookup_ctx);
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen
258ff7d4f03dd9d29eca3664e4acacdf7f528234Timo Sirainenstatic errno_t
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainenlookup_automntmap_step(struct setautomntent_lookup_ctx *lookup_ctx)
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen{
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen errno_t ret;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen struct sss_domain_info *dom = lookup_ctx->dctx->domain;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen struct autofs_dom_ctx *dctx = lookup_ctx->dctx;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen struct sysdb_ctx *sysdb;
4f2248a8a70985c7295afc3bf91c848e81d740d9Timo Sirainen struct autofs_map_ctx *map;
4f2248a8a70985c7295afc3bf91c848e81d740d9Timo Sirainen
4f2248a8a70985c7295afc3bf91c848e81d740d9Timo Sirainen /* Check each domain for this map name */
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen while (dom) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* if it is a domainless search, skip domains that require fully
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen * qualified names instead */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen while (dom && dctx->cmd_ctx->check_next && dom->fqnames) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen dom = dom->next;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* No domains left to search */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (!dom) break;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen if (dom != dctx->domain) {
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen /* make sure we reset the check_provider flag when we check
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen * a new domain */
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen dctx->check_provider =
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen NEED_CHECK_PROVIDER(dom->provider);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen /* make sure to update the dctx if we changed domain */
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen dctx->domain = dom;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen DEBUG(SSSDBG_TRACE_FUNC, ("Requesting info for [%s@%s]\n",
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen lookup_ctx->mapname, dom->name));
2c8ff32886e56a5e037169c9ebef4219f85a5629Timo Sirainen ret = sysdb_get_ctx_from_list(lookup_ctx->rctx->db_list, dom, &sysdb);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (ret != EOK) {
657afb33796f8216c568ad813627da89970760beTimo Sirainen DEBUG(SSSDBG_FATAL_FAILURE,
657afb33796f8216c568ad813627da89970760beTimo Sirainen ("Fatal: Sysdb CTX not found for this domain!\n"));
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen return EIO;
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen }
657afb33796f8216c568ad813627da89970760beTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* Look into the cache */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen talloc_free(dctx->map);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ret = sysdb_get_map_byname(dctx, sysdb, lookup_ctx->mapname,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen &dctx->map);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (ret != EOK && ret != ENOENT) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, ("Could not check cache\n"));
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen return ret;
c53a3c54d388c0031aaa642e6b14d46eb86d9485Timo Sirainen } else if (ret == ENOENT) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen DEBUG(SSSDBG_MINOR_FAILURE,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ("No automount map [%s] in cache for domain [%s]\n",
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen lookup_ctx->mapname, dom->name));
ccb77e2f63626ec46e5745ef4f38baa8e8e504fcTimo Sirainen if (!dctx->check_provider) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (dctx->cmd_ctx->check_next) {
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen DEBUG(SSSDBG_TRACE_INTERNAL, ("Moving on to next domain\n"));
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen dom = dom->next;
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen continue;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen else break;
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen }
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen ret = EOK;
cac6735a6cd73f2b815a1f3c1e21855075e7c81eTimo Sirainen }
cac6735a6cd73f2b815a1f3c1e21855075e7c81eTimo Sirainen
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen ret = get_autofs_map(lookup_ctx->actx, lookup_ctx->mapname, &map);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (ret != EOK) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* Something really bad happened! */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Autofs map entry was lost!\n"));
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen return ret;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (dctx->map == NULL && !dctx->check_provider) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen DEBUG(SSSDBG_MINOR_FAILURE,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ("Autofs map not found, setting negative cache\n"));
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen map->ready = true;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen map->found = false;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen set_autofs_map_lifetime(lookup_ctx->actx->neg_timeout, lookup_ctx, map);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen return ENOENT;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (dctx->check_provider) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ret = lookup_automntmap_update_cache(lookup_ctx);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (ret == EAGAIN) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen DEBUG(SSSDBG_TRACE_INTERNAL,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ("Looking up automount maps from the DP\n"));
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen return EAGAIN;
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen } else if (ret != EOK) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen DEBUG(SSSDBG_OP_FAILURE,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ("Error looking up automount maps [%d]: %s\n",
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ret, strerror(ret)));
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen return ret;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen }
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* OK, the map is in cache and valid.
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen * Let's get all members and return it
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen */
3313a51ef9b245248d672c20f930c52a577a42f7Timo Sirainen ret = sysdb_autofs_entries_by_map(map, sysdb, map->mapname,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen &map->entry_count,
615c4aba4cc0b17eefba3263b85972adaba04586Timo Sirainen &map->entries);
615c4aba4cc0b17eefba3263b85972adaba04586Timo Sirainen if (ret != EOK && ret != ENOENT) {
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainen DEBUG(SSSDBG_OP_FAILURE,
615c4aba4cc0b17eefba3263b85972adaba04586Timo Sirainen ("Error looking automount map entries [%d]: %s\n",
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen ret, strerror(ret)));
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen map->ready = true;
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen map->found = false;
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen set_autofs_map_lifetime(lookup_ctx->actx->neg_timeout, lookup_ctx, map);
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen return EIO;
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen }
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen map->map = talloc_steal(map, dctx->map);
3313a51ef9b245248d672c20f930c52a577a42f7Timo Sirainen
3313a51ef9b245248d672c20f930c52a577a42f7Timo Sirainen DEBUG(SSSDBG_TRACE_FUNC,
3313a51ef9b245248d672c20f930c52a577a42f7Timo Sirainen ("setautomntent done for map %s\n", lookup_ctx->mapname));
3313a51ef9b245248d672c20f930c52a577a42f7Timo Sirainen map->ready = true;
3313a51ef9b245248d672c20f930c52a577a42f7Timo Sirainen map->found = true;
3313a51ef9b245248d672c20f930c52a577a42f7Timo Sirainen set_autofs_map_lifetime(dom->autofsmap_timeout, lookup_ctx, map);
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen return EOK;
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen }
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen map = talloc_zero(lookup_ctx->actx, struct autofs_map_ctx);
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen if (!map) {
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen return ENOMEM;
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen }
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen
533929e773388b28e0932fb5cfbdf455def58fe6Timo Sirainen map->ready = true;
533929e773388b28e0932fb5cfbdf455def58fe6Timo Sirainen map->found = false;
533929e773388b28e0932fb5cfbdf455def58fe6Timo Sirainen map->map_table = lookup_ctx->actx->maps;
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen map->mapname = talloc_strdup(map, lookup_ctx->mapname);
7e078be0d6f12ca56860641d36e3c517e3046895Timo Sirainen if (!map->mapname) {
7e078be0d6f12ca56860641d36e3c517e3046895Timo Sirainen talloc_free(map);
e8e966468f2667c18ec3f0a22ee48f01fa3a6eeaTimo Sirainen return ENOMEM;
e8e966468f2667c18ec3f0a22ee48f01fa3a6eeaTimo Sirainen }
e8e966468f2667c18ec3f0a22ee48f01fa3a6eeaTimo Sirainen
e8e966468f2667c18ec3f0a22ee48f01fa3a6eeaTimo Sirainen ret = set_autofs_map(lookup_ctx->actx, map);
e8e966468f2667c18ec3f0a22ee48f01fa3a6eeaTimo Sirainen if (ret != EOK) {
e8e966468f2667c18ec3f0a22ee48f01fa3a6eeaTimo Sirainen talloc_free(map);
e8e966468f2667c18ec3f0a22ee48f01fa3a6eeaTimo Sirainen return ENOMEM;
e8e966468f2667c18ec3f0a22ee48f01fa3a6eeaTimo Sirainen }
e8e966468f2667c18ec3f0a22ee48f01fa3a6eeaTimo Sirainen
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen set_autofs_map_lifetime(lookup_ctx->actx->neg_timeout, lookup_ctx, map);
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen /* If we've gotten here, then no domain contained this map */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen return ENOENT;
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen}
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
ecb1b2d6236942bf82f822e8d0167f0e160b206dTimo Sirainenstatic void lookup_automntmap_cache_updated(uint16_t err_maj, uint32_t err_min,
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen const char *err_msg, void *ptr);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenstatic void autofs_dp_send_map_req_done(struct tevent_req *req);
657afb33796f8216c568ad813627da89970760beTimo Sirainen
657afb33796f8216c568ad813627da89970760beTimo Sirainenstatic errno_t
daa7e7459749ae8f82cd3eed9c44522d81c609a3Timo Sirainenlookup_automntmap_update_cache(struct setautomntent_lookup_ctx *lookup_ctx)
ad49932dae8ba31e07544b66bbc4f4de707a751cTimo Sirainen{
657afb33796f8216c568ad813627da89970760beTimo Sirainen errno_t ret;
657afb33796f8216c568ad813627da89970760beTimo Sirainen uint64_t cache_expire = 0;
657afb33796f8216c568ad813627da89970760beTimo Sirainen struct autofs_dom_ctx *dctx = lookup_ctx->dctx;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen struct tevent_req *req = NULL;
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen struct dp_callback_ctx *cb_ctx = NULL;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen if (dctx->map != NULL) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen cache_expire = ldb_msg_find_attr_as_uint64(dctx->map,
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen SYSDB_CACHE_EXPIRE, 0);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* if we have any reply let's check cache validity */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ret = sss_cmd_check_cache(dctx->map, 0, cache_expire);
647eed98cb795ee9e42911750402dab720b57514Timo Sirainen if (ret == EOK) {
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen DEBUG(SSSDBG_TRACE_FUNC, ("Cached entry is valid, returning..\n"));
daa7e7459749ae8f82cd3eed9c44522d81c609a3Timo Sirainen return EOK;
daa7e7459749ae8f82cd3eed9c44522d81c609a3Timo Sirainen } else if (ret != EAGAIN && ret != ENOENT) {
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Error checking cache: %d\n", ret));
daa7e7459749ae8f82cd3eed9c44522d81c609a3Timo Sirainen goto error;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* dont loop forever :-) */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen dctx->check_provider = false;
615c4aba4cc0b17eefba3263b85972adaba04586Timo Sirainen
615c4aba4cc0b17eefba3263b85972adaba04586Timo Sirainen /* keep around current data in case backend is offline */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* FIXME - do this by default */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen#if 0
647eed98cb795ee9e42911750402dab720b57514Timo Sirainen if (dctx->res->count) {
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen dctx->res = talloc_steal(dctx, dctx->res);
226259ee6fb9830dafc1a5ba1e95bf5a4345b406Timo Sirainen }
0a8ec3c561c26c492a50511692650ea302cc8c14Timo Sirainen#endif
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen req = sss_dp_get_autofs_send(lookup_ctx->cctx, lookup_ctx->rctx,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen lookup_ctx->dctx->domain, true,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen SSS_DP_AUTOFS, lookup_ctx->mapname);
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainen if (!req) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
ad49932dae8ba31e07544b66bbc4f4de707a751cTimo Sirainen ("Out of memory sending data provider request\n"));
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen ret = ENOMEM;
ecb1b2d6236942bf82f822e8d0167f0e160b206dTimo Sirainen goto error;
ecb1b2d6236942bf82f822e8d0167f0e160b206dTimo Sirainen }
ecb1b2d6236942bf82f822e8d0167f0e160b206dTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen cb_ctx = talloc_zero(lookup_ctx->dctx, struct dp_callback_ctx);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if(!cb_ctx) {
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen talloc_zfree(req);
daa7e7459749ae8f82cd3eed9c44522d81c609a3Timo Sirainen ret = ENOMEM;
657afb33796f8216c568ad813627da89970760beTimo Sirainen goto error;
657afb33796f8216c568ad813627da89970760beTimo Sirainen }
3b8d05391336c0e4d24c8ddcc962f350409ffbd3Timo Sirainen cb_ctx->callback = lookup_automntmap_cache_updated;
3b8d05391336c0e4d24c8ddcc962f350409ffbd3Timo Sirainen cb_ctx->ptr = lookup_ctx;
3b8d05391336c0e4d24c8ddcc962f350409ffbd3Timo Sirainen cb_ctx->cctx = lookup_ctx->dctx->cmd_ctx->cctx;
3b8d05391336c0e4d24c8ddcc962f350409ffbd3Timo Sirainen cb_ctx->mem_ctx = lookup_ctx->dctx;
3b8d05391336c0e4d24c8ddcc962f350409ffbd3Timo Sirainen
3b8d05391336c0e4d24c8ddcc962f350409ffbd3Timo Sirainen tevent_req_set_callback(req, autofs_dp_send_map_req_done, cb_ctx);
3b8d05391336c0e4d24c8ddcc962f350409ffbd3Timo Sirainen
3b8d05391336c0e4d24c8ddcc962f350409ffbd3Timo Sirainen return EAGAIN;
3b8d05391336c0e4d24c8ddcc962f350409ffbd3Timo Sirainen
3b8d05391336c0e4d24c8ddcc962f350409ffbd3Timo Sirainenerror:
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen ret = autofs_cmd_send_error(lookup_ctx->dctx->cmd_ctx, ret);
657afb33796f8216c568ad813627da89970760beTimo Sirainen if (ret != EOK) {
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Fatal error, killing connection!\n"));
a550b0fbcf7e876eeb88f4528209ed28cc416752Timo Sirainen talloc_free(lookup_ctx->cctx);
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen return ret;
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen }
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen autofs_cmd_done(lookup_ctx->dctx->cmd_ctx, ret);
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen return EOK;
a3b3e5b452be15049a1f8bfd5b3bb640af41121cTimo Sirainen}
a3b3e5b452be15049a1f8bfd5b3bb640af41121cTimo Sirainen
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainenstatic void autofs_dp_send_map_req_done(struct tevent_req *req)
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen{
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen struct dp_callback_ctx *cb_ctx =
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen tevent_req_callback_data(req, struct dp_callback_ctx);
a550b0fbcf7e876eeb88f4528209ed28cc416752Timo Sirainen struct setautomntent_lookup_ctx *lookup_ctx =
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen talloc_get_type(cb_ctx->ptr, struct setautomntent_lookup_ctx);
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen errno_t ret;
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen dbus_uint16_t err_maj;
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen dbus_uint32_t err_min;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen char *err_msg;
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen ret = sss_dp_get_autofs_recv(cb_ctx->mem_ctx, req,
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen &err_maj, &err_min,
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen &err_msg);
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen talloc_free(req);
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen if (ret != EOK) {
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, ("Fatal error, killing connection!\n"));
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen talloc_free(lookup_ctx->cctx);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen return;
657afb33796f8216c568ad813627da89970760beTimo Sirainen }
657afb33796f8216c568ad813627da89970760beTimo Sirainen
43d32cbe60fdaef2699d99f1ca259053e9350411Timo Sirainen cb_ctx->callback(err_maj, err_min, err_msg, cb_ctx->ptr);
657afb33796f8216c568ad813627da89970760beTimo Sirainen}
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainenstatic void lookup_automntmap_cache_updated(uint16_t err_maj, uint32_t err_min,
657afb33796f8216c568ad813627da89970760beTimo Sirainen const char *err_msg, void *ptr)
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen{
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen struct setautomntent_lookup_ctx *lookup_ctx =
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen talloc_get_type(ptr, struct setautomntent_lookup_ctx);
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen struct autofs_dom_ctx *dctx = lookup_ctx->dctx;
657afb33796f8216c568ad813627da89970760beTimo Sirainen errno_t ret;
657afb33796f8216c568ad813627da89970760beTimo Sirainen
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen if (err_maj) {
657afb33796f8216c568ad813627da89970760beTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE,
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen ("Unable to get information from Data Provider\n"
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen "Error: %u, %u, %s\n"
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen "Will try to return what we have in cache\n",
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen (unsigned int)err_maj, (unsigned int)err_min, err_msg));
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen /* Loop to the next domain if possible */
2872c818f9c6704609f4d67d984b033a63e3a108Timo Sirainen if (dctx->domain->next && dctx->cmd_ctx->check_next) {
657afb33796f8216c568ad813627da89970760beTimo Sirainen dctx->domain = dctx->domain->next;
dctx->check_provider = NEED_CHECK_PROVIDER(dctx->domain->provider);
}
}
/* ok the backend returned, search to see if we have updated results */
ret = lookup_automntmap_step(lookup_ctx);
if (ret != EOK) {
if (ret == EAGAIN) {
return;
}
}
/* We have results to return */
autofs_setent_notify(lookup_ctx->map, ret);
}
static errno_t
setautomntent_recv(struct tevent_req *req)
{
TEVENT_REQ_RETURN_ON_ERROR(req);
return EOK;
}
static errno_t
getautomntent_process(struct autofs_cmd_ctx *cmdctx,
struct autofs_map_ctx *map,
uint32_t cursor);
static int
sss_autofs_cmd_getautomntent(struct cli_ctx *client)
{
struct autofs_cmd_ctx *cmdctx;
struct autofs_map_ctx *map;
struct autofs_ctx *actx;
uint8_t *body;
size_t blen;
errno_t ret;
uint32_t namelen;
char *name;
uint32_t cursor;
size_t c = 0;
DEBUG(SSSDBG_TRACE_INTERNAL, ("sss_autofs_cmd_getautomntent\n"));
cmdctx = talloc_zero(client, struct autofs_cmd_ctx);
if (!cmdctx) {
return ENOMEM;
}
cmdctx->cctx = client;
actx = talloc_get_type(client->rctx->pvt_ctx, struct autofs_ctx);
if (!actx) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Missing autofs context\n"));
return EIO;
}
/* get autofs map name and index to query */
sss_packet_get_body(client->creq->in, &body, &blen);
SAFEALIGN_COPY_UINT32_CHECK(&namelen, body+c, blen, &c);
if (namelen == 0) {
ret = EINVAL;
goto done;
}
name = (char *) body+c;
/* if not null-terminated fail */
if (name[namelen] != '\0') {
ret = EINVAL;
goto done;
}
/* If the name isn't valid UTF-8, fail */
if (!sss_utf8_check((const uint8_t *) name, namelen -1)) {
ret = EINVAL;
goto done;
}
SAFEALIGN_COPY_UINT32_CHECK(&cursor, body+c+namelen+1, blen, &c);
DEBUG(SSSDBG_TRACE_FUNC,
("Requested data of map %s cursor %d\n", name, cursor));
ret = get_autofs_map(actx, name, &map);
if (ret == ENOENT) {
/* FIXME */
DEBUG(SSSDBG_MINOR_FAILURE,
("implicit setautomntent not yet implemented\n"));
goto done;
} else if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE,
("An unexpected error occurred: [%d][%s]\n",
ret, strerror(ret)));
goto done;
}
if (map->ready == false) {
/* FIXME */
DEBUG(SSSDBG_MINOR_FAILURE,
("implicit setautomntent not yet implemented\n"));
ret = ENOENT;
goto done;
} else if (map->found == false) {
DEBUG(SSSDBG_TRACE_FUNC, ("negative cache hit\n"));
ret = ENOENT;
goto done;
}
DEBUG(SSSDBG_TRACE_INTERNAL,
("returning entries for [%s]\n", map->mapname));
ret = getautomntent_process(cmdctx, map, cursor);
done:
return autofs_cmd_done(cmdctx, ret);
}
static errno_t
getautomntent_process(struct autofs_cmd_ctx *cmdctx,
struct autofs_map_ctx *map,
uint32_t cursor)
{
struct cli_ctx *client = cmdctx->cctx;
errno_t ret;
const char *key;
size_t keylen;
const char *value;
size_t valuelen;
struct ldb_message *entry;
size_t len;
uint8_t *body;
size_t blen, rp;
/* create response packet */
ret = sss_packet_new(client->creq, 0,
sss_packet_get_cmd(client->creq->in),
&client->creq->out);
if (ret != EOK) {
return ret;
}
if (!map->map || !map->entries || !map->entries[0] ||
cursor >= map->entry_count) {
DEBUG(SSSDBG_MINOR_FAILURE, ("No entries found\n"));
ret = sss_cmd_empty_packet(client->creq->out);
if (ret != EOK) {
return autofs_cmd_done(cmdctx, ret);
}
goto done;
}
entry = map->entries[cursor];
key = ldb_msg_find_attr_as_string(entry, SYSDB_AUTOFS_ENTRY_KEY, NULL);
value = ldb_msg_find_attr_as_string(entry, SYSDB_AUTOFS_ENTRY_VALUE, NULL);
if (!key || !value) {
ret = EAGAIN;
DEBUG(SSSDBG_MINOR_FAILURE, ("Incomplete entry\n"));
goto done;
}
/* FIXME - split below into a separate function */
keylen = 1 + strlen(key);
valuelen = 1 + strlen(value);
len = sizeof(uint32_t) + sizeof(uint32_t) + keylen + sizeof(uint32_t)+ valuelen;
ret = sss_packet_grow(client->creq->out, len);
if (ret != EOK) {
goto done;
}
sss_packet_get_body(client->creq->out, &body, &blen);
rp = 0;
SAFEALIGN_SET_UINT32(&body[rp], len, &rp);
SAFEALIGN_SET_UINT32(&body[rp], keylen, &rp);
if (keylen == 1) {
body[rp] = '\0';
} else {
memcpy(&body[rp], key, keylen);
}
rp += keylen;
SAFEALIGN_SET_UINT32(&body[rp], valuelen, &rp);
if (valuelen == 1) {
body[rp] = '\0';
} else {
memcpy(&body[rp], value, valuelen);
}
rp += valuelen;
ret = EOK;
done:
sss_packet_set_error(client->creq->out, ret);
sss_cmd_done(client, cmdctx);
return EOK;
}
static errno_t
getautomnbyname_process(struct autofs_cmd_ctx *cmdctx,
struct autofs_map_ctx *map,
const char *key);
static int
sss_autofs_cmd_getautomntbyname(struct cli_ctx *client)
{
errno_t ret;
struct autofs_cmd_ctx *cmdctx;
struct autofs_map_ctx *map;
struct autofs_ctx *actx;
uint8_t *body;
size_t blen;
uint32_t namelen;
char *name;
uint32_t keylen;
char *key;
size_t c = 0;
DEBUG(SSSDBG_TRACE_INTERNAL, ("sss_autofs_cmd_getautomnbyname\n"));
cmdctx = talloc_zero(client, struct autofs_cmd_ctx);
if (!cmdctx) {
return ENOMEM;
}
cmdctx->cctx = client;
actx = talloc_get_type(client->rctx->pvt_ctx, struct autofs_ctx);
if (!actx) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Missing autofs context\n"));
return EIO;
}
/* get autofs map name and index to query */
sss_packet_get_body(client->creq->in, &body, &blen);
/* FIXME - split out a function to get string from <len><str>\0 */
SAFEALIGN_COPY_UINT32_CHECK(&namelen, body+c, blen, &c);
if (namelen == 0) {
ret = EINVAL;
goto done;
}
name = (char *) body+c;
/* if not null-terminated fail */
if (name[namelen] != '\0') {
ret = EINVAL;
goto done;
}
/* If the name isn't valid UTF-8, fail */
if (!sss_utf8_check((const uint8_t *) name, namelen -1)) {
ret = EINVAL;
goto done;
}
c += namelen + 1;
/* FIXME - split out a function to get string from <len><str>\0 */
SAFEALIGN_COPY_UINT32_CHECK(&keylen, body+c, blen, &c);
if (keylen == 0) {
ret = EINVAL;
goto done;
}
key = (char *) body+c;
/* if not null-terminated fail */
if (key[keylen] != '\0') {
ret = EINVAL;
goto done;
}
/* If the key isn't valid UTF-8, fail */
if (!sss_utf8_check((const uint8_t *) key, keylen -1)) {
ret = EINVAL;
goto done;
}
DEBUG(SSSDBG_TRACE_FUNC,
("Requested data of map %s key %s\n", name, key));
ret = get_autofs_map(actx, name, &map);
if (ret == ENOENT) {
/* FIXME */
DEBUG(SSSDBG_MINOR_FAILURE,
("implicit setautomntent not yet implemented\n"));
goto done;
} else if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE,
("An unexpected error occurred: [%d][%s]\n",
ret, strerror(ret)));
goto done;
}
if (map->ready == false) {
/* FIXME */
DEBUG(SSSDBG_MINOR_FAILURE,
("implicit setautomntent not yet implemented\n"));
ret = ENOENT;
goto done;
} else if (map->found == false) {
DEBUG(SSSDBG_TRACE_FUNC, ("negative cache hit\n"));
ret = ENOENT;
goto done;
}
DEBUG(SSSDBG_TRACE_INTERNAL,
("Looking up value for [%s] in [%s]\n", key, map->mapname));
ret = getautomnbyname_process(cmdctx, map, key);
done:
return autofs_cmd_done(cmdctx, ret);
}
static errno_t
getautomnbyname_process(struct autofs_cmd_ctx *cmdctx,
struct autofs_map_ctx *map,
const char *key)
{
struct cli_ctx *client = cmdctx->cctx;
errno_t ret;
size_t i;
const char *k;
const char *value;
size_t valuelen;
size_t len;
uint8_t *body;
size_t blen, rp;
/* create response packet */
ret = sss_packet_new(client->creq, 0,
sss_packet_get_cmd(client->creq->in),
&client->creq->out);
if (ret != EOK) {
return ret;
}
if (!map->map || !map->entries || !map->entries[0]) {
DEBUG(SSSDBG_MINOR_FAILURE, ("No entries found\n"));
ret = sss_cmd_empty_packet(client->creq->out);
if (ret != EOK) {
return autofs_cmd_done(cmdctx, ret);
}
goto done;
}
for (i=0; i < map->entry_count; i++) {
k = ldb_msg_find_attr_as_string(map->entries[i],
SYSDB_AUTOFS_ENTRY_KEY, NULL);
if (!k) {
DEBUG(SSSDBG_MINOR_FAILURE, ("Skipping incomplete entry\n"));
continue;
}
if (strcmp(k, key) == 0) {
DEBUG(SSSDBG_TRACE_INTERNAL, ("Found key [%s]\n", key));
break;
}
}
if (i >= map->entry_count) {
DEBUG(SSSDBG_MINOR_FAILURE, ("No key named [%s] found\n", key));
ret = sss_cmd_empty_packet(client->creq->out);
if (ret != EOK) {
return autofs_cmd_done(cmdctx, ret);
}
goto done;
}
value = ldb_msg_find_attr_as_string(map->entries[i],
SYSDB_AUTOFS_ENTRY_VALUE, NULL);
valuelen = 1 + strlen(value);
len = sizeof(uint32_t) + sizeof(uint32_t) + valuelen;
ret = sss_packet_grow(client->creq->out, len);
if (ret != EOK) {
goto done;
}
sss_packet_get_body(client->creq->out, &body, &blen);
rp = 0;
SAFEALIGN_SET_UINT32(&body[rp], len, &rp);
SAFEALIGN_SET_UINT32(&body[rp], valuelen, &rp);
if (valuelen == 1) {
body[rp] = '\0';
} else {
memcpy(&body[rp], value, valuelen);
}
rp += valuelen;
ret = EOK;
done:
sss_packet_set_error(client->creq->out, ret);
sss_cmd_done(client, cmdctx);
return EOK;
}
static int
sss_autofs_cmd_endautomntent(struct cli_ctx *client)
{
errno_t ret;
DEBUG(SSSDBG_TRACE_FUNC, ("endautomntent called\n"));
/* create response packet */
ret = sss_packet_new(client->creq, 0,
sss_packet_get_cmd(client->creq->in),
&client->creq->out);
if (ret != EOK) {
return ret;
}
sss_cmd_done(client, NULL);
return EOK;
}
struct cli_protocol_version *register_cli_protocol_version(void)
{
static struct cli_protocol_version autofs_cli_protocol_version[] = {
{ SSS_AUTOFS_PROTO_VERSION, NULL, NULL }
};
return autofs_cli_protocol_version;
}
struct sss_cmd_table *get_autofs_cmds(void)
{
static struct sss_cmd_table autofs_cmds[] = {
{ SSS_GET_VERSION, sss_cmd_get_version },
{ SSS_AUTOFS_SETAUTOMNTENT, sss_autofs_cmd_setautomntent },
{ SSS_AUTOFS_GETAUTOMNTENT, sss_autofs_cmd_getautomntent },
{ SSS_AUTOFS_GETAUTOMNTBYNAME, sss_autofs_cmd_getautomntbyname },
{ SSS_AUTOFS_ENDAUTOMNTENT, sss_autofs_cmd_endautomntent },
{ SSS_CLI_NULL, NULL}
};
return autofs_cmds;
}