sss_autofs.c revision 0a78bac242d0172a858d6b65402276aa734a4671
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/*
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen Authors:
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen Jakub Hrozek <jhrozek@redhat.com>
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen Copyright (C) 2012 Red Hat
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen This program is free software; you can redistribute it and/or modify
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen it under the terms of the GNU General Public License as published by
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen the Free Software Foundation; either version 3 of the License, or
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen (at your option) any later version.
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen This program is distributed in the hope that it will be useful,
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen GNU General Public License for more details.
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen You should have received a copy of the GNU General Public License
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen*/
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen#include <errno.h>
04870054863757edf048c81dcce3c5e7dec453cdTimo Sirainen#include <stdlib.h>
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen#include "sss_client/autofs/sss_autofs_private.h"
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen#include "sss_client/sss_cli.h"
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen/* Historically, autofs map and key names were just file names */
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen#define MAX_AUTOMNTMAPNAME_LEN NAME_MAX
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen#define MAX_AUTOMNTKEYNAME_LEN NAME_MAX
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen/* How many entries shall _sss_getautomntent_r retreive at once */
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen#define GETAUTOMNTENT_MAX_ENTRIES 512
e7ca5f820d6a1a8fe549a2966ac707a60e055ef4Timo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainenstruct automtent {
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen char *mapname;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen size_t cursor;
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen};
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainenstatic struct sss_getautomntent_data {
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen char *mapname;
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen size_t len;
e5acc283bf030b0b5c79ca4e52d315c516a299faPascal Volk size_t ptr;
e5acc283bf030b0b5c79ca4e52d315c516a299faPascal Volk uint8_t *data;
e5acc283bf030b0b5c79ca4e52d315c516a299faPascal Volk} sss_getautomntent_data;
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainenstatic void
d3837c0362588792db3e3148d217f31ff3172922Timo Sirainensss_getautomntent_data_clean(void)
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen{
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen free(sss_getautomntent_data.data);
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen free(sss_getautomntent_data.mapname);
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen memset(&sss_getautomntent_data, 0, sizeof(struct sss_getautomntent_data));
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen}
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainenerrno_t
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen_sss_setautomntent(const char *mapname, void **context)
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen{
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen errno_t ret;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen int errnop;
e7ca5f820d6a1a8fe549a2966ac707a60e055ef4Timo Sirainen struct automtent *ctx;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen char *name;
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen size_t name_len;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen struct sss_cli_req_data rd;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen uint8_t *repbuf = NULL;
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen size_t replen;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen if (!mapname) return EINVAL;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
c7d655351dc85d917a27392c0d6ac89867786424Timo Sirainen sss_nss_lock();
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
87b426af6a2365c6840b14281a98c23e903bf28eTimo Sirainen /* Make sure there are no leftovers from previous runs */
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen sss_getautomntent_data_clean();
8ab69d02c689fbdad2a1c83a5cd27e6adf21ca6cTimo Sirainen
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen ret = sss_strnlen(mapname, MAX_AUTOMNTMAPNAME_LEN, &name_len);
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen if (ret != 0) {
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen ret = EINVAL;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen goto out;
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen }
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen
7705148680904051b573a9125ecee765032a5809Timo Sirainen name = malloc(sizeof(char)*name_len + 1);
7705148680904051b573a9125ecee765032a5809Timo Sirainen if (name == NULL) {
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen ret = ENOMEM;
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen goto out;
7705148680904051b573a9125ecee765032a5809Timo Sirainen }
3809b9691c46926aa54968ac8e418d04361e1efaTimo Sirainen strncpy(name, mapname, name_len + 1);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen rd.data = name;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen rd.len = name_len + 1;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen sss_autofs_make_request(SSS_AUTOFS_SETAUTOMNTENT, &rd,
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen &repbuf, &replen, &errnop);
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen if (errnop != 0) {
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen free(name);
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen ret = errnop;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen goto out;
8ab69d02c689fbdad2a1c83a5cd27e6adf21ca6cTimo Sirainen }
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen /* no results if not found */
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen if (((uint32_t *)repbuf)[0] == 0) {
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen free(name);
0b2f7be9fadfd4026a9174e51170890cde3edf48Timo Sirainen free(repbuf);
0b2f7be9fadfd4026a9174e51170890cde3edf48Timo Sirainen ret = ENOENT;
0b2f7be9fadfd4026a9174e51170890cde3edf48Timo Sirainen goto out;
0b2f7be9fadfd4026a9174e51170890cde3edf48Timo Sirainen }
0b2f7be9fadfd4026a9174e51170890cde3edf48Timo Sirainen free(repbuf);
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen ctx = malloc(sizeof(struct automtent));
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen if (!ctx) {
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen free(name);
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen ret = ENOMEM;
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen goto out;
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen }
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen ctx->mapname = strdup(name);
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen if (!ctx->mapname) {
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen free(name);
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen free(ctx);
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen ret = ENOMEM;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen goto out;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen }
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen ctx->cursor = 0;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen free(name);
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen *context = ctx;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen ret = 0;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainenout:
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen sss_nss_unlock();
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen return ret;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen}
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainenstatic errno_t
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainensss_getautomntent_data_return(const char *mapname, char **_key, char **_value)
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen{
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen size_t dp;
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen uint32_t len = 0;
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen char *key = NULL;
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen uint32_t keylen;
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen char *value = NULL;
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen uint32_t vallen;
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen errno_t ret;
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen if (sss_getautomntent_data.mapname == NULL ||
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen sss_getautomntent_data.data == NULL ||
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen sss_getautomntent_data.ptr >= sss_getautomntent_data.len) {
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen /* We're done with this buffer */
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen ret = ENOENT;
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen goto done;
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen }
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen ret = strcmp(mapname, sss_getautomntent_data.mapname);
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen if (ret != EOK) {
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen /* The map we're looking for is not cached. Let responder
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen * do an implicit setautomntent */
27a7dee37444438522e04273ce17e6c48775b35cTimo Sirainen ret = ENOENT;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen goto done;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen }
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen dp = sss_getautomntent_data.ptr;
7fb70daba4e571eab5b64f496d20b9e37e31141bTimo Sirainen
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen SAFEALIGN_COPY_UINT32(&len, sss_getautomntent_data.data+dp, &dp);
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen if (len + sss_getautomntent_data.ptr > sss_getautomntent_data.len) {
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen /* len is bigger than the buffer */
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen ret = EIO;
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen goto done;
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen }
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen if (len == 0) {
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen /* There are no more records. */
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen *_key = NULL;
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen *_value = NULL;
2f122b4db3f0d4eeb59ff9d306e54b2009d72cf9Timo Sirainen ret = ENOENT;
goto done;
}
SAFEALIGN_COPY_UINT32(&keylen, sss_getautomntent_data.data+dp, &dp);
if (keylen + dp > sss_getautomntent_data.len) {
ret = EIO;
goto done;
}
key = malloc(keylen);
if (!key) {
ret = ENOMEM;
goto done;
}
safealign_memcpy(key, sss_getautomntent_data.data+dp, keylen, &dp);
SAFEALIGN_COPY_UINT32(&vallen, sss_getautomntent_data.data+dp, &dp);
if (vallen + dp > sss_getautomntent_data.len) {
ret = EIO;
goto done;
}
value = malloc(vallen);
if (!value) {
ret = ENOMEM;
goto done;
}
safealign_memcpy(value, sss_getautomntent_data.data+dp, vallen, &dp);
sss_getautomntent_data.ptr = dp;
*_key = key;
*_value = value;
return EOK;
done:
free(key);
free(value);
sss_getautomntent_data_clean();
return ret;
}
/* The repbuf is owned by the sss_getautomntent_data once this
* function is called */
static errno_t
sss_getautomntent_data_save(const char *mapname, uint8_t **repbuf, size_t replen)
{
size_t rp;
uint32_t num;
rp = 0;
SAFEALIGN_COPY_UINT32(&num, *repbuf+rp, &rp);
if (num == 0) {
free(*repbuf);
return ENOENT;
}
sss_getautomntent_data.mapname = strdup(mapname);
if (sss_getautomntent_data.mapname == NULL) {
free(*repbuf);
return ENOENT;
}
sss_getautomntent_data.data = *repbuf;
sss_getautomntent_data.len = replen;
sss_getautomntent_data.ptr = rp;
*repbuf = NULL;
return EOK;
}
errno_t
_sss_getautomntent_r(char **key, char **value, void *context)
{
int errnop;
errno_t ret;
size_t name_len;
struct sss_cli_req_data rd;
uint8_t *repbuf = NULL;
size_t replen;
struct automtent *ctx;
size_t ctr = 0;
size_t data_len = 0;
uint8_t *data;
uint32_t v;
sss_nss_lock();
ctx = (struct automtent *) context;
if (!ctx) {
ret = EINVAL;
goto out;
}
/* Be paranoid in case someone tries to smuggle in a huge map name */
ret = sss_strnlen(ctx->mapname, MAX_AUTOMNTMAPNAME_LEN, &name_len);
if (ret != 0) {
ret = EINVAL;
goto out;
}
ret = sss_getautomntent_data_return(ctx->mapname, key, value);
if (ret == EOK) {
/* The results are available from cache. Just advance the
* cursor and return. */
ctx->cursor++;
ret = 0;
goto out;
}
/* Don't try to handle any error codes, just go to the responder again */
ret = 0;
data_len = sizeof(uint32_t) + /* mapname len */
name_len + 1 + /* mapname\0 */
sizeof(uint32_t) + /* index into the map */
sizeof(uint32_t); /* num entries to retreive */
data = malloc(data_len);
if (!data) {
ret = ENOMEM;
goto out;
}
SAFEALIGN_COPY_UINT32(data, &name_len, &ctr);
safealign_memcpy(data+ctr, ctx->mapname, name_len + 1, &ctr);
SAFEALIGN_COPY_UINT32(data+ctr, &ctx->cursor, &ctr);
v = GETAUTOMNTENT_MAX_ENTRIES;
SAFEALIGN_COPY_UINT32(data+ctr, &v, &ctr);
rd.data = data;
rd.len = data_len;
sss_autofs_make_request(SSS_AUTOFS_GETAUTOMNTENT, &rd,
&repbuf, &replen, &errnop);
free(data);
if (errnop != 0) {
ret = errnop;
goto out;
}
/* Got reply, let's save it and return from "cache" */
ret = sss_getautomntent_data_save(ctx->mapname, &repbuf, replen);
if (ret == ENOENT) {
/* No results */
*key = NULL;
*value = NULL;
goto out;
} else if (ret != EOK) {
/* Unexpected error */
goto out;
}
ret = sss_getautomntent_data_return(ctx->mapname, key, value);
if (ret != EOK) {
goto out;
}
/* Advance the cursor so that we'll fetch the next map
* next time getautomntent is called */
ctx->cursor++;
ret = 0;
out:
sss_nss_unlock();
return ret;
}
errno_t
_sss_getautomntbyname_r(const char *key, char **value, void *context)
{
int errnop;
errno_t ret;
struct automtent *ctx;
size_t key_len;
size_t name_len;
size_t data_len = 0;
uint8_t *data;
uint32_t v;
size_t ctr = 0;
struct sss_cli_req_data rd;
uint8_t *repbuf = NULL;
size_t replen;
char *buf;
uint32_t len;
uint32_t vallen;
size_t rp;
sss_nss_lock();
ctx = (struct automtent *) context;
if (!ctx || !key) {
ret = EINVAL;
goto out;
}
/* Be paranoid in case someone tries to smuggle in a huge map name */
ret = sss_strnlen(ctx->mapname, MAX_AUTOMNTMAPNAME_LEN, &name_len);
if (ret != 0) {
ret = EINVAL;
goto out;
}
ret = sss_strnlen(key, MAX_AUTOMNTKEYNAME_LEN, &key_len);
if (ret != 0) {
ret = EINVAL;
goto out;
}
data_len = sizeof(uint32_t) + /* mapname len */
name_len + 1 + /* mapname\0 */
sizeof(uint32_t) + /* keyname len */
key_len + 1; /* keyname\0 */
data = malloc(data_len);
if (!data) {
ret = ENOMEM;
goto out;
}
v = name_len;
SAFEALIGN_COPY_UINT32(data, &v, &ctr);
safealign_memcpy(data+ctr, ctx->mapname, name_len + 1, &ctr);
v = key_len;
SAFEALIGN_COPY_UINT32(data+ctr, &v, &ctr);
safealign_memcpy(data+ctr, key, key_len + 1, &ctr);
rd.data = data;
rd.len = data_len;
sss_autofs_make_request(SSS_AUTOFS_GETAUTOMNTBYNAME, &rd,
&repbuf, &replen, &errnop);
free(data);
if (errnop != 0) {
ret = errnop;
goto out;
}
/* Got reply, let's parse it */
rp = 0;
SAFEALIGN_COPY_UINT32(&len, repbuf+rp, &rp);
if (len == 0) {
/* No data */
*value = NULL;
ret = ENOENT;
goto out;
}
SAFEALIGN_COPY_UINT32(&vallen, repbuf+rp, &rp);
if (vallen > len-rp) {
ret = EIO;
goto out;
}
buf = malloc(vallen);
if (!buf) {
ret = ENOMEM;
goto out;
}
safealign_memcpy(buf, repbuf+rp, vallen, &rp);
*value = buf;
ret = 0;
out:
free(repbuf);
sss_nss_unlock();
return ret;
}
errno_t
_sss_endautomntent(void **context)
{
struct automtent *fctx;
errno_t ret;
int errnop;
if (!context) return 0;
sss_nss_lock();
sss_getautomntent_data_clean();
fctx = (struct automtent *) *context;
free(fctx->mapname);
free(fctx);
sss_autofs_make_request(SSS_AUTOFS_ENDAUTOMNTENT,
NULL, NULL, NULL, &errnop);
if (errnop != 0) {
ret = errnop;
goto out;
}
ret = 0;
out:
sss_nss_unlock();
return ret;
}