diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2013-01-15 11:40:19 +0100 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2013-01-15 20:16:04 +0100 |
commit | 543676afec3c08fdc0a5a794976adc8dfdca974b (patch) | |
tree | 97ade9c8091c0f5d21b9036dbb8ebad93b5b2b47 /src | |
parent | 82dc11348718bf8e2ff07da696f91f6703293c24 (diff) | |
download | sssd-543676afec3c08fdc0a5a794976adc8dfdca974b.tar.gz sssd-543676afec3c08fdc0a5a794976adc8dfdca974b.tar.bz2 sssd-543676afec3c08fdc0a5a794976adc8dfdca974b.zip |
TOOLS: Split querying nss responder into a separate function
The tools query the responder in order to sync the memcache after
performing changes to the local database. The functions will be reused
by other tools so I split them into a separate functions.
Diffstat (limited to 'src')
-rw-r--r-- | src/tools/sss_groupdel.c | 22 | ||||
-rw-r--r-- | src/tools/sss_userdel.c | 20 | ||||
-rw-r--r-- | src/tools/tools_mc_util.c | 55 | ||||
-rw-r--r-- | src/tools/tools_util.h | 3 |
4 files changed, 68 insertions, 32 deletions
diff --git a/src/tools/sss_groupdel.c b/src/tools/sss_groupdel.c index 66ea2926..456b2b48 100644 --- a/src/tools/sss_groupdel.c +++ b/src/tools/sss_groupdel.c @@ -29,7 +29,6 @@ #include "util/util.h" #include "tools/tools_util.h" #include "tools/sss_sync_ops.h" -#include "sss_client/sss_cli.h" int main(int argc, const char **argv) { @@ -37,10 +36,6 @@ int main(int argc, const char **argv) int pc_debug = SSSDBG_DEFAULT; const char *pc_groupname = NULL; struct tools_ctx *tctx = NULL; - struct sss_cli_req_data rd; - uint8_t *repbuf = NULL; - size_t replen; - enum nss_status nret; poptContext pc = NULL; struct poptOption long_options[] = { @@ -116,17 +111,12 @@ int main(int argc, const char **argv) goto done; } - rd.data = pc_groupname; - rd.len = strlen(pc_groupname) + 1; - - sss_nss_lock(); - nret = sss_nss_make_request(SSS_NSS_GETGRNAM, &rd, - &repbuf, &replen, &ret); - sss_nss_unlock(); - free(repbuf); - if (nret != NSS_STATUS_SUCCESS && nret != NSS_STATUS_NOTFOUND) { - ERROR("NSS request failed (%1$d). Entry might remain in memory" - " cache.\n",nret); + /* Delete group from memory cache */ + ret = sss_mc_refresh_group(pc_groupname); + if (ret != EOK) { + ERROR("NSS request failed (%1$d). Entry might remain in memory " + "cache.\n", ret); + /* Nothing we can do about it */ } ret = EOK; diff --git a/src/tools/sss_userdel.c b/src/tools/sss_userdel.c index 53273f61..2cf77596 100644 --- a/src/tools/sss_userdel.c +++ b/src/tools/sss_userdel.c @@ -32,7 +32,6 @@ #include "util/find_uid.h" #include "tools/tools_util.h" #include "tools/sss_sync_ops.h" -#include "sss_client/sss_cli.h" #ifndef KILL_CMD #define KILL_CMD "killall" @@ -121,10 +120,6 @@ int main(int argc, const char **argv) int ret = EXIT_SUCCESS; struct tools_ctx *tctx = NULL; const char *pc_username = NULL; - struct sss_cli_req_data rd; - uint8_t *repbuf = NULL; - size_t replen; - enum nss_status nret; int pc_debug = SSSDBG_DEFAULT; int pc_remove = 0; @@ -292,18 +287,11 @@ int main(int argc, const char **argv) } /* Delete user from memory cache */ - rd.data = pc_username; - rd.len = strlen(pc_username) + 1; - - sss_nss_lock(); - nret = sss_nss_make_request(SSS_NSS_GETPWNAM, &rd, - &repbuf, &replen, &ret); - - sss_nss_unlock(); - free(repbuf); - if (nret != NSS_STATUS_SUCCESS && nret != NSS_STATUS_NOTFOUND) { + ret = sss_mc_refresh_user(pc_username); + if (ret != EOK) { ERROR("NSS request failed (%1$d). Entry might remain in memory " - "cache.\n",nret); + "cache.\n", ret); + /* Nothing we can do about it */ } if (tctx->octx->remove_homedir) { diff --git a/src/tools/tools_mc_util.c b/src/tools/tools_mc_util.c index 5348829e..a33dfb97 100644 --- a/src/tools/tools_mc_util.c +++ b/src/tools/tools_mc_util.c @@ -25,6 +25,7 @@ #include "util/util.h" #include "tools/tools_util.h" #include "util/mmap_cache.h" +#include "sss_client/sss_cli.h" static errno_t sss_mc_set_recycled(int fd) { @@ -185,3 +186,57 @@ errno_t sss_memcache_clear_all(void) return EOK; } + +enum sss_tools_ent { + SSS_TOOLS_USER, + SSS_TOOLS_GROUP +}; + +static errno_t sss_mc_refresh_ent(const char *name, enum sss_tools_ent ent) +{ + enum sss_cli_command cmd; + struct sss_cli_req_data rd; + uint8_t *repbuf = NULL; + size_t replen; + enum nss_status nret; + errno_t ret; + + cmd = SSS_CLI_NULL; + switch (ent) { + case SSS_TOOLS_USER: + cmd = SSS_NSS_GETPWNAM; + break; + case SSS_TOOLS_GROUP: + cmd = SSS_NSS_GETGRNAM; + break; + } + + if (cmd == SSS_CLI_NULL) { + DEBUG(SSSDBG_OP_FAILURE, ("Unknown object %d to refresh\n", cmd)); + return EINVAL; + } + + rd.data = name; + rd.len = strlen(name) + 1; + + sss_nss_lock(); + nret = sss_nss_make_request(cmd, &rd, &repbuf, &replen, &ret); + sss_nss_unlock(); + + free(repbuf); + if (nret != NSS_STATUS_SUCCESS && nret != NSS_STATUS_NOTFOUND) { + return EIO; + } + + return EOK; +} + +errno_t sss_mc_refresh_user(const char *username) +{ + return sss_mc_refresh_ent(username, SSS_TOOLS_USER); +} + +errno_t sss_mc_refresh_group(const char *groupname) +{ + return sss_mc_refresh_ent(groupname, SSS_TOOLS_GROUP); +} diff --git a/src/tools/tools_util.h b/src/tools/tools_util.h index aa55bfaf..0ca52efd 100644 --- a/src/tools/tools_util.h +++ b/src/tools/tools_util.h @@ -109,6 +109,9 @@ errno_t sss_memcache_invalidate(const char *mc_filename); errno_t sss_memcache_clear_all(void); +errno_t sss_mc_refresh_user(const char *username); +errno_t sss_mc_refresh_group(const char *groupname); + /* from files.c */ int remove_tree(const char *root); |