summaryrefslogtreecommitdiff
path: root/src/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/nscd.c89
-rw-r--r--src/tools/sss_sync_ops.c15
-rw-r--r--src/tools/tools_util.h8
3 files changed, 112 insertions, 0 deletions
diff --git a/src/tools/nscd.c b/src/tools/nscd.c
new file mode 100644
index 00000000..992f8dad
--- /dev/null
+++ b/src/tools/nscd.c
@@ -0,0 +1,89 @@
+/*
+ SSSD
+
+ nscd.c
+
+ Copyright (C) Jakub Hrozek <jhrozek@redhat.com> 2010
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <talloc.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "config.h"
+#include "util/util.h"
+#include "tools/tools_util.h"
+
+#ifndef NSCD_RELOAD_ARG
+#define NSCD_RELOAD_ARG "-i"
+#endif
+
+#if defined(NSCD_PATH) && defined(HAVE_NSCD)
+int flush_nscd_cache(TALLOC_CTX *mem_ctx, enum nscd_db flush_db)
+{
+ char *cmd = NULL;
+ const char *service;
+ int ret;
+
+ switch(flush_db) {
+ case NSCD_DB_PASSWD:
+ service = "passwd";
+ break;
+
+ case NSCD_DB_GROUP:
+ service = "group";
+ break;
+
+ default:
+ DEBUG(1, ("Unknown nscd database\n"));
+ ret = EINVAL;
+ goto done;
+ }
+
+ cmd = talloc_asprintf(mem_ctx, "%s %s %s", NSCD_PATH,
+ NSCD_RELOAD_ARG,
+ service);
+ if (!cmd) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ret = system(cmd);
+ if (ret) {
+ if (ret == -1) {
+ DEBUG(1, ("system(3) failed\n"));
+ ret = EFAULT;
+ goto done;
+ }
+ /* The flush fails if nscd is not running, so do not care
+ * about the return code */
+ DEBUG(8, ("Error flushing cache, perhaps nscd is not running\n"));
+ }
+
+
+ ret = EOK;
+done:
+ talloc_free(cmd);
+ return ret;
+}
+
+#else /* defined(NSCD_PATH) && defined(HAVE_NSCD) */
+int flush_nscd_cache(TALLOC_CTX *mem_ctx, enum nscd_db flush_db)
+{
+ return EOK;
+}
+#endif
diff --git a/src/tools/sss_sync_ops.c b/src/tools/sss_sync_ops.c
index 25b8ac7a..498be284 100644
--- a/src/tools/sss_sync_ops.c
+++ b/src/tools/sss_sync_ops.c
@@ -1301,6 +1301,9 @@ int useradd(TALLOC_CTX *mem_ctx,
SYNC_LOOP(res, ret);
+ flush_nscd_cache(mem_ctx, NSCD_DB_PASSWD);
+ flush_nscd_cache(mem_ctx, NSCD_DB_GROUP);
+
talloc_free(res);
return ret;
}
@@ -1349,6 +1352,9 @@ int userdel(TALLOC_CTX *mem_ctx,
SYNC_LOOP(res, ret);
+ flush_nscd_cache(mem_ctx, NSCD_DB_PASSWD);
+ flush_nscd_cache(mem_ctx, NSCD_DB_GROUP);
+
talloc_free(res);
return ret;
}
@@ -1397,6 +1403,9 @@ int usermod(TALLOC_CTX *mem_ctx,
SYNC_LOOP(res, ret);
+ flush_nscd_cache(mem_ctx, NSCD_DB_PASSWD);
+ flush_nscd_cache(mem_ctx, NSCD_DB_GROUP);
+
talloc_free(res);
return ret;
}
@@ -1445,6 +1454,8 @@ int groupadd(TALLOC_CTX *mem_ctx,
SYNC_LOOP(res, ret);
+ flush_nscd_cache(mem_ctx, NSCD_DB_GROUP);
+
talloc_free(res);
return ret;
}
@@ -1493,6 +1504,8 @@ int groupdel(TALLOC_CTX *mem_ctx,
SYNC_LOOP(res, ret);
+ flush_nscd_cache(mem_ctx, NSCD_DB_GROUP);
+
talloc_free(res);
return ret;
}
@@ -1541,6 +1554,8 @@ int groupmod(TALLOC_CTX *mem_ctx,
SYNC_LOOP(res, ret);
+ flush_nscd_cache(mem_ctx, NSCD_DB_GROUP);
+
talloc_free(res);
return ret;
}
diff --git a/src/tools/tools_util.h b/src/tools/tools_util.h
index a643e739..a2b5c783 100644
--- a/src/tools/tools_util.h
+++ b/src/tools/tools_util.h
@@ -105,4 +105,12 @@ int copy_tree(const char *src_root,
int selinux_file_context(const char *dst_name);
int reset_selinux_file_context(void);
+/* from nscd.c */
+enum nscd_db {
+ NSCD_DB_PASSWD,
+ NSCD_DB_GROUP
+};
+
+int flush_nscd_cache(TALLOC_CTX *mem_ctx, enum nscd_db flush_db);
+
#endif /* __TOOLS_UTIL_H__ */