Fix a bunch of "unused variable" warnings.
[ira/wip.git] / source3 / smbd / smb2_create.c
index 29696dcdb4eec81dc3dd7ce31f5738c1f7d42736..3e5b81d5c8d8891799d00c623cf3d63711d22212 100644 (file)
@@ -26,6 +26,7 @@
 #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)
 {
@@ -227,7 +228,7 @@ NTSTATUS smbd_smb2_request_process_create(struct smbd_smb2_request *smb2req)
        }
 
        tsubreq = smbd_smb2_create_send(smb2req,
-                                      smb2req->sconn->smb2.event_ctx,
+                                      smb2req->sconn->ev_ctx,
                                       smb2req,
                                       in_oplock_level,
                                       in_impersonation_level,
@@ -244,7 +245,13 @@ NTSTATUS smbd_smb2_request_process_create(struct smbd_smb2_request *smb2req)
        }
        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)
@@ -257,8 +264,6 @@ static void smbd_smb2_request_create_done(struct tevent_req *tsubreq)
 {
        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;
@@ -330,8 +335,6 @@ static void smbd_smb2_request_create_done(struct tevent_req *tsubreq)
                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);
@@ -437,7 +440,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
        }
 
 
-       if (!smb2req->async) {
+       if (smb2req->subreq == NULL) {
                /* New create call. */
                req = tevent_req_create(mem_ctx, &state,
                                struct smbd_smb2_create_state);
@@ -445,13 +448,13 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                        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 {
@@ -739,11 +742,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
 
                                status = smbd_calculate_access_mask(smb1req->conn,
                                                        result->fsp_name,
-                                                       /*
-                                                        * at this stage
-                                                        * it exists
-                                                        */
-                                                       true,
                                                        SEC_FLAG_MAXIMUM_ALLOWED,
                                                        &max_access_granted);
 
@@ -892,7 +890,7 @@ bool get_deferred_open_message_state_smb2(struct smbd_smb2_request *smb2req,
        if (!smb2req) {
                return false;
        }
-       if (!smb2req->async) {
+       if (smb2req->async_te == NULL) {
                return false;
        }
        req = smb2req->subreq;
@@ -1090,7 +1088,7 @@ void schedule_deferred_open_message_smb2(
                (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);
 }
@@ -1163,7 +1161,7 @@ static bool smbd_smb2_create_cancel(struct tevent_req *req)
        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;
 
@@ -1201,35 +1199,6 @@ bool push_deferred_open_message_smb2(struct smbd_smb2_request *smb2req,
                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);
 
@@ -1239,7 +1208,7 @@ bool push_deferred_open_message_smb2(struct smbd_smb2_request *smb2req,
                                &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,