s3:smbd:smb2_create: add some comment
[metze/samba/wip.git] / source3 / smbd / smb2_create.c
index f71d34f7604557377b77a9c9a2f1e86f1b04f9df..28d50740ba44a210b4dc8902e0fb96ce4bc4ca3b 100644 (file)
@@ -390,9 +390,24 @@ static void smbd_smb2_request_create_done(struct tevent_req *tsubreq)
        }
 }
 
+/*
+ * TODO: needs to be moved - copied from source3/smbd/files.c
+ */
+static unsigned long get_gen_count(struct smbd_server_connection *sconn)
+{
+       sconn->file_gen_counter += 1;
+       if (sconn->file_gen_counter == 0) {
+               sconn->file_gen_counter += 1;
+       }
+
+       return sconn->file_gen_counter;
+}
+
 static NTSTATUS new_durable_reconnect_fsp(struct smbXsrv_open *op,
+                                         struct connection_struct *conn,
+                                         struct smb_filename *smb_fname,
                                          TALLOC_CTX *mem_ctx,
-                                         files_sruct **_fsp)
+                                         files_struct **_fsp)
 {
        NTSTATUS status = NT_STATUS_NO_MEMORY;
        files_struct *fsp = NULL;
@@ -414,7 +429,7 @@ static NTSTATUS new_durable_reconnect_fsp(struct smbXsrv_open *op,
                goto fail;
        }
 
-       status = fsp_set_smb_fname(fsp, /*TODO*/ smb_fname);
+       status = fsp_set_smb_fname(fsp, smb_fname);
        if (!NT_STATUS_IS_OK(status)) {
                goto fail;
        }
@@ -440,21 +455,29 @@ fail:
 }
 
 static NTSTATUS smb2_create_durable_reconnect(struct smbXsrv_open *op,
-                                             struct smb_request *smb1req,
-
+                                             /* struct smb_request *smb1req, */
+                                             struct connection_struct *conn,
+                                             struct smb_filename *smb_fname,
                                              TALLOC_CTX *mem_ctx,
-                                             files_struct **fsp)
+                                             files_struct **_fsp)
 {
        struct share_mode_lock *sharemode_lock;
        files_struct *fsp = NULL;
+       NTSTATUS status;
+
+DEBUG(0, ("OBNOX - durable_reconnect enter: (%s:%s)\n", __location__, __FUNCTION__));
 
        /* 1. check entry in locking.tdb */
 
        /*
         * Q: fetch with lock right away?
         */
+/*
        sharemode_lock = fetch_share_mode_unlocked(mem_ctx,
                                                   op->global->backend_file_id);
+*/
+       sharemode_lock = get_share_mode_lock(mem_ctx,
+                                            op->global->backend_file_id);
        if (sharemode_lock == NULL) {
                /* TODO: use/create other fetch func with better error code */
                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
@@ -485,14 +508,16 @@ static NTSTATUS smb2_create_durable_reconnect(struct smbXsrv_open *op,
        /* 2. proceed with opening file */
 
        /*
-        * refetch with lock and update the pid
+        * refetch with lock and update the pid  // fetch with lock right away above
         */
+/*
        talloc_free(sharemode_lock);
        sharemode_lock = get_share_mode_lock(mem_ctx,
                                             op->global->backend_file_id);
        if (sharemode_lock == NULL) {
                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
        }
+*/
 
        sharemode_lock->data->share_modes[0].pid =
                messaging_server_id(op->connection->sconn->msg_ctx);
@@ -500,35 +525,37 @@ static NTSTATUS smb2_create_durable_reconnect(struct smbXsrv_open *op,
        /*
         * circumstances seems ok, do the open
         */
-       status = new_durable_reconnect_fsp( &fsp);
+       status = new_durable_reconnect_fsp(op, conn, smb_fname, mem_ctx, &fsp);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
 
-       /* TODO */
-       fsp->fh->fd = SMB_VFS_OPEN(smb1req->conn,
+DEBUG(0, ("OBNOX - durable_reconnect: new fsp created (%s:%s)\n", __location__, __FUNCTION__));
+
+       fsp->fh->fd = SMB_VFS_OPEN(conn,
                                   smb_fname,
                                   fsp,
                                   sharemode_lock->data->share_modes[0].flags,
-                                  mode);
+                                  0 /* mode */);
        if (fsp->fh->fd == -1) {
                /* ... */
-               return ...;
+               return NT_STATUS_UNSUCCESSFUL; // TODO ERROR CODE?
        }
 
        /* - release the sharemode lock: this writes the changes */
        talloc_free(sharemode_lock);
 
-       /* - update fsp pointer in smbXsrv_open */
 
-       op->;
+       /* Q: do this in fsp creation? */
+       op->fsp = fsp;
+       *_fsp = fsp;
 
        /*
         * - return
         *
         * ... think about seek()
         */
-       return NT_STATUS_NOT_IMPLEMENTED;
+       return NT_STATUS_OK;
 }
 
 struct smbd_smb2_create_state {
@@ -576,6 +603,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
        struct smb2_create_blobs out_context_blobs;
        int requested_oplock_level;
        bool do_durable_reconnect = false;
+       struct smbXsrv_open *op = NULL;
 
        ZERO_STRUCT(out_context_blobs);
 
@@ -757,7 +785,8 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
 
                if (dhnc) {
                        uint64_t persistent_id;
-                       struct smbXsrv_open *op = NULL;
+
+DEBUG(0, ("OBNOX - dhnc found (%s:%s)\n", __location__, __FUNCTION__));
 
                        if (dhnc->data.length != 16) {
                                tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
@@ -862,8 +891,8 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                                          smb1req->conn,
                                          smb1req->flags2 & FLAGS2_DFS_PATHNAMES,
                                          fname,
-                                         0,
-                                         NULL,
+                                         0,    /* unix_convert flags */
+                                         NULL, /* ppath_contains_wcards */
                                          &smb_fname);
                if (!NT_STATUS_IS_OK(status)) {
                        tevent_req_nterror(req, status);
@@ -878,20 +907,17 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                 */
                if (do_durable_reconnect) {
                        status = smb2_create_durable_reconnect(op,
-                                                              smb1req,
+                                                              smb1req->conn,
                                                               smb_fname,
                                                               mem_ctx,
                                                               &result);
 
+DEBUG(0, ("OBNOX - durable_reconnect result: %s (%s:%s)\n", nt_errstr(status), __location__, __FUNCTION__));
+
                        if (!NT_STATUS_IS_OK(status)) {
                                tevent_req_nterror(req, status);
                                return tevent_req_post(req, ev);
                        }
-
-                       // TODO: response construction
-
-                       tevent_req_done(req);
-                       return tevent_req_post(req, ev);
                } else {
                        status = SMB_VFS_CREATE_FILE(smb1req->conn,
                                                     smb1req,
@@ -947,7 +973,12 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                        }
                }
 
-               if (dhnq && BATCH_OPLOCK_TYPE(result->oplock_type)) {
+               /*
+                * windows createst a dhnc response blob upon dbnc request.
+                * this seems to contradict the documentation, though
+                * --> TODO:dochelp
+                */
+               if (dhnc || (dhnq && BATCH_OPLOCK_TYPE(result->oplock_type))) {
                        uint8_t p[8];
                        DATA_BLOB blob = data_blob_const(p, sizeof(p));