Ignore:
Timestamp:
Jul 2, 2011, 3:35:33 PM (14 years ago)
Author:
Herwig Bauernfeind
Message:

Samba 3.5: Update trunk to 3.5.8

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/server/source3/libsmb/async_smb.c

    r414 r596  
    706706                TALLOC_FREE(inbuf);
    707707                status = NT_STATUS_ACCESS_DENIED;
     708                close(cli->fd);
     709                cli->fd = -1;
    708710                goto fail;
    709711        }
     
    10701072        return NT_STATUS_OK;
    10711073}
     1074
     1075
     1076struct 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
     1084static void cli_session_request_sent(struct tevent_req *subreq);
     1085static void cli_session_request_recvd(struct tevent_req *subreq);
     1086
     1087struct 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
     1137static 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
     1159static 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
     1190bool 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.