[SSSD] [PATCH 1/5] mmap cache: public functions to invalidate records

Simo Sorce simo at redhat.com
Tue Dec 4 19:47:08 UTC 2012


These functions can be called from the nss responder to invalidate
records that have ceased to exist or that need to be refreshed the
first time an application needs them.
---
 src/responder/nss/nsssrv_mmap_cache.c |  125 +++++++++++++++++++++++++++++++++
 src/responder/nss/nsssrv_mmap_cache.h |   10 +++
 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 1aeac02276e1ce8c5ea78513cdb6ec2f7062d2b4..c6c5a5558400938f7afa701a642070821542b160 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 2a0712c88b0ce74cf2a9b1ed57ca34c4b3b50b24..0da637970de91b0dec7496523f1511cee4fdbaab 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);
 
-- 
1.7.1




More information about the sssd-devel mailing list