svn commit: samba r3702 - in branches/SAMBA_3_0/source/lib: .

vlendec at samba.org vlendec at samba.org
Fri Nov 12 15:01:41 GMT 2004


Author: vlendec
Date: 2004-11-12 15:01:40 +0000 (Fri, 12 Nov 2004)
New Revision: 3702

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=3702

Log:
This is a getpwnam-cache. It is mainly to speed up Samba with slow nss
backends such as nss_ldap.

Volker

Modified:
   branches/SAMBA_3_0/source/lib/util_pw.c


Changeset:
Modified: branches/SAMBA_3_0/source/lib/util_pw.c
===================================================================
--- branches/SAMBA_3_0/source/lib/util_pw.c	2004-11-12 15:01:16 UTC (rev 3701)
+++ branches/SAMBA_3_0/source/lib/util_pw.c	2004-11-12 15:01:40 UTC (rev 3702)
@@ -52,10 +52,40 @@
 	SAFE_FREE(*buf);
 }
 
+#define PWNAMCACHE_SIZE 4
+static struct passwd *pwnam_cache[PWNAMCACHE_SIZE];
+static BOOL pwnam_cache_initialized = False;
+
+static void init_pwnam_cache(void)
+{
+	int i;
+
+	if (pwnam_cache_initialized)
+		return;
+
+	for (i=0; i<PWNAMCACHE_SIZE; i++)
+		pwnam_cache[i] = NULL;
+
+	pwnam_cache_initialized = True;
+	return;
+}
+
 struct passwd *getpwnam_alloc(const char *name) 
 {
+	int i;
+
 	struct passwd *temp;
 
+	init_pwnam_cache();
+
+	for (i=0; i<PWNAMCACHE_SIZE; i++) {
+		if ((pwnam_cache[i] != NULL) && 
+		    (strcmp(name, pwnam_cache[i]->pw_name) == 0)) {
+			DEBUG(10, ("Got %s from pwnam_cache\n", name));
+			return alloc_copy_passwd(pwnam_cache[i]);
+		}
+	}
+
 	temp = sys_getpwnam(name);
 	
 	if (!temp) {
@@ -67,6 +97,19 @@
 		return NULL;
 	}
 
+	for (i=0; i<PWNAMCACHE_SIZE; i++) {
+		if (pwnam_cache[i] == NULL)
+			break;
+	}
+
+	if (i == PWNAMCACHE_SIZE)
+		i = rand() % PWNAMCACHE_SIZE;
+
+	if (pwnam_cache[i] != NULL)
+		passwd_free(&pwnam_cache[i]);
+
+	pwnam_cache[i] = alloc_copy_passwd(temp);
+
 	return alloc_copy_passwd(temp);
 }
 



More information about the samba-cvs mailing list