summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/responder/nss/nsssrv_mmap_cache.c125
-rw-r--r--src/responder/nss/nsssrv_mmap_cache.h10
2 files changed, 135 insertions, 0 deletions
diff --git a/src/responder/nss/nsssrv_mmap_cache.c b/src/responder/nss/nsssrv_mmap_cache.c
index 1aeac0227..c6c5a5558 100644
--- a/src/responder/nss/nsssrv_mmap_cache.c
+++ b/src/responder/nss/nsssrv_mmap_cache.c
@@ -368,6 +368,26 @@ static inline void sss_mmap_chain_in_rec(struct sss_mc_ctx *mcc,
}
/***************************************************************************
+ * generic invalidation
+ ***************************************************************************/
+
+static errno_t sss_mmap_cache_invalidate(struct sss_mc_ctx *mcc,
+ struct sized_string *key)
+{
+ struct sss_mc_rec *rec;
+
+ rec = sss_mc_find_record(mcc, key);
+ if (rec == NULL) {
+ /* nothing to invalidate */
+ return ENOENT;
+ }
+
+ sss_mc_invalidate_rec(mcc, rec);
+
+ return EOK;
+}
+
+/***************************************************************************
* passwd map
***************************************************************************/
@@ -437,6 +457,58 @@ errno_t sss_mmap_cache_pw_store(struct sss_mc_ctx *mcc,
return EOK;
}
+errno_t sss_mmap_cache_pw_invalidate(struct sss_mc_ctx *mcc,
+ struct sized_string *name)
+{
+ return sss_mmap_cache_invalidate(mcc, name);
+}
+
+errno_t sss_mmap_cache_pw_invalidate_uid(struct sss_mc_ctx *mcc, uid_t uid)
+{
+ struct sss_mc_rec *rec;
+ struct sss_mc_pwd_data *data;
+ uint32_t hash;
+ uint32_t slot;
+ char *uidstr;
+ errno_t ret;
+
+ uidstr = talloc_asprintf(NULL, "%ld", (long)uid);
+ if (!uidstr) {
+ return ENOMEM;
+ }
+
+ hash = sss_mc_hash(mcc, uidstr, strlen(uidstr) + 1);
+
+ slot = mcc->hash_table[hash];
+ if (slot > MC_SIZE_TO_SLOTS(mcc->dt_size)) {
+ ret = ENOENT;
+ goto done;
+ }
+
+ while (slot != MC_INVALID_VAL) {
+ rec = MC_SLOT_TO_PTR(mcc->data_table, slot, struct sss_mc_rec);
+ data = (struct sss_mc_pwd_data *)(&rec->data);
+
+ if (uid == data->uid) {
+ break;
+ }
+
+ slot = rec->next;
+ }
+
+ if (slot == MC_INVALID_VAL) {
+ ret = ENOENT;
+ goto done;
+ }
+
+ sss_mc_invalidate_rec(mcc, rec);
+
+ ret = EOK;
+
+done:
+ talloc_zfree(uidstr);
+ return ret;
+}
/***************************************************************************
* group map
@@ -502,6 +574,59 @@ int sss_mmap_cache_gr_store(struct sss_mc_ctx *mcc,
return EOK;
}
+errno_t sss_mmap_cache_gr_invalidate(struct sss_mc_ctx *mcc,
+ struct sized_string *name)
+{
+ return sss_mmap_cache_invalidate(mcc, name);
+}
+
+errno_t sss_mmap_cache_gr_invalidate_gid(struct sss_mc_ctx *mcc, gid_t gid)
+{
+ struct sss_mc_rec *rec;
+ struct sss_mc_grp_data *data;
+ uint32_t hash;
+ uint32_t slot;
+ char *gidstr;
+ errno_t ret;
+
+ gidstr = talloc_asprintf(NULL, "%ld", (long)gid);
+ if (!gidstr) {
+ return ENOMEM;
+ }
+
+ hash = sss_mc_hash(mcc, gidstr, strlen(gidstr) + 1);
+
+ slot = mcc->hash_table[hash];
+ if (slot > MC_SIZE_TO_SLOTS(mcc->dt_size)) {
+ ret = ENOENT;
+ goto done;
+ }
+
+ while (slot != MC_INVALID_VAL) {
+ rec = MC_SLOT_TO_PTR(mcc->data_table, slot, struct sss_mc_rec);
+ data = (struct sss_mc_grp_data *)(&rec->data);
+
+ if (gid == data->gid) {
+ break;
+ }
+
+ slot = rec->next;
+ }
+
+ if (slot == MC_INVALID_VAL) {
+ ret = ENOENT;
+ goto done;
+ }
+
+ sss_mc_invalidate_rec(mcc, rec);
+
+ ret = EOK;
+
+done:
+ talloc_zfree(gidstr);
+ return ret;
+}
+
/***************************************************************************
* initialization
diff --git a/src/responder/nss/nsssrv_mmap_cache.h b/src/responder/nss/nsssrv_mmap_cache.h
index 2a0712c88..0da637970 100644
--- a/src/responder/nss/nsssrv_mmap_cache.h
+++ b/src/responder/nss/nsssrv_mmap_cache.h
@@ -50,6 +50,16 @@ errno_t sss_mmap_cache_gr_store(struct sss_mc_ctx *mcc,
gid_t gid, size_t memnum,
char *membuf, size_t memsize);
+errno_t sss_mmap_cache_pw_invalidate(struct sss_mc_ctx *mcc,
+ struct sized_string *name);
+
+errno_t sss_mmap_cache_pw_invalidate_uid(struct sss_mc_ctx *mcc, uid_t uid);
+
+errno_t sss_mmap_cache_gr_invalidate(struct sss_mc_ctx *mcc,
+ struct sized_string *name);
+
+errno_t sss_mmap_cache_gr_invalidate_gid(struct sss_mc_ctx *mcc, gid_t gid);
+
errno_t sss_mmap_cache_reinit(TALLOC_CTX *mem_ctx, size_t n_elem,
time_t timeout, struct sss_mc_ctx **mc_ctx);