[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Fri Mar 8 19:17:02 UTC 2019
The branch, master has been updated
via 7caf2cbdf11 libsmb: Use tevent_req_simple_finish_ntstatus
via 9a38dc0c1f7 libsmb: Add "in_cblobs" to cli_smb2_unlink
via 7fc3b2b2642 libsmb: Add "in_cblobs" to cli_smb2_rmdir
via 20ebd176859 libsmb: Make cli_smb2_unlink async
via 3873437ee06 libsmb: Simplify cli_smb2_mxac
from c71334ec0c9 lib:util: Move debug message for mkdir failing to log level 1
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 7caf2cbdf11029c7ed9d78338c797fb8c4fa46b3
Author: Volker Lendecke <vl at samba.org>
Date: Sat Mar 2 20:01:10 2019 +0100
libsmb: Use tevent_req_simple_finish_ntstatus
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Fri Mar 8 19:16:18 UTC 2019 on sn-devel-144
commit 9a38dc0c1f776ef21599f212dd5659676bf9c9fc
Author: Volker Lendecke <vl at samba.org>
Date: Mon Mar 4 20:40:14 2019 +0100
libsmb: Add "in_cblobs" to cli_smb2_unlink
This reveals the fact that unlink is an open/close in smb2 through the
API. This is not nice, but it's an internal API with currently only
one user. And it enables posix semantics for the open easily.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 7fc3b2b2642425cf9f55b4409cfb108a5a87e69e
Author: Volker Lendecke <vl at samba.org>
Date: Mon Mar 4 20:40:14 2019 +0100
libsmb: Add "in_cblobs" to cli_smb2_rmdir
This reveals the fact that rmdir is an open/close in smb2 through the
API. This is not nice, but it's an internal API with currently only
one user. And it enables posix semantics for the open easily.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 20ebd1768594fec757f4b0a5b56730c3f00226c0
Author: Volker Lendecke <vl at samba.org>
Date: Mon Mar 4 20:38:24 2019 +0100
libsmb: Make cli_smb2_unlink async
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 3873437ee0648e140cb0122c3122dc3839986105
Author: Volker Lendecke <vl at samba.org>
Date: Mon Mar 4 21:21:57 2019 +0100
libsmb: Simplify cli_smb2_mxac
smb2_create_blob_find() can search for a create blob for us
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
-----------------------------------------------------------------------
Summary of changes:
source3/libsmb/cli_smb2_fnum.c | 229 +++++++++++++++++++++++++++++++----------
source3/libsmb/cli_smb2_fnum.h | 27 +++--
source3/libsmb/clifile.c | 10 +-
3 files changed, 198 insertions(+), 68 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index 349d99b8eee..76eec6b3a0b 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -707,6 +707,7 @@ struct cli_smb2_rmdir_state {
struct tevent_context *ev;
struct cli_state *cli;
const char *dname;
+ const struct smb2_create_blobs *in_cblobs;
uint16_t fnum;
NTSTATUS status;
};
@@ -716,10 +717,12 @@ static void cli_smb2_rmdir_opened2(struct tevent_req *subreq);
static void cli_smb2_rmdir_disp_set(struct tevent_req *subreq);
static void cli_smb2_rmdir_closed(struct tevent_req *subreq);
-struct tevent_req *cli_smb2_rmdir_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct cli_state *cli,
- const char *dname)
+struct tevent_req *cli_smb2_rmdir_send(
+ TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct cli_state *cli,
+ const char *dname,
+ const struct smb2_create_blobs *in_cblobs)
{
struct tevent_req *req = NULL, *subreq = NULL;
struct cli_smb2_rmdir_state *state = NULL;
@@ -731,6 +734,7 @@ struct tevent_req *cli_smb2_rmdir_send(TALLOC_CTX *mem_ctx,
state->ev = ev;
state->cli = cli;
state->dname = dname;
+ state->in_cblobs = in_cblobs;
if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) {
tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
@@ -749,7 +753,7 @@ struct tevent_req *cli_smb2_rmdir_send(TALLOC_CTX *mem_ctx,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
FILE_DIRECTORY_FILE, /* create_options */
- NULL); /* in_cblobs */
+ state->in_cblobs); /* in_cblobs */
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
@@ -790,7 +794,7 @@ static void cli_smb2_rmdir_opened1(struct tevent_req *subreq)
FILE_DIRECTORY_FILE|
FILE_DELETE_ON_CLOSE|
FILE_OPEN_REPARSE_POINT, /* create_options */
- NULL); /* in_cblobs */
+ state->in_cblobs); /* in_cblobs */
if (tevent_req_nomem(subreq, req)) {
return;
}
@@ -873,7 +877,10 @@ NTSTATUS cli_smb2_rmdir_recv(struct tevent_req *req)
return state->status;
}
-NTSTATUS cli_smb2_rmdir(struct cli_state *cli, const char *dname)
+NTSTATUS cli_smb2_rmdir(
+ struct cli_state *cli,
+ const char *dname,
+ const struct smb2_create_blobs *in_cblobs)
{
TALLOC_CTX *frame = talloc_stackframe();
struct tevent_context *ev;
@@ -892,7 +899,7 @@ NTSTATUS cli_smb2_rmdir(struct cli_state *cli, const char *dname)
if (ev == NULL) {
goto fail;
}
- req = cli_smb2_rmdir_send(frame, ev, cli, dname);
+ req = cli_smb2_rmdir_send(frame, ev, cli, dname, in_cblobs);
if (req == NULL) {
goto fail;
}
@@ -912,36 +919,74 @@ fail:
Synchronous only.
***************************************************************/
-NTSTATUS cli_smb2_unlink(struct cli_state *cli, const char *fname)
+struct cli_smb2_unlink_state {
+ struct tevent_context *ev;
+ struct cli_state *cli;
+ const char *fname;
+ const struct smb2_create_blobs *in_cblobs;
+};
+
+static void cli_smb2_unlink_opened1(struct tevent_req *subreq);
+static void cli_smb2_unlink_opened2(struct tevent_req *subreq);
+static void cli_smb2_unlink_closed(struct tevent_req *subreq);
+
+struct tevent_req *cli_smb2_unlink_send(
+ TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct cli_state *cli,
+ const char *fname,
+ const struct smb2_create_blobs *in_cblobs)
{
- NTSTATUS status;
- uint16_t fnum;
+ struct tevent_req *req = NULL, *subreq = NULL;
+ struct cli_smb2_unlink_state *state = NULL;
- if (smbXcli_conn_has_async_calls(cli->conn)) {
- /*
- * Can't use sync call while an async call is in flight
- */
- return NT_STATUS_INVALID_PARAMETER;
+ req = tevent_req_create(mem_ctx, &state, struct cli_smb2_unlink_state);
+ if (req == NULL) {
+ return NULL;
}
+ state->ev = ev;
+ state->cli = cli;
+ state->fname = fname;
+ state->in_cblobs = in_cblobs;
if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) {
- return NT_STATUS_INVALID_PARAMETER;
+ tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+ return tevent_req_post(req, ev);
}
- status = cli_smb2_create_fnum(cli,
- fname,
- 0, /* create_flags */
- SMB2_IMPERSONATION_IMPERSONATION,
- DELETE_ACCESS, /* desired_access */
- FILE_ATTRIBUTE_NORMAL, /* file attributes */
- FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access */
- FILE_OPEN, /* create_disposition */
- FILE_DELETE_ON_CLOSE, /* create_options */
- NULL,
- &fnum,
- NULL,
- NULL,
- NULL);
+ subreq = cli_smb2_create_fnum_send(
+ state, /* mem_ctx */
+ state->ev, /* tevent_context */
+ state->cli, /* cli_struct */
+ state->fname, /* filename */
+ 0, /* create_flags */
+ SMB2_IMPERSONATION_IMPERSONATION,
+ DELETE_ACCESS, /* desired_access */
+ FILE_ATTRIBUTE_NORMAL, /* file attributes */
+ FILE_SHARE_READ|
+ FILE_SHARE_WRITE|
+ FILE_SHARE_DELETE, /* share_access */
+ FILE_OPEN, /* create_disposition */
+ FILE_DELETE_ON_CLOSE, /* create_options */
+ state->in_cblobs); /* in_cblobs */
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, cli_smb2_unlink_opened1, req);
+ return req;
+}
+
+static void cli_smb2_unlink_opened1(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ struct cli_smb2_unlink_state *state = tevent_req_data(
+ req, struct cli_smb2_unlink_state);
+ uint16_t fnum;
+ NTSTATUS status;
+
+ status = cli_smb2_create_fnum_recv(subreq, &fnum, NULL, NULL, NULL);
+ TALLOC_FREE(subreq);
if (NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
/*
@@ -950,27 +995,108 @@ NTSTATUS cli_smb2_unlink(struct cli_state *cli, const char *fname)
* component and try again. Eventually we will have to
* deal with the returned path unprocessed component. JRA.
*/
- status = cli_smb2_create_fnum(cli,
- fname,
+ subreq = cli_smb2_create_fnum_send(
+ state, /* mem_ctx */
+ state->ev, /* tevent_context */
+ state->cli, /* cli_struct */
+ state->fname, /* filename */
0, /* create_flags */
SMB2_IMPERSONATION_IMPERSONATION,
DELETE_ACCESS, /* desired_access */
FILE_ATTRIBUTE_NORMAL, /* file attributes */
- FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access */
+ FILE_SHARE_READ|
+ FILE_SHARE_WRITE|
+ FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
FILE_DELETE_ON_CLOSE|
- FILE_OPEN_REPARSE_POINT, /* create_options */
- NULL,
- &fnum,
- NULL,
- NULL,
- NULL);
+ FILE_OPEN_REPARSE_POINT, /* create_options */
+ state->in_cblobs); /* in_cblobs */
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, cli_smb2_unlink_opened2, req);
+ return;
}
- if (!NT_STATUS_IS_OK(status)) {
- return status;
+ if (tevent_req_nterror(req, status)) {
+ return;
}
- return cli_smb2_close_fnum(cli, fnum);
+
+ subreq = cli_smb2_close_fnum_send(state, state->ev, state->cli, fnum);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, cli_smb2_unlink_closed, req);
+}
+
+static void cli_smb2_unlink_opened2(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ struct cli_smb2_unlink_state *state = tevent_req_data(
+ req, struct cli_smb2_unlink_state);
+ uint16_t fnum;
+ NTSTATUS status;
+
+ status = cli_smb2_create_fnum_recv(subreq, &fnum, NULL, NULL, NULL);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ subreq = cli_smb2_close_fnum_send(state, state->ev, state->cli, fnum);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, cli_smb2_unlink_closed, req);
+}
+
+static void cli_smb2_unlink_closed(struct tevent_req *subreq)
+{
+ NTSTATUS status = cli_smb2_close_fnum_recv(subreq);
+ tevent_req_simple_finish_ntstatus(subreq, status);
+}
+
+NTSTATUS cli_smb2_unlink_recv(struct tevent_req *req)
+{
+ return tevent_req_simple_recv_ntstatus(req);
+}
+
+NTSTATUS cli_smb2_unlink(
+ struct cli_state *cli,
+ const char *fname,
+ const struct smb2_create_blobs *in_cblobs)
+{
+ TALLOC_CTX *frame = talloc_stackframe();
+ struct tevent_context *ev;
+ struct tevent_req *req;
+ NTSTATUS status = NT_STATUS_NO_MEMORY;
+ bool ok;
+
+ if (smbXcli_conn_has_async_calls(cli->conn)) {
+ /*
+ * Can't use sync call while an async call is in flight
+ */
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto fail;
+ }
+ ev = samba_tevent_context_init(frame);
+ if (ev == NULL) {
+ goto fail;
+ }
+ req = cli_smb2_unlink_send(frame, ev, cli, fname, in_cblobs);
+ if (req == NULL) {
+ goto fail;
+ }
+ ok = tevent_req_poll_ntstatus(req, ev, &status);
+ if (!ok) {
+ goto fail;
+ }
+ status = cli_smb2_unlink_recv(req);
+fail:
+ cli->raw_status = status;
+ TALLOC_FREE(frame);
+ return status;
}
/***************************************************************
@@ -2852,9 +2978,8 @@ static void cli_smb2_mxac_opened(struct tevent_req *subreq)
struct cli_smb2_mxac_state *state = tevent_req_data(
req, struct cli_smb2_mxac_state);
struct smb2_create_blobs out_cblobs = {0};
- DATA_BLOB *mxac_blob = NULL;
+ struct smb2_create_blob *mxac_blob = NULL;
NTSTATUS status;
- int i;
status = cli_smb2_create_fnum_recv(
subreq, &state->fnum, NULL, state, &out_cblobs);
@@ -2864,24 +2989,18 @@ static void cli_smb2_mxac_opened(struct tevent_req *subreq)
return;
}
- for (i = 0; i < out_cblobs.num_blobs; i++) {
- if (strcmp(out_cblobs.blobs[i].tag, SMB2_CREATE_TAG_MXAC) != 0) {
- continue;
- }
- mxac_blob = &out_cblobs.blobs[i].data;
- break;
- }
+ mxac_blob = smb2_create_blob_find(&out_cblobs, SMB2_CREATE_TAG_MXAC);
if (mxac_blob == NULL) {
state->status = NT_STATUS_INVALID_NETWORK_RESPONSE;
goto close;
}
- if (mxac_blob->length != 8) {
+ if (mxac_blob->data.length != 8) {
state->status = NT_STATUS_INVALID_NETWORK_RESPONSE;
goto close;
}
- state->status = NT_STATUS(IVAL(mxac_blob->data, 0));
- state->mxac = IVAL(mxac_blob->data, 4);
+ state->status = NT_STATUS(IVAL(mxac_blob->data.data, 0));
+ state->mxac = IVAL(mxac_blob->data.data, 4);
close:
subreq = cli_smb2_close_fnum_send(
diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h
index c4ca069ee96..c39c8e90983 100644
--- a/source3/libsmb/cli_smb2_fnum.h
+++ b/source3/libsmb/cli_smb2_fnum.h
@@ -74,13 +74,28 @@ struct tevent_req *cli_smb2_delete_on_close_send(TALLOC_CTX *mem_ctx,
NTSTATUS cli_smb2_delete_on_close_recv(struct tevent_req *req);
NTSTATUS cli_smb2_delete_on_close(struct cli_state *cli, uint16_t fnum, bool flag);
NTSTATUS cli_smb2_mkdir(struct cli_state *cli, const char *dirname);
-struct tevent_req *cli_smb2_rmdir_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct cli_state *cli,
- const char *dname);
+struct tevent_req *cli_smb2_rmdir_send(
+ TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct cli_state *cli,
+ const char *dname,
+ const struct smb2_create_blobs *in_cblobs);
NTSTATUS cli_smb2_rmdir_recv(struct tevent_req *req);
-NTSTATUS cli_smb2_rmdir(struct cli_state *cli, const char *dirname);
-NTSTATUS cli_smb2_unlink(struct cli_state *cli,const char *fname);
+NTSTATUS cli_smb2_rmdir(
+ struct cli_state *cli,
+ const char *dname,
+ const struct smb2_create_blobs *in_cblobs);
+struct tevent_req *cli_smb2_unlink_send(
+ TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct cli_state *cli,
+ const char *fname,
+ const struct smb2_create_blobs *in_cblobs);
+NTSTATUS cli_smb2_unlink_recv(struct tevent_req *req);
+NTSTATUS cli_smb2_unlink(
+ struct cli_state *cli,
+ const char *fname,
+ const struct smb2_create_blobs *in_cblobs);
NTSTATUS cli_smb2_list(struct cli_state *cli,
const char *pathname,
uint16_t attribute,
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
index 49e58c0d252..d648b495fc6 100644
--- a/source3/libsmb/clifile.c
+++ b/source3/libsmb/clifile.c
@@ -1528,7 +1528,7 @@ NTSTATUS cli_unlink(struct cli_state *cli, const char *fname, uint16_t mayhave_a
NTSTATUS status = NT_STATUS_OK;
if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
- return cli_smb2_unlink(cli, fname);
+ return cli_smb2_unlink(cli, fname, NULL);
}
frame = talloc_stackframe();
@@ -1758,7 +1758,7 @@ NTSTATUS cli_rmdir(struct cli_state *cli, const char *dname)
NTSTATUS status = NT_STATUS_OK;
if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
- return cli_smb2_rmdir(cli, dname);
+ return cli_smb2_rmdir(cli, dname, NULL);
}
frame = talloc_stackframe();
@@ -5294,11 +5294,7 @@ static void cli_posix_open_done(struct tevent_req *subreq)
NTSTATUS status;
status = cli_posix_open_internal_recv(subreq, &state->fnum);
- TALLOC_FREE(subreq);
- if (tevent_req_nterror(req, status)) {
- return;
- }
- tevent_req_done(req);
+ tevent_req_simple_finish_ntstatus(subreq, status);
}
NTSTATUS cli_posix_open_recv(struct tevent_req *req, uint16_t *pfnum)
--
Samba Shared Repository
More information about the samba-cvs
mailing list