diff options
author | Lukas Slebodnik <lslebodn@redhat.com> | 2015-06-30 13:50:51 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2015-07-03 15:16:44 +0200 |
commit | ebf6735dd4f71bf3dc9105e5d04d11e744c64a59 (patch) | |
tree | 57eea70a590336d2f004d7e5c108828954d09716 /src/responder/nss/nsssrv_mmap_cache.c | |
parent | 323943605c88838f1f86a72f891eb28600bb34e2 (diff) | |
download | sssd-ebf6735dd4f71bf3dc9105e5d04d11e744c64a59.tar.gz sssd-ebf6735dd4f71bf3dc9105e5d04d11e744c64a59.tar.xz sssd-ebf6735dd4f71bf3dc9105e5d04d11e744c64a59.zip |
nss: Store entries in responder to initgr mmap cache
Resolves:
https://fedorahosted.org/sssd/ticket/2485
Reviewed-by: Michal Židek <mzidek@redhat.com>
Diffstat (limited to 'src/responder/nss/nsssrv_mmap_cache.c')
-rw-r--r-- | src/responder/nss/nsssrv_mmap_cache.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/responder/nss/nsssrv_mmap_cache.c b/src/responder/nss/nsssrv_mmap_cache.c index 2d159eb11..ebda8ac6f 100644 --- a/src/responder/nss/nsssrv_mmap_cache.c +++ b/src/responder/nss/nsssrv_mmap_cache.c @@ -31,6 +31,8 @@ #define SSS_AVG_PASSWD_PAYLOAD (MC_SLOT_SIZE * 4) /* short group name and no gids (private user group */ #define SSS_AVG_GROUP_PAYLOAD (MC_SLOT_SIZE * 3) +/* average place for 40 supplementary groups */ +#define SSS_AVG_INITGROUP_PAYLOAD (MC_SLOT_SIZE * 4) #define MC_NEXT_BARRIER(val) ((((val) + 1) & 0x00ffffff) | 0xf0000000) @@ -955,6 +957,65 @@ done: return ret; } +errno_t sss_mmap_cache_initgr_store(struct sss_mc_ctx **_mcc, + struct sized_string *name, + uint32_t memnum, + uint8_t *membuf) +{ + struct sss_mc_ctx *mcc = *_mcc; + struct sss_mc_rec *rec; + struct sss_mc_initgr_data *data; + size_t data_len; + size_t rec_len; + int ret; + + if (mcc == NULL) { + /* cache not initialized ? */ + return EINVAL; + } + + /* memnum + reserved + array of members + name*/ + data_len = (2 + memnum) * sizeof(uint32_t) + name->len; + rec_len = sizeof(struct sss_mc_rec) + sizeof(struct sss_mc_initgr_data) + + data_len; + if (rec_len > mcc->dt_size) { + return ENOMEM; + } + + ret = sss_mc_get_record(_mcc, rec_len, name, &rec); + if (ret != EOK) { + return ret; + } + + data = (struct sss_mc_initgr_data *)rec->data; + + MC_RAISE_BARRIER(rec); + + /* We cannot use two keys for searching in intgroups cache. + * Use the first key twice. + */ + sss_mmap_set_rec_header(mcc, rec, rec_len, mcc->valid_time_slot, + name->str, name->len, name->str, name->len); + + /* initgroups struct */ + data->members = memnum; + memcpy(data->gids, membuf, memnum * sizeof(uint32_t)); + memcpy(&data->gids[memnum], name->str, name->len); + data->name = MC_PTR_DIFF(&data->gids[memnum], data); + + MC_LOWER_BARRIER(rec); + + /* finally chain the rec in the hash table */ + sss_mmap_chain_in_rec(mcc, rec); + + return EOK; +} + +errno_t sss_mmap_cache_initgr_invalidate(struct sss_mc_ctx *mcc, + struct sized_string *name) +{ + return sss_mmap_cache_invalidate(mcc, name); +} /*************************************************************************** * initialization @@ -1145,6 +1206,9 @@ errno_t sss_mmap_cache_init(TALLOC_CTX *mem_ctx, const char *name, case SSS_MC_GROUP: payload = SSS_AVG_GROUP_PAYLOAD; break; + case SSS_MC_INITGROUPS: + payload = SSS_AVG_INITGROUP_PAYLOAD; + break; default: return EINVAL; } |