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 * |