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

_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to