1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-08 21:18:16 +03:00

libsmb: add in/out cblobs to cli_smb2_create_fnum

This is driven by the imminent smb2 unix extensions, we'll want to make use of
it from source3/libsmb.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
Volker Lendecke 2019-02-20 17:23:46 +01:00 committed by Jeremy Allison
parent 56e08d3996
commit 02f4080284
4 changed files with 122 additions and 24 deletions

View File

@ -159,7 +159,8 @@ static void cli_ll_create(fuse_req_t freq, fuse_ino_t parent, const char *name,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
FILE_CREATE,
FILE_NON_DIRECTORY_FILE);
FILE_NON_DIRECTORY_FILE,
NULL);
if (req == NULL) {
TALLOC_FREE(state);
fuse_reply_err(freq, ENOMEM);
@ -177,7 +178,7 @@ static void cli_ll_create_done(struct tevent_req *req)
uint16_t fnum;
NTSTATUS status;
status = cli_smb2_create_fnum_recv(req, &fnum, NULL);
status = cli_smb2_create_fnum_recv(req, &fnum, NULL, NULL, NULL);
TALLOC_FREE(req);
if (!NT_STATUS_IS_OK(status)) {
fuse_reply_err(state->freq, map_errno_from_nt_status(status));
@ -851,7 +852,8 @@ static void cli_ll_open(fuse_req_t freq, fuse_ino_t ino,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
FILE_OPEN,
FILE_NON_DIRECTORY_FILE);
FILE_NON_DIRECTORY_FILE,
NULL);
if (req == NULL) {
TALLOC_FREE(state);
fuse_reply_err(freq, ENOMEM);
@ -867,7 +869,7 @@ static void cli_ll_open_done(struct tevent_req *req)
uint16_t fnum;
NTSTATUS status;
status = cli_smb2_create_fnum_recv(req, &fnum, NULL);
status = cli_smb2_create_fnum_recv(req, &fnum, NULL, NULL, NULL);
TALLOC_FREE(req);
if (!NT_STATUS_IS_OK(status)) {
fuse_reply_err(state->freq, map_errno_from_nt_status(status));

View File

@ -158,7 +158,8 @@ static uint8_t flags_to_smb2_oplock(uint32_t create_flags)
struct cli_smb2_create_fnum_state {
struct cli_state *cli;
struct smb2_create_blobs cblobs;
struct smb2_create_blobs in_cblobs;
struct smb2_create_blobs out_cblobs;
struct smb_create_returns cr;
uint16_t fnum;
struct tevent_req *subreq;
@ -178,7 +179,8 @@ struct tevent_req *cli_smb2_create_fnum_send(
uint32_t file_attributes,
uint32_t share_access,
uint32_t create_disposition,
uint32_t create_options)
uint32_t create_options,
const struct smb2_create_blobs *in_cblobs)
{
struct tevent_req *req, *subreq;
struct cli_smb2_create_fnum_state *state;
@ -186,6 +188,7 @@ struct tevent_req *cli_smb2_create_fnum_send(
const char *startp = NULL;
const char *endp = NULL;
time_t tstamp = (time_t)0;
NTSTATUS status;
req = tevent_req_create(mem_ctx, &state,
struct cli_smb2_create_fnum_state);
@ -210,7 +213,6 @@ struct tevent_req *cli_smb2_create_fnum_send(
size_t len_after_gmt = fname + fname_len - endp;
DATA_BLOB twrp_blob;
NTTIME ntt;
NTSTATUS status;
char *new_fname = talloc_array(state, char,
len_before_gmt + len_after_gmt + 1);
@ -229,7 +231,7 @@ struct tevent_req *cli_smb2_create_fnum_send(
status = smb2_create_blob_add(
state,
&state->cblobs,
&state->in_cblobs,
SMB2_CREATE_TAG_TWRP,
twrp_blob);
if (!NT_STATUS_IS_OK(status)) {
@ -238,6 +240,19 @@ struct tevent_req *cli_smb2_create_fnum_send(
}
}
if (in_cblobs != NULL) {
uint32_t i;
for (i=0; i<in_cblobs->num_blobs; i++) {
struct smb2_create_blob *b = &in_cblobs->blobs[i];
status = smb2_create_blob_add(
state, &state->in_cblobs, b->tag, b->data);
if (!NT_STATUS_IS_OK(status)) {
tevent_req_nterror(req, status);
return tevent_req_post(req, ev);
}
}
}
/* SMB2 is pickier about pathnames. Ensure it doesn't
start in a '\' */
if (*fname == '\\') {
@ -268,7 +283,7 @@ struct tevent_req *cli_smb2_create_fnum_send(
share_access,
create_disposition,
create_options,
&state->cblobs);
&state->in_cblobs);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
@ -289,8 +304,12 @@ static void cli_smb2_create_fnum_done(struct tevent_req *subreq)
struct smb2_hnd h;
NTSTATUS status;
status = smb2cli_create_recv(subreq, &h.fid_persistent,
&h.fid_volatile, &state->cr, NULL, NULL);
status = smb2cli_create_recv(
subreq,
&h.fid_persistent,
&h.fid_volatile, &state->cr,
state,
&state->out_cblobs);
TALLOC_FREE(subreq);
if (tevent_req_nterror(req, status)) {
return;
@ -310,8 +329,12 @@ static bool cli_smb2_create_fnum_cancel(struct tevent_req *req)
return tevent_req_cancel(state->subreq);
}
NTSTATUS cli_smb2_create_fnum_recv(struct tevent_req *req, uint16_t *pfnum,
struct smb_create_returns *cr)
NTSTATUS cli_smb2_create_fnum_recv(
struct tevent_req *req,
uint16_t *pfnum,
struct smb_create_returns *cr,
TALLOC_CTX *mem_ctx,
struct smb2_create_blobs *out_cblobs)
{
struct cli_smb2_create_fnum_state *state = tevent_req_data(
req, struct cli_smb2_create_fnum_state);
@ -327,6 +350,13 @@ NTSTATUS cli_smb2_create_fnum_recv(struct tevent_req *req, uint16_t *pfnum,
if (cr != NULL) {
*cr = state->cr;
}
if (out_cblobs != NULL) {
*out_cblobs = (struct smb2_create_blobs) {
.num_blobs = state->out_cblobs.num_blobs,
.blobs = talloc_move(
mem_ctx, &state->out_cblobs.blobs),
};
}
state->cli->raw_status = NT_STATUS_OK;
return NT_STATUS_OK;
}
@ -341,8 +371,11 @@ NTSTATUS cli_smb2_create_fnum(
uint32_t share_access,
uint32_t create_disposition,
uint32_t create_options,
const struct smb2_create_blobs *in_cblobs,
uint16_t *pfid,
struct smb_create_returns *cr)
struct smb_create_returns *cr,
TALLOC_CTX *mem_ctx,
struct smb2_create_blobs *out_cblobs)
{
TALLOC_CTX *frame = talloc_stackframe();
struct tevent_context *ev;
@ -371,14 +404,15 @@ NTSTATUS cli_smb2_create_fnum(
file_attributes,
share_access,
create_disposition,
create_options);
create_options,
in_cblobs);
if (req == NULL) {
goto fail;
}
if (!tevent_req_poll_ntstatus(req, ev, &status)) {
goto fail;
}
status = cli_smb2_create_fnum_recv(req, pfid, cr);
status = cli_smb2_create_fnum_recv(req, pfid, cr, mem_ctx, out_cblobs);
fail:
TALLOC_FREE(frame);
return status;
@ -657,7 +691,10 @@ NTSTATUS cli_smb2_mkdir(struct cli_state *cli, const char *dname)
FILE_SHARE_READ|FILE_SHARE_WRITE, /* share_access */
FILE_CREATE, /* create_disposition */
FILE_DIRECTORY_FILE, /* create_options */
NULL,
&fnum,
NULL,
NULL,
NULL);
if (!NT_STATUS_IS_OK(status)) {
@ -696,7 +733,10 @@ NTSTATUS cli_smb2_rmdir(struct cli_state *cli, const char *dname)
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
FILE_DIRECTORY_FILE, /* create_options */
NULL,
&fnum,
NULL,
NULL,
NULL);
if (NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
@ -717,7 +757,10 @@ NTSTATUS cli_smb2_rmdir(struct cli_state *cli, const char *dname)
FILE_DIRECTORY_FILE|
FILE_DELETE_ON_CLOSE|
FILE_OPEN_REPARSE_POINT, /* create_options */
NULL,
&fnum,
NULL,
NULL,
NULL);
}
@ -764,7 +807,10 @@ NTSTATUS cli_smb2_unlink(struct cli_state *cli, const char *fname)
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);
if (NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
@ -784,7 +830,10 @@ NTSTATUS cli_smb2_unlink(struct cli_state *cli, const char *fname)
FILE_OPEN, /* create_disposition */
FILE_DELETE_ON_CLOSE|
FILE_OPEN_REPARSE_POINT, /* create_options */
NULL,
&fnum,
NULL,
NULL,
NULL);
}
@ -965,7 +1014,10 @@ NTSTATUS cli_smb2_list(struct cli_state *cli,
FILE_SHARE_READ|FILE_SHARE_WRITE, /* share_access */
FILE_OPEN, /* create_disposition */
FILE_DIRECTORY_FILE, /* create_options */
NULL,
&fnum,
NULL,
NULL,
NULL);
if (!NT_STATUS_IS_OK(status)) {
@ -1152,8 +1204,11 @@ NTSTATUS cli_smb2_qpathinfo_basic(struct cli_state *cli,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
FILE_DIRECTORY_FILE, /* create_options */
NULL,
&fnum,
&cr);
&cr,
NULL,
NULL);
if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_A_DIRECTORY)) {
/* Maybe a file ? */
@ -1166,8 +1221,11 @@ NTSTATUS cli_smb2_qpathinfo_basic(struct cli_state *cli,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
0, /* create_options */
NULL,
&fnum,
&cr);
&cr,
NULL,
NULL);
}
if (!NT_STATUS_IS_OK(status)) {
@ -1219,7 +1277,10 @@ NTSTATUS cli_smb2_chkpath(struct cli_state *cli,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
FILE_DIRECTORY_FILE, /* create_options */
NULL,
&fnum,
NULL,
NULL,
NULL);
if (!NT_STATUS_IS_OK(status)) {
@ -1265,7 +1326,10 @@ static NTSTATUS get_fnum_from_path(struct cli_state *cli,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
create_options,
NULL,
pfnum,
NULL,
NULL,
NULL);
if (NT_STATUS_EQUAL(status, NT_STATUS_STOPPED_ON_SYMLINK)) {
@ -1285,7 +1349,10 @@ static NTSTATUS get_fnum_from_path(struct cli_state *cli,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
create_options,
NULL,
pfnum,
NULL,
NULL,
NULL);
}
@ -1300,7 +1367,10 @@ static NTSTATUS get_fnum_from_path(struct cli_state *cli,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
FILE_DIRECTORY_FILE, /* create_options */
NULL,
pfnum,
NULL,
NULL,
NULL);
}
@ -2036,7 +2106,10 @@ NTSTATUS cli_smb2_dskattr(struct cli_state *cli, const char *path,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
FILE_DIRECTORY_FILE, /* create_options */
NULL,
&fnum,
NULL,
NULL,
NULL);
if (!NT_STATUS_IS_OK(status)) {
@ -2147,7 +2220,10 @@ NTSTATUS cli_smb2_get_fs_full_size_info(struct cli_state *cli,
FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
FILE_DIRECTORY_FILE, /* create_options */
NULL,
&fnum,
NULL,
NULL,
NULL);
if (!NT_STATUS_IS_OK(status)) {
@ -2240,7 +2316,10 @@ NTSTATUS cli_smb2_get_fs_attr_info(struct cli_state *cli, uint32_t *fs_attr)
FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
FILE_DIRECTORY_FILE, /* create_options */
NULL,
&fnum,
NULL,
NULL,
NULL);
if (!NT_STATUS_IS_OK(status)) {
@ -2326,7 +2405,10 @@ NTSTATUS cli_smb2_get_fs_volume_info(struct cli_state *cli,
FILE_SHARE_DELETE, /* share_access */
FILE_OPEN, /* create_disposition */
FILE_DIRECTORY_FILE, /* create_options */
NULL,
&fnum,
NULL,
NULL,
NULL);
if (!NT_STATUS_IS_OK(status)) {

View File

@ -36,9 +36,14 @@ struct tevent_req *cli_smb2_create_fnum_send(
uint32_t file_attributes,
uint32_t share_access,
uint32_t create_disposition,
uint32_t create_options);
NTSTATUS cli_smb2_create_fnum_recv(struct tevent_req *req, uint16_t *pfnum,
struct smb_create_returns *cr);
uint32_t create_options,
const struct smb2_create_blobs *in_cblobs);
NTSTATUS cli_smb2_create_fnum_recv(
struct tevent_req *req,
uint16_t *pfnum,
struct smb_create_returns *cr,
TALLOC_CTX *mem_ctx,
struct smb2_create_blobs *out_cblobs);
NTSTATUS cli_smb2_create_fnum(
struct cli_state *cli,
const char *fname,
@ -49,8 +54,11 @@ NTSTATUS cli_smb2_create_fnum(
uint32_t share_access,
uint32_t create_disposition,
uint32_t create_options,
const struct smb2_create_blobs *in_cblobs,
uint16_t *pfid,
struct smb_create_returns *cr);
struct smb_create_returns *cr,
TALLOC_CTX *mem_ctx,
struct smb2_create_blobs *out_cblobs);
struct tevent_req *cli_smb2_close_fnum_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,

View File

@ -2125,7 +2125,8 @@ struct tevent_req *cli_ntcreate_send(TALLOC_CTX *mem_ctx,
file_attributes,
share_access,
create_disposition,
create_options);
create_options,
NULL);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
@ -2171,7 +2172,12 @@ static void cli_ntcreate_done_smb2(struct tevent_req *subreq)
req, struct cli_ntcreate_state);
NTSTATUS status;
status = cli_smb2_create_fnum_recv(subreq, &state->fnum, &state->cr);
status = cli_smb2_create_fnum_recv(
subreq,
&state->fnum,
&state->cr,
NULL,
NULL);
TALLOC_FREE(subreq);
if (tevent_req_nterror(req, status)) {
return;