reach NT_STATUS_NOT_IMPLEMENTED
authorStefan Metzmacher <metze@samba.org>
Mon, 13 Feb 2012 10:12:39 +0000 (11:12 +0100)
committerStefan Metzmacher <metze@samba.org>
Thu, 10 May 2012 16:41:31 +0000 (18:41 +0200)
source3/locking/share_mode_lock.c
source3/smbd/close.c
source3/smbd/smb2_create.c
source3/smbd/smbXsrv_open.c
source3/smbd/smbXsrv_session.c

index de8cc3ce8bde1824030c36a1aeffdc204237880c..cd7fbb1c549d46ebdb9dea5e9a203888331c5389 100644 (file)
@@ -147,7 +147,7 @@ static struct share_mode_data *parse_share_modes(TALLOC_CTX *mem_ctx,
                DEBUG(10, ("parse_share_modes:\n"));
                NDR_PRINT_DEBUG(share_mode_data, d);
        }
-
+return d;
        /*
         * Ensure that each entry has a real process attached.
         */
index c87b1a000be41b4d022d6732390147e46e2182b6..1bde50abcd5d95771f882344785146d938371fc3 100644 (file)
@@ -679,6 +679,13 @@ static NTSTATUS close_normal_file(struct smb_request *req, files_struct *fsp,
                        status, map_nt_error_from_unix(ret));
        }
 
+       if (fsp->smbXsrv->global->durable) {
+               tmp = fd_close(fsp);
+               status = ntstatus_keeperror(status, tmp);
+               file_free(req, fsp);
+               return status;
+       }
+
        /*
         * If we're flushing on a close we can get a write
         * error here, we must remember this.
index e6bdbd66e42b8a70971932c4221e7baedae45b27..b74e411f3e296b71e1bb637a1de6caf1008d807a 100644 (file)
@@ -679,13 +679,12 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                        }
 
                        /* TODO: needed? or is successful global_lookup enough?) */
