diff options
author | Ondrej Kos <okos@redhat.com> | 2013-05-20 17:23:27 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2013-05-21 16:40:12 +0200 |
commit | db78f4c750943fcd4b60bca5f3fdfd6cc5d3d4f8 (patch) | |
tree | 0ca0aa94c24e590d0193ed5f7d2f7ee8e72b35fc /src/util | |
parent | 2f6b38151c6dd21cbe0cf2579c20f8c5a358d956 (diff) | |
download | sssd-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.c | 97 | ||||
-rw-r--r-- | src/util/util.h | 8 |
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); |