if (subreq == NULL) {
return smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY);
}
- tevent_req_set_callback(subreq, smbd_smb2_request_write_done, req);
+ //tevent_req_set_callback(subreq, smbd_smb2_request_write_done, req);
+ smbd_smb2_request_write_done(req);
+ return NT_STATUS_OK;
return smbd_smb2_request_pending_queue(req, subreq, 500);
}
static void smbd_smb2_request_write_done(struct tevent_req *subreq)
{
- struct smbd_smb2_request *req = tevent_req_callback_data(subreq,
- struct smbd_smb2_request);
+ struct smbd_smb2_request *req = subreq;//tevent_req_callback_data(subreq,
+ //struct smbd_smb2_request);
+ subreq = NULL;
DATA_BLOB outbody;
DATA_BLOB outdyn;
uint32_t out_count = 0;
uint64_t in_offset;
uint32_t out_count;
};
+static struct smbd_smb2_write_state _state;
static void smbd_smb2_write_pipe_done(struct tevent_req *subreq);
bool do_sync)
{
NTSTATUS status;
- struct smbd_smb2_write_state *state = tevent_req_data(req,
- struct smbd_smb2_write_state);
+ struct smbd_smb2_write_state *state = &_state;//tevent_req_data(req,
+ //struct smbd_smb2_write_state);
files_struct *fsp = state->fsp;
if (nwritten == -1) {
static bool smbd_smb2_write_cancel(struct tevent_req *req)
{
- struct smbd_smb2_write_state *state =
- tevent_req_data(req,
- struct smbd_smb2_write_state);
+ struct smbd_smb2_write_state *state = &_state;
+ //tevent_req_data(req,
+ //struct smbd_smb2_write_state);
return cancel_smb2_aio(state->smbreq);
}
uint32_t in_flags)
{
NTSTATUS status;
- struct tevent_req *req = NULL;
+ //struct tevent_req *req = NULL;
struct smbd_smb2_write_state *state = NULL;
struct smb_request *smbreq = NULL;
connection_struct *conn = smb2req->tcon->compat;
ssize_t nwritten;
struct lock_struct lock;
- req = tevent_req_create(mem_ctx, &state,
- struct smbd_smb2_write_state);
- if (req == NULL) {
- return NULL;
- }
+// req = tevent_req_create(mem_ctx, &state,
+// struct smbd_smb2_write_state);
+// if (req == NULL) {
+// return NULL;
+// }
+ ZERO_STRUCT(_state);
+ state = &_state;
state->smb2req = smb2req;
if (in_flags & SMB2_WRITEFLAG_WRITE_THROUGH) {
state->write_through = true;
fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
smbreq = smbd_smb2_fake_smb_request(smb2req);
- if (tevent_req_nomem(smbreq, req)) {
- return tevent_req_post(req, ev);
- }
+// if (tevent_req_nomem(smbreq, req)) {
+// return tevent_req_post(req, ev);
+// }
state->smbreq = smbreq;
state->fsp = fsp;
- if (IS_IPC(smbreq->conn)) {
- struct tevent_req *subreq = NULL;
-
- if (!fsp_is_np(fsp)) {
- tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
- return tevent_req_post(req, ev);
- }
-
- if (smbreq->unread_bytes > 0) {
- /*
- * Note: in_data.data is NULL in this case.
- */
- tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
- return tevent_req_post(req, ev);
- }
-
- subreq = np_write_send(state, ev,
- fsp->fake_file_handle,
- in_data.data,
- in_data.length);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(subreq,
- smbd_smb2_write_pipe_done,
- req);
- return req;
- }
-
- if (!CHECK_WRITE(fsp)) {
- tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
- return tevent_req_post(req, ev);
- }
+// if (IS_IPC(smbreq->conn)) {
+// struct tevent_req *subreq = NULL;
+//
+// if (!fsp_is_np(fsp)) {
+// tevent_req_nterror(req, NT_STATUS_FILE_CLOSED);
+// return tevent_req_post(req, ev);
+// }
+//
+// if (smbreq->unread_bytes > 0) {
+// /*
+// * Note: in_data.data is NULL in this case.
+// */
+// tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+// return tevent_req_post(req, ev);
+// }
+//
+// subreq = np_write_send(state, ev,
+// fsp->fake_file_handle,
+// in_data.data,
+// in_data.length);
+// if (tevent_req_nomem(subreq, req)) {
+// return tevent_req_post(req, ev);
+// }
+// tevent_req_set_callback(subreq,
+// smbd_smb2_write_pipe_done,
+// req);
+// return req;
+// }
+//
+// if (!CHECK_WRITE(fsp)) {
+// tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
+// return tevent_req_post(req, ev);
+// }
/* Try and do an asynchronous write. */
status = schedule_aio_smb2_write(conn,
in_offset,
in_data,
state->write_through);
-
- if (NT_STATUS_IS_OK(status)) {
- /*
- * Doing an async write, allow this
- * request to be canceled
- */
- tevent_req_set_cancel_fn(req, smbd_smb2_write_cancel);
- return req;
- }
-
- if (!NT_STATUS_EQUAL(status, NT_STATUS_RETRY)) {
- /* Real error in setting up aio. Fail. */
- tevent_req_nterror(req, status);
- return tevent_req_post(req, ev);
- }
+//
+// if (NT_STATUS_IS_OK(status)) {
+// /*
+// * Doing an async write, allow this
+// * request to be canceled
+// */
+// tevent_req_set_cancel_fn(req, smbd_smb2_write_cancel);
+// return req;
+// }
+//
+// if (!NT_STATUS_EQUAL(status, NT_STATUS_RETRY)) {
+// /* Real error in setting up aio. Fail. */
+// tevent_req_nterror(req, status);
+// return tevent_req_post(req, ev);
+// }
/* Fallback to synchronous. */
init_strict_lock_struct(fsp,
&lock);
if (!SMB_VFS_STRICT_LOCK(conn, fsp, &lock)) {
- tevent_req_nterror(req, NT_STATUS_FILE_LOCK_CONFLICT);
- return tevent_req_post(req, ev);
+// tevent_req_nterror(req, NT_STATUS_FILE_LOCK_CONFLICT);
+// return tevent_req_post(req, ev);
}
/*
in_offset,
in_data.length);
- status = smb2_write_complete(req, nwritten, errno);
+ status = smb2_write_complete(NULL, nwritten, errno);
SMB_VFS_STRICT_UNLOCK(conn, fsp, &lock);
(unsigned int)in_data.length,
(unsigned int)nwritten ));
- if (!NT_STATUS_IS_OK(status)) {
- tevent_req_nterror(req, status);
- } else {
- /* Success. */
- tevent_req_done(req);
- }
-
- return req;//tevent_req_post(req, ev);
+// if (!NT_STATUS_IS_OK(status)) {
+// tevent_req_nterror(req, status);
+// } else {
+// /* Success. */
+// tevent_req_done(req);
+// }
+return state;
+ //return req;//tevent_req_post(req, ev);
}
static void smbd_smb2_write_pipe_done(struct tevent_req *subreq)
uint32_t *out_count)
{
NTSTATUS status;
- struct smbd_smb2_write_state *state = tevent_req_data(req,
- struct smbd_smb2_write_state);
-
- if (tevent_req_is_nterror(req, &status)) {
- tevent_req_received(req);
- return status;
- }
-
+ struct smbd_smb2_write_state *state = &_state;//tevent_req_data(req,
+ // struct smbd_smb2_write_state);
+//
+// if (tevent_req_is_nterror(req, &status)) {
+// tevent_req_received(req);
+// return status;
+// }
+//
*out_count = state->out_count;
- tevent_req_received(req);
+// tevent_req_received(req);
+ ZERO_STRUCTP(state);
return NT_STATUS_OK;
}