summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2004-09-27 14:44:07 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:52:49 -0500
commitcc146adb2635daa4625ec00fc1c2e4ae757e72f9 (patch)
treeef91f55e8c7a3481df54e0040928d2243795da33 /source3
parentf128aa2a550f3672b2d12786ab4bf59e6d749c7a (diff)
downloadsamba-cc146adb2635daa4625ec00fc1c2e4ae757e72f9.tar.gz
samba-cc146adb2635daa4625ec00fc1c2e4ae757e72f9.tar.bz2
samba-cc146adb2635daa4625ec00fc1c2e4ae757e72f9.zip
r2691: Increase a debug level for a quite frequent operation.
Optimization for 'idmap backend = ldap': When asking sid2id for the wrong type, don't ask ldap when we have the opposite mapping in the local tdb. Volker (This used to be commit c91cff3bd38c1a8e23628b032f09829f9abf792d)
Diffstat (limited to 'source3')
-rw-r--r--source3/nsswitch/winbindd_sid.c4
-rw-r--r--source3/sam/idmap.c27
2 files changed, 29 insertions, 2 deletions
diff --git a/source3/nsswitch/winbindd_sid.c b/source3/nsswitch/winbindd_sid.c
index 97e676813d..060e66fbc2 100644
--- a/source3/nsswitch/winbindd_sid.c
+++ b/source3/nsswitch/winbindd_sid.c
@@ -219,7 +219,7 @@ enum winbindd_result winbindd_sid_to_uid(struct winbindd_cli_state *state)
if (NT_STATUS_IS_OK(result))
return WINBINDD_OK;
- DEBUG(1, ("Could not get uid for sid %s\n", state->request.data.sid));
+ DEBUG(4, ("Could not get uid for sid %s\n", state->request.data.sid));
return WINBINDD_ERROR;
}
@@ -337,7 +337,7 @@ enum winbindd_result winbindd_sid_to_gid(struct winbindd_cli_state *state)
if (NT_STATUS_IS_OK(result))
return WINBINDD_OK;
- DEBUG(1, ("Could not get gid for sid %s\n", state->request.data.sid));
+ DEBUG(4, ("Could not get gid for sid %s\n", state->request.data.sid));
return WINBINDD_ERROR;
}
diff --git a/source3/sam/idmap.c b/source3/sam/idmap.c
index d541776f39..4de37f0e49 100644
--- a/source3/sam/idmap.c
+++ b/source3/sam/idmap.c
@@ -200,6 +200,7 @@ NTSTATUS idmap_get_id_from_sid(unid_t *id, int *id_type, const DOM_SID *sid)
{
NTSTATUS ret;
int loc_type;
+ unid_t loc_id;
if (proxyonly)
return NT_STATUS_UNSUCCESSFUL;
@@ -223,6 +224,32 @@ NTSTATUS idmap_get_id_from_sid(unid_t *id, int *id_type, const DOM_SID *sid)
return ret;
}
+ /* Before forking out to the possibly slow remote map, lets see if we
+ * already have the sid as uid when asking for a gid or vice versa. */
+
+ loc_type = *id_type & ID_TYPEMASK;
+
+ switch (loc_type) {
+ case ID_USERID:
+ loc_type = ID_GROUPID;
+ break;
+ case ID_GROUPID:
+ loc_type = ID_USERID;
+ break;
+ default:
+ loc_type = ID_EMPTY;
+ }
+
+ loc_type |= ID_QUERY_ONLY;
+
+ ret = cache_map->get_id_from_sid(&loc_id, &loc_type, sid);
+
+ if (NT_STATUS_IS_OK(ret)) {
+ /* Ok, we have the uid as gid or vice versa. The remote map
+ * would not know anything different, so return here. */
+ return NT_STATUS_UNSUCCESSFUL;
+ }
+
/* Ok, the mapping was not in the cache, give the remote map a
second try. */