summaryrefslogtreecommitdiffstats
path: root/src/responder/nss/nsssrv_mmap_cache.c
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2012-12-05 17:40:42 +0000
committerJakub Hrozek <jhrozek@redhat.com>2012-12-05 23:09:53 +0100
commitf1d38d5d0f64940a0c364b84e61137168bc23cf9 (patch)
tree17342ae5315db99df35e7de521ace05d01806c06 /src/responder/nss/nsssrv_mmap_cache.c
parent50dba57000f11a1e4bcd4e81633fd57878d17eaa (diff)
downloadsssd-f1d38d5d0f64940a0c364b84e61137168bc23cf9.tar.gz
sssd-f1d38d5d0f64940a0c364b84e61137168bc23cf9.tar.xz
sssd-f1d38d5d0f64940a0c364b84e61137168bc23cf9.zip
mmap cache: public functions to invalidate records
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.
Diffstat (limited to 'src/responder/nss/nsssrv_mmap_cache.c')
-rw-r--r--src/responder/nss/nsssrv_mmap_cache.c125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/responder/nss/nsssrv_mmap_cache.c b/src/responder/nss/nsssrv_mmap_cache.c
index 524aa47c3..8e8be9409 100644
--- a/src/responder/nss/nsssrv_mmap_cache.c
+++ b/src/responder/nss/nsssrv_mmap_cache.c
@@ -348,6 +348,26 @@ static struct sss_mc_rec *sss_mc_get_record(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
***************************************************************************/
@@ -422,6 +442,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
@@ -492,6 +564,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