diff options
author | Michal Zidek <mzidek@redhat.com> | 2012-11-20 13:52:12 +0100 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2012-11-28 10:37:45 +0100 |
commit | a290ace39af184d878568e17588b6b2210aea63f (patch) | |
tree | 2c817b03ee4d37903372daf17c19d59a46938267 /src/tools/tools_util.c | |
parent | 62b36cdae054b915da4d29fd3812f3799c27de69 (diff) | |
download | sssd-a290ace39af184d878568e17588b6b2210aea63f.tar.gz sssd-a290ace39af184d878568e17588b6b2210aea63f.tar.xz sssd-a290ace39af184d878568e17588b6b2210aea63f.zip |
sss_cache: Small refactor.
The logic that checks if sssd_nss is running and then
sends SIGHUP to monitor or removes the caches was moved
to a function sss_memcache_clear_all() and made public in
tools_util.h.
Diffstat (limited to 'src/tools/tools_util.c')
-rw-r--r-- | src/tools/tools_util.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/tools/tools_util.c b/src/tools/tools_util.c index 73e94136c..406077c88 100644 --- a/src/tools/tools_util.c +++ b/src/tools/tools_util.c @@ -766,3 +766,70 @@ done: } return ret; } + +static int clear_fastcache(bool *sssd_nss_is_off) +{ + int ret; + ret = sss_memcache_invalidate(SSS_NSS_MCACHE_DIR"/passwd"); + if (ret != EOK) { + if (ret == EACCES) { + *sssd_nss_is_off = false; + return EOK; + } else { + return ret; + } + } + + ret = sss_memcache_invalidate(SSS_NSS_MCACHE_DIR"/group"); + if (ret != EOK) { + if (ret == EACCES) { + *sssd_nss_is_off = false; + return EOK; + } else { + return ret; + } + } + + *sssd_nss_is_off = true; + return EOK; +} + +errno_t sss_memcache_clear_all(void) +{ + errno_t ret; + bool sssd_nss_is_off = false; + FILE *clear_mc_flag; + + ret = clear_fastcache(&sssd_nss_is_off); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to clear caches.\n")); + return EIO; + } + if (!sssd_nss_is_off) { + /* sssd_nss is running -> signal monitor to invalidate fastcache */ + clear_mc_flag = fopen(SSS_NSS_MCACHE_DIR"/"CLEAR_MC_FLAG, "w"); + if (clear_mc_flag == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Failed to create clear_mc_flag file. " + "Memory cache will not be cleared.\n")); + return EIO; + } + ret = fclose(clear_mc_flag); + if (ret != 0) { + ret = errno; + DEBUG(SSSDBG_CRIT_FAILURE, + ("Unable to close file descriptor: %s\n", + strerror(ret))); + return EIO; + } + DEBUG(SSSDBG_TRACE_FUNC, ("Sending SIGHUP to monitor.\n")); + ret = signal_sssd(SIGHUP); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Failed to send SIGHUP to monitor.\n")); + return EIO; + } + } + + return EOK; +} |