#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)
}
- 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)) {
if (!smb2req) {
return false;
}
- if (!smb2req->async) {
+ if (smb2req->subreq == 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,