svn commit: samba r3564 - in trunk/source: auth include lib passdb smbd

vlendec at samba.org vlendec at samba.org
Fri Nov 5 22:54:48 GMT 2004


Author: vlendec
Date: 2004-11-05 22:54:48 +0000 (Fri, 05 Nov 2004)
New Revision: 3564

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

Log:
During a typical logon a modern workstation makes a lot of anonymous session
setups on its way to open a pipe. This gets rid of many round-trips to the
LDAP server during logon by setting up the server_info_guest once and not
asking the LDAP server and nss every time. Make sure that the ldap connection
is reopened in the child. (I did not look at the sql backends.)

Volker

Modified:
   trunk/source/auth/auth_util.c
   trunk/source/include/smbldap.h
   trunk/source/lib/smbldap.c
   trunk/source/passdb/passdb.c
   trunk/source/smbd/server.c


Changeset:
Modified: trunk/source/auth/auth_util.c
===================================================================
--- trunk/source/auth/auth_util.c	2004-11-05 22:53:35 UTC (rev 3563)
+++ trunk/source/auth/auth_util.c	2004-11-05 22:54:48 UTC (rev 3564)
@@ -910,7 +910,7 @@
  Make (and fill) a user_info struct for a guest login.
 ***************************************************************************/
 
-NTSTATUS make_server_info_guest(auth_serversupplied_info **server_info)
+static NTSTATUS make_new_server_info_guest(auth_serversupplied_info **server_info)
 {
 	NTSTATUS nt_status;
 	SAM_ACCOUNT *sampass = NULL;
@@ -945,6 +945,49 @@
 	return nt_status;
 }
 
+static auth_serversupplied_info *copy_serverinfo(auth_serversupplied_info *src)
+{
+	auth_serversupplied_info *dst;
+
+	if (!NT_STATUS_IS_OK(make_server_info(&dst)))
+		return NULL;
+
+	dst->guest = src->guest;
+	dst->uid = src->uid;
+	dst->gid = src->gid;
+	dst->n_groups = src->n_groups;
+	if (src->n_groups != 0)
+		dst->groups = memdup(src->groups, sizeof(gid_t)*dst->n_groups);
+	else
+		dst->groups = NULL;
+	dst->ptok = dup_nt_token(src->ptok);
+	dst->user_session_key = data_blob(src->user_session_key.data,
+					  src->user_session_key.length);
+	dst->lm_session_key = data_blob(src->lm_session_key.data,
+					  src->lm_session_key.length);
+	pdb_copy_sam_account(src->sam_account, &dst->sam_account);
+	dst->pam_handle = NULL;
+	dst->unix_name = smb_xstrdup(src->unix_name);
+
+	return dst;
+}
+
+static auth_serversupplied_info *guest_info = NULL;
+
+BOOL init_guest_info(void)
+{
+	if (guest_info != NULL)
+		return True;
+
+	return NT_STATUS_IS_OK(make_new_server_info_guest(&guest_info));
+}
+
+NTSTATUS make_server_info_guest(auth_serversupplied_info **server_info)
+{
+	*server_info = copy_serverinfo(guest_info);
+	return (*server_info != NULL) ? NT_STATUS_OK : NT_STATUS_NO_MEMORY;
+}
+
 /***************************************************************************
  Purely internal function for make_server_info_info3
  Fill the sam account from getpwnam

Modified: trunk/source/include/smbldap.h
===================================================================
--- trunk/source/include/smbldap.h	2004-11-05 22:53:35 UTC (rev 3563)
+++ trunk/source/include/smbldap.h	2004-11-05 22:54:48 UTC (rev 3564)
@@ -147,6 +147,7 @@
 
 struct smbldap_state {
 	LDAP *ldap_struct;
+	pid_t pid;
 	time_t last_ping;
 	/* retrive-once info */
 	const char *uri;

Modified: trunk/source/lib/smbldap.c
===================================================================
--- trunk/source/lib/smbldap.c	2004-11-05 22:53:35 UTC (rev 3563)
+++ trunk/source/lib/smbldap.c	2004-11-05 22:54:48 UTC (rev 3564)
@@ -929,6 +929,7 @@
 
 
 	ldap_state->last_ping = time(NULL);
+	ldap_state->pid = sys_getpid();
 	DEBUG(4,("The LDAP server is succesfully connected\n"));
 
 	return LDAP_SUCCESS;
@@ -987,6 +988,9 @@
 		got_alarm = False;
 		old_handler = CatchSignal(SIGALRM, gotalarm_sig);
 		alarm(endtime - now);
+
+		if (ldap_state->pid != sys_getpid())
+			smbldap_close(ldap_state);
 	}
 
 	while (1) {

Modified: trunk/source/passdb/passdb.c
===================================================================
--- trunk/source/passdb/passdb.c	2004-11-05 22:53:35 UTC (rev 3563)
+++ trunk/source/passdb/passdb.c	2004-11-05 22:54:48 UTC (rev 3564)
@@ -2210,6 +2210,28 @@
 	return (buflen);
 }
 
+BOOL pdb_copy_sam_account(const SAM_ACCOUNT *src, SAM_ACCOUNT **dst)
+{
+	BOOL result;
+	uint8 *buf;
+	int len;
+
+	if ((*dst == NULL) && (!NT_STATUS_IS_OK(pdb_init_sam(dst))))
+		return False;
+
+	len = init_buffer_from_sam_v2(&buf, src, False);
+
+	if (len == -1)
+		return False;
+
+	result = init_sam_from_buffer_v2(*dst, buf, len);
+	(*dst)->methods = src->methods;
+
+	free(buf);
+
+	return result;
+}
+
 /**********************************************************************
 **********************************************************************/
 

Modified: trunk/source/smbd/server.c
===================================================================
--- trunk/source/smbd/server.c	2004-11-05 22:53:35 UTC (rev 3563)
+++ trunk/source/smbd/server.c	2004-11-05 22:54:48 UTC (rev 3564)
@@ -785,6 +785,9 @@
 
 	init_structs();
 
+	if (!init_guest_info())
+		return -1;
+
 #ifdef WITH_PROFILE
 	if (!profile_setup(False)) {
 		DEBUG(0,("ERROR: failed to setup profiling\n"));



More information about the samba-cvs mailing list