diff options
author | Gregor Beck <gbeck@sernet.de> | 2011-02-18 14:45:14 +0100 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2011-02-28 12:58:43 +0100 |
commit | 6710561c273643af27c6f06a3fe7bacdb4a2f95e (patch) | |
tree | 8752ff9566a2303bcc8c7e284684ec5f6ffee77c | |
parent | 01e76110501785a65387c360fcfee85fbf3a4fde (diff) | |
download | samba-6710561c273643af27c6f06a3fe7bacdb4a2f95e.tar.gz samba-6710561c273643af27c6f06a3fe7bacdb4a2f95e.tar.bz2 samba-6710561c273643af27c6f06a3fe7bacdb4a2f95e.zip |
s3: add functions to remove entries from idmap memcache
-rw-r--r-- | source3/include/proto.h | 3 | ||||
-rw-r--r-- | source3/passdb/lookup_sid.c | 52 |
2 files changed, 55 insertions, 0 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 6f4f0fc7bb..43426795de 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -3631,6 +3631,9 @@ NTSTATUS get_primary_group_sid(TALLOC_CTX *mem_ctx, const char *username, struct passwd **_pwd, struct dom_sid **_group_sid); +bool delete_uid_cache(uid_t uid); +bool delete_gid_cache(gid_t gid); +bool delete_sid_cache(const struct dom_sid* psid); void flush_uid_cache(void); void flush_gid_cache(void); diff --git a/source3/passdb/lookup_sid.c b/source3/passdb/lookup_sid.c index f1462af686..68072f3096 100644 --- a/source3/passdb/lookup_sid.c +++ b/source3/passdb/lookup_sid.c @@ -1643,6 +1643,58 @@ done: return NT_STATUS_OK; } +bool delete_uid_cache(uid_t puid) +{ + DATA_BLOB uid = data_blob_const(&puid, sizeof(puid)); + DATA_BLOB sid; + + if (!memcache_lookup(NULL, UID_SID_CACHE, uid, &sid)) { + DEBUG(3, ("UID %d is not memcached!\n", (int)puid)); + return false; + } + DEBUG(3, ("Delete mapping UID %d <-> %s from memcache\n", (int)puid, + sid_string_dbg((struct dom_sid*)sid.data))); + memcache_delete(NULL, SID_UID_CACHE, sid); + memcache_delete(NULL, UID_SID_CACHE, uid); + return true; +} + +bool delete_gid_cache(gid_t pgid) +{ + DATA_BLOB gid = data_blob_const(&pgid, sizeof(pgid)); + DATA_BLOB sid; + if (!memcache_lookup(NULL, GID_SID_CACHE, gid, &sid)) { + DEBUG(3, ("GID %d is not memcached!\n", (int)pgid)); + return false; + } + DEBUG(3, ("Delete mapping GID %d <-> %s from memcache\n", (int)pgid, + sid_string_dbg((struct dom_sid*)sid.data))); + memcache_delete(NULL, SID_GID_CACHE, sid); + memcache_delete(NULL, GID_SID_CACHE, gid); + return true; +} + +bool delete_sid_cache(const struct dom_sid* psid) +{ + DATA_BLOB sid = data_blob_const(psid, ndr_size_dom_sid(psid, 0)); + DATA_BLOB id; + if (memcache_lookup(NULL, SID_GID_CACHE, sid, &id)) { + DEBUG(3, ("Delete mapping %s <-> GID %d from memcache\n", + sid_string_dbg(psid), *(int*)id.data)); + memcache_delete(NULL, SID_GID_CACHE, sid); + memcache_delete(NULL, GID_SID_CACHE, id); + } else if (memcache_lookup(NULL, SID_UID_CACHE, sid, &id)) { + DEBUG(3, ("Delete mapping %s <-> UID %d from memcache\n", + sid_string_dbg(psid), *(int*)id.data)); + memcache_delete(NULL, SID_UID_CACHE, sid); + memcache_delete(NULL, UID_SID_CACHE, id); + } else { + DEBUG(3, ("SID %s is not memcached!\n", sid_string_dbg(psid))); + return false; + } + return true; +} + void flush_gid_cache(void) { DEBUG(3, ("Flush GID <-> SID memcache\n")); |