summaryrefslogtreecommitdiffstats
path: root/src/sss_client/nss_mc_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sss_client/nss_mc_common.c')
-rw-r--r--src/sss_client/nss_mc_common.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/src/sss_client/nss_mc_common.c b/src/sss_client/nss_mc_common.c
index db9be94b4..cd1ac42da 100644
--- a/src/sss_client/nss_mc_common.c
+++ b/src/sss_client/nss_mc_common.c
@@ -31,6 +31,7 @@
#include <string.h>
#include <stdlib.h>
#include "nss_mc.h"
+#include "sss_cli.h"
#include "util/io.h"
/* FIXME: hook up to library destructor to avoid leaks */
@@ -101,18 +102,15 @@ errno_t sss_nss_check_header(struct sss_cli_mc_ctx *ctx)
return 0;
}
-errno_t sss_nss_mc_get_ctx(const char *name, struct sss_cli_mc_ctx *ctx)
+static errno_t sss_nss_mc_init_ctx(const char *name,
+ struct sss_cli_mc_ctx *ctx)
{
struct stat fdstat;
char *file = NULL;
- char *envval;
int ret;
- envval = getenv("SSS_NSS_USE_MEMCACHE");
- if (envval && strcasecmp(envval, "NO") == 0) {
- return EPERM;
- }
-
+ sss_nss_lock();
+ /* check if ctx is initialised by previous thread. */
if (ctx->initialized) {
ret = sss_nss_check_header(ctx);
goto done;
@@ -168,6 +166,38 @@ done:
memset(ctx, 0, sizeof(struct sss_cli_mc_ctx));
}
free(file);
+ sss_nss_unlock();
+
+ return ret;
+}
+
+errno_t sss_nss_mc_get_ctx(const char *name, struct sss_cli_mc_ctx *ctx)
+{
+ char *envval;
+ int ret;
+
+ envval = getenv("SSS_NSS_USE_MEMCACHE");
+ if (envval && strcasecmp(envval, "NO") == 0) {
+ return EPERM;
+ }
+
+ if (ctx->initialized) {
+ ret = sss_nss_check_header(ctx);
+ goto done;
+ }
+
+ ret = sss_nss_mc_init_ctx(name, ctx);
+
+done:
+ if (ret) {
+ if ((ctx->mmap_base != NULL) && (ctx->mmap_size != 0)) {
+ munmap(ctx->mmap_base, ctx->mmap_size);
+ }
+ if (ctx->fd != -1) {
+ close(ctx->fd);
+ }
+ memset(ctx, 0, sizeof(struct sss_cli_mc_ctx));
+ }
return ret;
}