usr/src/uts/common/fs/smbsrv/smb_session.c
changeset 7961 4b5e3051f38b
parent 7619 0ad244464731
child 8262 e5216a2e4cb8
equal deleted inserted replaced
7960:dab1829da853 7961:4b5e3051f38b
    38 uint32_t smb_keep_alive = SSN_KEEP_ALIVE_TIMEOUT;
    38 uint32_t smb_keep_alive = SSN_KEEP_ALIVE_TIMEOUT;
    39 
    39 
    40 static int smb_session_message(smb_session_t *);
    40 static int smb_session_message(smb_session_t *);
    41 static int smb_session_xprt_puthdr(smb_session_t *, smb_xprt_t *,
    41 static int smb_session_xprt_puthdr(smb_session_t *, smb_xprt_t *,
    42     uint8_t *, size_t);
    42     uint8_t *, size_t);
    43 
    43 static smb_user_t *smb_session_lookup_user(smb_session_t *, char *, char *);
    44 static void smb_request_init_command_mbuf(smb_request_t *sr);
    44 static void smb_request_init_command_mbuf(smb_request_t *sr);
    45 
    45 
    46 
    46 
    47 void
    47 void
    48 smb_session_timers(smb_session_list_t *se)
    48 smb_session_timers(smb_session_list_t *se)
   988 		ASSERT(session->s_magic == SMB_SESSION_MAGIC);
   988 		ASSERT(session->s_magic == SMB_SESSION_MAGIC);
   989 		tsignal(session->s_thread, SIGINT);
   989 		tsignal(session->s_thread, SIGINT);
   990 		session = list_next(&se->se_act.lst, session);
   990 		session = list_next(&se->se_act.lst, session);
   991 	}
   991 	}
   992 	rw_exit(&se->se_lock);
   992 	rw_exit(&se->se_lock);
       
   993 }
       
   994 
       
   995 /*
       
   996  * smb_session_lookup_user
       
   997  */
       
   998 static smb_user_t *
       
   999 smb_session_lookup_user(smb_session_t *session, char *domain, char *name)
       
  1000 {
       
  1001 	smb_user_t	*user;
       
  1002 	smb_llist_t	*ulist;
       
  1003 
       
  1004 	ulist = &session->s_user_list;
       
  1005 	smb_llist_enter(ulist, RW_READER);
       
  1006 	user = smb_llist_head(ulist);
       
  1007 	while (user) {
       
  1008 		ASSERT(user->u_magic == SMB_USER_MAGIC);
       
  1009 		if (!utf8_strcasecmp(user->u_name, name) &&
       
  1010 		    !utf8_strcasecmp(user->u_domain, domain)) {
       
  1011 			mutex_enter(&user->u_mutex);
       
  1012 			if (user->u_state == SMB_USER_STATE_LOGGED_IN) {
       
  1013 				user->u_refcnt++;
       
  1014 				mutex_exit(&user->u_mutex);
       
  1015 				break;
       
  1016 			}
       
  1017 			mutex_exit(&user->u_mutex);
       
  1018 		}
       
  1019 		user = smb_llist_next(ulist, user);
       
  1020 	}
       
  1021 	smb_llist_exit(ulist);
       
  1022 
       
  1023 	return (user);
       
  1024 }
       
  1025 
       
  1026 /*
       
  1027  * If a user attempts to log in subsequently from the specified session,
       
  1028  * duplicates the existing SMB user instance such that all SMB user
       
  1029  * instances that corresponds to the same user on the given session
       
  1030  * reference the same user's cred.
       
  1031  *
       
  1032  * Returns NULL if the given user hasn't yet logged in from this
       
  1033  * specified session.  Otherwise, returns a user instance that corresponds
       
  1034  * to this subsequent login.
       
  1035  */
       
  1036 smb_user_t *
       
  1037 smb_session_dup_user(smb_session_t *session, char *domain, char *account_name)
       
  1038 {
       
  1039 	smb_user_t *orig_user = NULL;
       
  1040 	smb_user_t *user = NULL;
       
  1041 
       
  1042 	orig_user = smb_session_lookup_user(session, domain,
       
  1043 	    account_name);
       
  1044 
       
  1045 	if (orig_user) {
       
  1046 		user = smb_user_dup(orig_user);
       
  1047 		smb_user_release(orig_user);
       
  1048 	}
       
  1049 
       
  1050 	return (user);
   993 }
  1051 }
   994 
  1052 
   995 /*
  1053 /*
   996  * smb_request_alloc
  1054  * smb_request_alloc
   997  *
  1055  *