summaryrefslogtreecommitdiffstats
path: root/src/util
diff options
context:
space:
mode:
authorOndrej Kos <okos@redhat.com>2013-05-20 17:23:27 +0200
committerJakub Hrozek <jhrozek@redhat.com>2013-05-21 16:40:12 +0200
commitdb78f4c750943fcd4b60bca5f3fdfd6cc5d3d4f8 (patch)
tree0ca0aa94c24e590d0193ed5f7d2f7ee8e72b35fc /src/util
parent2f6b38151c6dd21cbe0cf2579c20f8c5a358d956 (diff)
downloadsssd-db78f4c750943fcd4b60bca5f3fdfd6cc5d3d4f8.tar.gz
sssd-db78f4c750943fcd4b60bca5f3fdfd6cc5d3d4f8.tar.xz
sssd-db78f4c750943fcd4b60bca5f3fdfd6cc5d3d4f8.zip
Move nscd.c from tools to util
Preparation for the following patch which will include the nscd.c in the monitor code due to newly introduced function for checking the nscd configuration file.
Diffstat (limited to 'src/util')
-rw-r--r--src/util/nscd.c97
-rw-r--r--src/util/util.h8
2 files changed, 105 insertions, 0 deletions
diff --git a/src/util/nscd.c b/src/util/nscd.c
new file mode 100644
index 000000000..b9f2ba88c
--- /dev/null
+++ b/src/util/nscd.c
@@ -0,0 +1,97 @@
+/*
+ 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(enum nscd_db flush_db)
+{
+ const char *service;
+ pid_t nscd_pid;
+ int ret, status;
+
+ 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;
+ }
+
+ nscd_pid = fork();
+ switch (nscd_pid) {
+ case 0:
+ execl(NSCD_PATH, "nscd", NSCD_RELOAD_ARG, service, NULL);
+ /* if this returns it is an error */
+ DEBUG(1, ("execl(3) failed: %d(%s)\n", errno, strerror(errno)));
+ exit(errno);
+ case -1:
+ DEBUG(1, ("fork failed\n"));
+ ret = EFAULT;
+ break;
+ default:
+ do {
+ errno = 0;
+ ret = waitpid(nscd_pid, &status, 0);
+ } while (ret == -1 && errno == EINTR);
+ if (ret > 0) {
+ if (WIFEXITED(status)) {
+ ret = WEXITSTATUS(status);
+ if (ret > 0) {
+ /* The flush fails if nscd is not running, so do not care
+ * about the return code */
+ DEBUG(8, ("Error flushing cache, is nscd running?\n"));
+ }
+ }
+ } else {
+ DEBUG(5, ("Failed to wait for children %d\n", nscd_pid));
+ ret = EIO;
+ }
+ }
+
+done:
+ return ret;
+}
+
+#else /* defined(NSCD_PATH) && defined(HAVE_NSCD) */
+int flush_nscd_cache(enum nscd_db flush_db)
+{
+ return EOK;
+}
+#endif
diff --git a/src/util/util.h b/src/util/util.h
index fa45fdfdf..566530387 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -491,6 +491,14 @@ bool string_in_list(const char *string, char **list, bool case_sensitive);
*/
void safezero(void *data, size_t size);
+/* from nscd.c */
+enum nscd_db {
+ NSCD_DB_PASSWD,
+ NSCD_DB_GROUP
+};
+
+int flush_nscd_cache(enum nscd_db flush_db);
+
/* from sss_tc_utf8.c */
char *
sss_tc_utf8_str_tolower(TALLOC_CTX *mem_ctx, const char *s);