-#if 0
-                       if (!open->durable) {
+
+                       if (!global->durable) {
                                tevent_req_nterror(req,
                                        NT_STATUS_OBJECT_NAME_NOT_FOUND);
                                return tevent_req_post(req, ev);
                        }
-#endif
 
                        // TODO: implement this function..
                        status = smb2_create_durable_reconnect(global, mem_ctx, &result);
@@ -844,6 +843,15 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                        uint8_t p[8];
                        DATA_BLOB blob = data_blob_const(p, sizeof(p));
 
+                       result->smbXsrv->global->backend_file_id = result->file_id;
+                       result->smbXsrv->global->durable = true;
+
+                       status = smbXsrv_open_update(result->smbXsrv);
+                       if (!NT_STATUS_IS_OK(status)) {
+                               tevent_req_nterror(req, status);
+                               return tevent_req_post(req, ev);
+                       }
+
                        ZERO_STRUCT(p);
 
                        status = smb2_create_blob_add(state, &out_context_blobs,
index 55680606394a614f3378cba8323ac2f9ce0d606d..f8bd4871059aa5fecd092988cabb2512d6bf01e5 100644 (file)
@@ -395,11 +395,15 @@ static NTSTATUS smbXsrv_open_global_store(struct smbXsrv_connection *sconn,
        global_blob.seqnum += 1;
        global_blob.info.info0 = global;
 
+       DEBUG(0,("%s:%s:\n", __location__, __FUNCTION__));
+       NDR_PRINT_DEBUG(smbXsrv_open_globalB, &global_blob);
+
        ndr_err = ndr_push_struct_blob(&blob, global->db_rec, &global_blob,
                        (ndr_push_flags_fn_t)ndr_push_smbXsrv_open_globalB);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                //status = ndr_err_code;
                TALLOC_FREE(global->db_rec);
+               //status =  map...
                return status;
        }
 
@@ -415,7 +419,7 @@ static NTSTATUS smbXsrv_open_global_store(struct smbXsrv_connection *sconn,
 
 struct smbXsrv_open_global_fetch_state {
        TALLOC_CTX *mem_ctx;
-       struct smbXsrv_open_global *open;
+       struct smbXsrv_open_global0 *op;
        NTSTATUS status;
 };
 
@@ -424,8 +428,23 @@ static void smbXsrv_open_global_fetch_parser(TDB_DATA key, TDB_DATA data,
 {
        struct smbXsrv_open_global_fetch_state *state =
                (struct smbXsrv_open_global_fetch_state *)private_data;
+       DATA_BLOB blob = data_blob_const(data.dptr, data.dsize);
+       struct smbXsrv_open_globalB global_blob;
+       enum ndr_err_code ndr_err;
 
-       state->status = NT_STATUS_NOT_IMPLEMENTED;
+       ndr_err = ndr_pull_struct_blob(&blob, state->mem_ctx, &global_blob,
+                       (ndr_pull_flags_fn_t)ndr_pull_smbXsrv_open_globalB);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               //state->status = map;
+               return;
+       }
+
+       DEBUG(0,("%s:%s:\n", __location__, __FUNCTION__));
+       NDR_PRINT_DEBUG(smbXsrv_open_globalB, &global_blob);
+
+       state->op = global_blob.info.info0;
+
+       state->status = NT_STATUS_OK;
 }
 
 static NTSTATUS smbXsrv_open_global_lookup(struct smbXsrv_open_table *table,
@@ -435,7 +454,7 @@ static NTSTATUS smbXsrv_open_global_lookup(struct smbXsrv_open_table *table,
 {
        struct smbXsrv_open_global_fetch_state state = {
                .mem_ctx = mem_ctx,
-               .open = NULL,
+               .op = NULL,
                .status = NT_STATUS_INTERNAL_ERROR,
        };
        TDB_DATA key;
@@ -463,7 +482,8 @@ static NTSTATUS smbXsrv_open_global_lookup(struct smbXsrv_open_table *table,
                return state.status;
        }
 
-       *_open = state.open;
+       *_open = state.op;
+       DEBUG(0,("%s:%s:\n", __location__, __FUNCTION__));
        return NT_STATUS_OK;
 }
 
@@ -500,7 +520,7 @@ static int smbXsrv_open_destructor(struct smbXsrv_open *op)
 
        global_rec = op->global->db_rec;
        op->global->db_rec = NULL;
-       if (global_rec == NULL) {
+       if (global_rec == NULL && !op->global->durable) {
                uint8_t key_buf[sizeof(uint32_t)];
                TDB_DATA key;
 
@@ -603,6 +623,7 @@ NTSTATUS smbXsrv_open_create(struct smbXsrv_connection *conn,
                open_blob.version = 0;
                open_blob.info.info0 = op;
 
+               DEBUG(0,("%s:%s:\n", __location__, __FUNCTION__));
                NDR_PRINT_DEBUG(smbXsrv_openB, &open_blob);
        }
 
@@ -638,6 +659,17 @@ NTSTATUS smbXsrv_open_update(struct smbXsrv_open *op)
                return status;
        }
 
+       {
+               struct smbXsrv_openB open_blob;
+
+               ZERO_STRUCT(open_blob);
+               open_blob.version = 0;
+               open_blob.info.info0 = op;
+
+               DEBUG(0,("%s:%s:\n", __location__, __FUNCTION__));
+               NDR_PRINT_DEBUG(smbXsrv_openB, &open_blob);
+       }
+
        return NT_STATUS_OK;
 }
 
index 39bfd5283d2376e23a7acacd8efc8bd6e8d1751c..28aff00247d744a4acec80e5b9aae5aa5d831efd 100644 (file)
@@ -415,6 +415,7 @@ static NTSTATUS smbXsrv_session_global_store(struct smbXsrv_connection *sconn,
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                //status = ndr_err_code;
                TALLOC_FREE(global->db_rec);
+               //TODO status = map
                return status;
        }
 
@@ -702,6 +703,16 @@ NTSTATUS smbXsrv_session_update(struct smbXsrv_session *session)
                return status;
        }
 
+       {
+               struct smbXsrv_sessionB session_blob;
+
+               ZERO_STRUCT(session_blob);
+               session_blob.version = 0;
+               session_blob.info.info0 = session;
+
+               NDR_PRINT_DEBUG(smbXsrv_sessionB, &session_blob);
+       }
+
        return NT_STATUS_OK;
 }