summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2013-01-15 11:40:19 +0100
committerJakub Hrozek <jhrozek@redhat.com>2013-01-15 20:55:47 +0100
commit53aefebdca2ec9151aff87ae21ee4203eaa9a03a (patch)
treee51c7dd8eb2e436d60156280b5668d8f0f728f4f
parentdd1dbf1e10a864f4ec0796aae3a6f272104b098e (diff)
downloadsssd-53aefebdca2ec9151aff87ae21ee4203eaa9a03a.tar.gz
sssd-53aefebdca2ec9151aff87ae21ee4203eaa9a03a.tar.xz
sssd-53aefebdca2ec9151aff87ae21ee4203eaa9a03a.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.
-rw-r--r--Makefile.am17
-rw-r--r--src/tools/sss_groupdel.c22
-rw-r--r--src/tools/sss_userdel.c20
-rw-r--r--src/tools/tools_mc_util.c55
-rw-r--r--src/tools/tools_util.h3
5 files changed, 79 insertions, 38 deletions
diff --git a/Makefile.am b/Makefile.am
index b0439ef48..9fb4f48ec 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -285,11 +285,15 @@ SSSD_RESPONDER_OBJ = \
SSSD_TOOLS_OBJ = \
src/tools/sss_sync_ops.c \
src/tools/tools_util.c \
- src/tools/tools_mc_util.c \
src/tools/files.c \
src/tools/selinux.c \
src/tools/nscd.c
+SSSD_LCL_TOOLS_OBJ = \
+ src/sss_client/common.c \
+ src/tools/tools_mc_util.c \
+ $(SSSD_TOOLS_OBJ)
+
SSSD_RESOLV_OBJ = \
src/resolv/async_resolv.c
if BUILD_ARES_DATA
@@ -682,10 +686,9 @@ sss_useradd_LDADD = \
$(TOOLS_LIBS)
sss_userdel_SOURCES = \
- src/sss_client/common.c \
src/tools/sss_userdel.c \
src/util/find_uid.c \
- $(SSSD_TOOLS_OBJ)
+ $(SSSD_LCL_TOOLS_OBJ)
sss_userdel_LDADD = \
libsss_util.la \
$(TOOLS_LIBS)
@@ -701,9 +704,8 @@ sss_groupadd_LDADD = \
$(TOOLS_LIBS)
sss_groupdel_SOURCES = \
- src/sss_client/common.c \
src/tools/sss_groupdel.c \
- $(SSSD_TOOLS_OBJ)
+ $(SSSD_LCL_TOOLS_OBJ)
sss_groupdel_LDADD = \
libsss_util.la \
$(TOOLS_LIBS)
@@ -734,10 +736,13 @@ sss_groupshow_LDADD = \
sss_cache_SOURCES = \
src/tools/sss_cache.c \
- $(SSSD_TOOLS_OBJ)
+ $(SSSD_LCL_TOOLS_OBJ)
sss_cache_LDADD = \
libsss_util.la \
$(TOOLS_LIBS)
+sss_cache_CFLAGS = $(AM_CFLAGS)
+sss_cache_LDFLAGS = \
+ $(CLIENT_LIBS)
sss_debuglevel_SOURCES = \
src/tools/sss_debuglevel.c \
diff --git a/src/tools/sss_groupdel.c b/src/tools/sss_groupdel.c
index 5ab85fc89..a8db03632 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 84ae96091..1f7d5fa6a 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 5348829eb..a33dfb97c 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 aa55bfaf3..0ca52efdf 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);