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"));
