Changeset 596 for trunk/server/source3/libsmb/async_smb.c
- Timestamp:
- Jul 2, 2011, 3:35:33 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server/source3/libsmb/async_smb.c
r414 r596 706 706 TALLOC_FREE(inbuf); 707 707 status = NT_STATUS_ACCESS_DENIED; 708 close(cli->fd); 709 cli->fd = -1; 708 710 goto fail; 709 711 } … … 1070 1072 return NT_STATUS_OK; 1071 1073 } 1074 1075 1076 struct cli_session_request_state { 1077 struct tevent_context *ev; 1078 int sock; 1079 uint32 len_hdr; 1080 struct iovec iov[3]; 1081 uint8_t nb_session_response; 1082 }; 1083 1084 static void cli_session_request_sent(struct tevent_req *subreq); 1085 static void cli_session_request_recvd(struct tevent_req *subreq); 1086 1087 struct tevent_req *cli_session_request_send(TALLOC_CTX *mem_ctx, 1088 struct tevent_context *ev, 1089 int sock, 1090 const struct nmb_name *called, 1091 const struct nmb_name *calling) 1092 { 1093 struct tevent_req *req, *subreq; 1094 struct cli_session_request_state *state; 1095 1096 req = tevent_req_create(mem_ctx, &state, 1097 struct cli_session_request_state); 1098 if (req == NULL) { 1099 return NULL; 1100 } 1101 state->ev = ev; 1102 state->sock = sock; 1103 1104 state->iov[1].iov_base = name_mangle( 1105 state, called->name, called->name_type); 1106 if (tevent_req_nomem(state->iov[1].iov_base, req)) { 1107 return tevent_req_post(req, ev); 1108 } 1109 state->iov[1].iov_len = name_len( 1110 (unsigned char *)state->iov[1].iov_base, 1111 talloc_get_size(state->iov[1].iov_base)); 1112 1113 state->iov[2].iov_base = name_mangle( 1114 state, calling->name, calling->name_type); 1115 if (tevent_req_nomem(state->iov[2].iov_base, req)) { 1116 return tevent_req_post(req, ev); 1117 } 1118 state->iov[2].iov_len = name_len( 1119 (unsigned char *)state->iov[2].iov_base, 1120 talloc_get_size(state->iov[2].iov_base)); 1121 1122 _smb_setlen(((char *)&state->len_hdr), 1123 state->iov[1].iov_len + state->iov[2].iov_len); 1124 SCVAL((char *)&state->len_hdr, 0, 0x81); 1125 1126 state->iov[0].iov_base = &state->len_hdr; 1127 state->iov[0].iov_len = sizeof(state->len_hdr); 1128 1129 subreq = writev_send(state, ev, NULL, sock, true, state->iov, 3); 1130 if (tevent_req_nomem(subreq, req)) { 1131 return tevent_req_post(req, ev); 1132 } 1133 tevent_req_set_callback(subreq, cli_session_request_sent, req); 1134 return req; 1135 } 1136 1137 static void cli_session_request_sent(struct tevent_req *subreq) 1138 { 1139 struct tevent_req *req = tevent_req_callback_data( 1140 subreq, struct tevent_req); 1141 struct cli_session_request_state *state = tevent_req_data( 1142 req, struct cli_session_request_state); 1143 ssize_t ret; 1144 int err; 1145 1146 ret = writev_recv(subreq, &err); 1147 TALLOC_FREE(subreq); 1148 if (ret == -1) { 1149 tevent_req_error(req, err); 1150 return; 1151 } 1152 subreq = read_smb_send(state, state->ev, state->sock); 1153 if (tevent_req_nomem(subreq, req)) { 1154 return; 1155 } 1156 tevent_req_set_callback(subreq, cli_session_request_recvd, req); 1157 } 1158 1159 static void cli_session_request_recvd(struct tevent_req *subreq) 1160 { 1161 struct tevent_req *req = tevent_req_callback_data( 1162 subreq, struct tevent_req); 1163 struct cli_session_request_state *state = tevent_req_data( 1164 req, struct cli_session_request_state); 1165 uint8_t *buf; 1166 ssize_t ret; 1167 int err; 1168 1169 ret = read_smb_recv(subreq, talloc_tos(), &buf, &err); 1170 TALLOC_FREE(subreq); 1171 1172 if (ret < 4) { 1173 ret = -1; 1174 err = EIO; 1175 } 1176 if (ret == -1) { 1177 tevent_req_error(req, err); 1178 return; 1179 } 1180 /* 1181 * In case of an error there is more information in the data 1182 * portion according to RFC1002. We're not subtle enough to 1183 * respond to the different error conditions, so drop the 1184 * error info here. 1185 */ 1186 state->nb_session_response = CVAL(buf, 0); 1187 tevent_req_done(req); 1188 } 1189 1190 bool cli_session_request_recv(struct tevent_req *req, int *err, uint8_t *resp) 1191 { 1192 struct cli_session_request_state *state = tevent_req_data( 1193 req, struct cli_session_request_state); 1194 1195 if (tevent_req_is_unix_error(req, err)) { 1196 return false; 1197 } 1198 *resp = state->nb_session_response; 1199 return true; 1200 }
Note:
See TracChangeset
for help on using the changeset viewer.