smb2 durable reconnect attempts -- it compiles :-o --- INCOMPLETE
authorMichael Adam <obnox@samba.org>
Fri, 17 Feb 2012 17:18:14 +0000 (18:18 +0100)
committerStefan Metzmacher <metze@samba.org>
Thu, 10 May 2012 16:41:49 +0000 (18:41 +0200)
source3/smbd/smb2_create.c

index f71d34f7604557377b77a9c9a2f1e86f1b04f9df..bb2d00ad5a460b001061d4ab4be3e0394ad6d040 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,27 @@ 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;
 
        /* 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 +506,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 +523,35 @@ 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,
+       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 +599,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 +781,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
 
                if (dhnc) {
                        uint64_t persistent_id;
-                       struct smbXsrv_open *op = NULL;
 
                        if (dhnc->data.length != 16) {
                                tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
@@ -878,7 +901,7 @@ 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);