#include "../libcli/smb/smb_common.h"
#include "../librpc/gen_ndr/ndr_security.h"
#include "../lib/util/tevent_ntstatus.h"
+#include "messages.h"
int map_smb2_oplock_levels_to_samba(uint8_t in_oplock_level)
{
}
tsubreq = smbd_smb2_create_send(smb2req,
- smb2req->sconn->smb2.event_ctx,
+ smb2req->sconn->ev_ctx,
smb2req,
in_oplock_level,
in_impersonation_level,
}
tevent_req_set_callback(tsubreq, smbd_smb2_request_create_done, smb2req);
- return smbd_smb2_request_pending_queue(smb2req, tsubreq);
+ /*
+ * For now we keep the logic that we do not send STATUS_PENDING
+ * for sharing violations, so we just wait 2 seconds.
+ *
+ * TODO: we need more tests for this.
+ */
+ return smbd_smb2_request_pending_queue(smb2req, tsubreq, 2000000);
}
static uint64_t get_mid_from_smb2req(struct smbd_smb2_request *smb2req)
{
struct smbd_smb2_request *smb2req = tevent_req_callback_data(tsubreq,
struct smbd_smb2_request);
- int i = smb2req->current_idx;
- uint8_t *outhdr;
DATA_BLOB outbody;
DATA_BLOB outdyn;
uint8_t out_oplock_level = 0;
out_context_buffer_offset = SMB2_HDR_BODY + 0x58;
}
- outhdr = (uint8_t *)smb2req->out.vector[i].iov_base;
-
outbody = data_blob_talloc(smb2req->out.vector, NULL, 0x58);
if (outbody.data == NULL) {
error = smbd_smb2_request_error(smb2req, NT_STATUS_NO_MEMORY);
}
- if (!smb2req->async) {
+ if (smb2req->subreq == NULL) {
/* New create call. */
req = tevent_req_create(mem_ctx, &state,
struct smbd_smb2_create_state);
return NULL;
}
state->smb2req = smb2req;
- smb2req->subreq = req; /* So we can find this when going async. */
smb1req = smbd_smb2_fake_smb_request(smb2req);
if (tevent_req_nomem(smb1req, req)) {
return tevent_req_post(req, ev);
}
state->smb1req = smb1req;
+ smb2req->subreq = req;
DEBUG(10,("smbd_smb2_create: name[%s]\n",
in_name));
} else {
status = smbd_calculate_access_mask(smb1req->conn,
result->fsp_name,
- /*
- * at this stage
- * it exists
- */
- true,
SEC_FLAG_MAXIMUM_ALLOWED,
&max_access_granted);
if (!smb2req) {
return false;
}
- if (!smb2req->async) {
+ if (smb2req->async_te == NULL) {
return false;
}
req = smb2req->subreq;
(unsigned long long)mid ));
tevent_schedule_immediate(state->im,
- smb2req->sconn->smb2.event_ctx,
+ smb2req->sconn->ev_ctx,
smbd_smb2_create_request_dispatch_immediate,
smb2req);
}
mid = get_mid_from_smb2req(smb2req);
remove_deferred_open_entry(state->id, mid,
- sconn_server_id(smb2req->sconn));
+ messaging_server_id(smb2req->sconn->msg_ctx));
remove_deferred_open_message_smb2_internal(smb2req, mid);
smb2req->cancelled = true;
return false;
}
-#if 1
- /* Boo - turns out this isn't what W2K8R2
- does. It actually sends the STATUS_PENDING
- message followed by the STATUS_SHARING_VIOLATION
- message. Surely this means that all open
- calls (even on directories) will potentially
- fail in a chain.... ? And I've seen directory
- opens as the start of a chain. JRA.
-
- Update: 19th May 2010. Talking with Microsoft
- engineers at the plugfest this is a bug in
- Windows. Re-enable this code.
- */
- /*
- * More subtlety. To match W2K8R2 don't
- * send a "gone async" message if it's simply
- * a STATUS_SHARING_VIOLATION (short) wait, not
- * an oplock break wait. We do this by prematurely
- * setting smb2req->async flag.
- */
- if (timeout.tv_sec < 2) {
- DEBUG(10,("push_deferred_open_message_smb2: "
- "short timer wait (usec = %u). "
- "Don't send async message.\n",
- (unsigned int)timeout.tv_usec ));
- smb2req->async = true;
- }
-#endif
-
/* Re-schedule us to retry on timer expiry. */
end_time = timeval_sum(&request_time, &timeout);
&end_time,
true) ));
- state->te = event_add_timed(smb2req->sconn->smb2.event_ctx,
+ state->te = tevent_add_timer(smb2req->sconn->ev_ctx,
state,
end_time,
smb2_deferred_open_timer,