Skip to content

Commit

Permalink
s3: client : Add extra return parameter to all client open calls.
Browse files Browse the repository at this point in the history
Add a return parameter of struct smb_create_returns *cr to
cli_ntcreate()
cli_ntcreate_recv()
cli_nttrans_create()
cli_nttrans_create_recv()

Always pass in NULL for now. This fixes the create
API to always fully return the data the server has
given back to us on the open file to the caller.

Signed-off-by: Jeremy Allison <[email protected]>
Reviewed-by: Stefan Metzmacher <[email protected]>
  • Loading branch information
jrasamba authored and metze-samba committed May 9, 2014
1 parent 2900dfa commit 69e24b4
Show file tree
Hide file tree
Showing 21 changed files with 136 additions and 112 deletions.
10 changes: 5 additions & 5 deletions source3/client/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -573,7 +573,7 @@ static NTSTATUS display_finfo(struct cli_state *cli_state, struct file_info *fin
status = cli_ntcreate(cli_state, afname, 0,
CREATE_ACCESS_READ, 0,
FILE_SHARE_READ|FILE_SHARE_WRITE,
FILE_OPEN, 0x0, 0x0, &fnum);
FILE_OPEN, 0x0, 0x0, &fnum, NULL);
if (!NT_STATUS_IS_OK(status)) {
DEBUG( 0, ("display_finfo() Failed to open %s: %s\n",
afname, nt_errstr(status)));
Expand Down Expand Up @@ -1772,7 +1772,7 @@ static int do_allinfo(const char *name)
SEC_STD_SYNCHRONIZE, 0,
FILE_SHARE_READ|FILE_SHARE_WRITE
|FILE_SHARE_DELETE,
FILE_OPEN, 0x0, 0x0, &fnum);
FILE_OPEN, 0x0, 0x0, &fnum, NULL);
if (!NT_STATUS_IS_OK(status)) {
/*
* Ignore failure, it does not hurt if we can't list
Expand Down Expand Up @@ -2496,12 +2496,12 @@ static int cmd_open(void)
status = cli_ntcreate(targetcli, targetname, 0,
FILE_READ_DATA|FILE_WRITE_DATA, 0,
FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN,
0x0, 0x0, &fnum);
0x0, 0x0, &fnum, NULL);
if (!NT_STATUS_IS_OK(status)) {
status = cli_ntcreate(targetcli, targetname, 0,
FILE_READ_DATA, 0,
FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN,
0x0, 0x0, &fnum);
0x0, 0x0, &fnum, NULL);
if (NT_STATUS_IS_OK(status)) {
d_printf("open file %s: for read/write fnum %d\n", targetname, fnum);
} else {
Expand Down Expand Up @@ -3943,7 +3943,7 @@ static int cmd_notify(void)
status = cli_ntcreate(
cli, name, 0, FILE_READ_DATA, 0,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
FILE_OPEN, 0, 0, &fnum);
FILE_OPEN, 0, 0, &fnum, NULL);
if (!NT_STATUS_IS_OK(status)) {
d_printf("Could not open file: %s\n", nt_errstr(status));
goto fail;
Expand Down
29 changes: 21 additions & 8 deletions source3/libsmb/clifile.c
Original file line number Diff line number Diff line change
Expand Up @@ -1795,6 +1795,7 @@ NTSTATUS cli_nt_delete_on_close(struct cli_state *cli, uint16_t fnum, bool flag)
struct cli_ntcreate_state {
uint16_t vwv[24];
uint16_t fnum;
struct smb_create_returns cr;
};

static void cli_ntcreate_done(struct tevent_req *subreq);
Expand Down Expand Up @@ -1887,10 +1888,13 @@ static void cli_ntcreate_done(struct tevent_req *subreq)
return;
}
state->fnum = SVAL(vwv+2, 1);
/* TODO - fill in state->cr.. */
tevent_req_done(req);
}

NTSTATUS cli_ntcreate_recv(struct tevent_req *req, uint16_t *pfnum)
NTSTATUS cli_ntcreate_recv(struct tevent_req *req,
uint16_t *pfnum,
struct smb_create_returns *cr)
{
struct cli_ntcreate_state *state = tevent_req_data(
req, struct cli_ntcreate_state);
Expand All @@ -1900,6 +1904,7 @@ NTSTATUS cli_ntcreate_recv(struct tevent_req *req, uint16_t *pfnum)
return status;
}
*pfnum = state->fnum;
/* TODO - fill in *cr.. */
return NT_STATUS_OK;
}

Expand All @@ -1912,7 +1917,8 @@ NTSTATUS cli_ntcreate(struct cli_state *cli,
uint32_t CreateDisposition,
uint32_t CreateOptions,
uint8_t SecurityFlags,
uint16_t *pfid)
uint16_t *pfid,
struct smb_create_returns *cr)
{
TALLOC_CTX *frame = NULL;
struct tevent_context *ev;
Expand All @@ -1929,7 +1935,7 @@ NTSTATUS cli_ntcreate(struct cli_state *cli,
CreateDisposition,
CreateOptions,
pfid,
NULL);
cr);
}

frame = talloc_stackframe();
Expand Down Expand Up @@ -1962,14 +1968,15 @@ NTSTATUS cli_ntcreate(struct cli_state *cli,
goto fail;
}

status = cli_ntcreate_recv(req, pfid);
status = cli_ntcreate_recv(req, pfid, cr);
fail:
TALLOC_FREE(frame);
return status;
}

struct cli_nttrans_create_state {
uint16_t fnum;
struct smb_create_returns cr;
};

static void cli_nttrans_create_done(struct tevent_req *subreq);
Expand Down Expand Up @@ -2083,11 +2090,14 @@ static void cli_nttrans_create_done(struct tevent_req *subreq)
return;
}
state->fnum = SVAL(param, 2);
/* TODO - fill in state->cr.. */
TALLOC_FREE(param);
tevent_req_done(req);
}

NTSTATUS cli_nttrans_create_recv(struct tevent_req *req, uint16_t *fnum)
NTSTATUS cli_nttrans_create_recv(struct tevent_req *req,
uint16_t *fnum,
struct smb_create_returns *cr)
{
struct cli_nttrans_create_state *state = tevent_req_data(
req, struct cli_nttrans_create_state);
Expand All @@ -2097,6 +2107,7 @@ NTSTATUS cli_nttrans_create_recv(struct tevent_req *req, uint16_t *fnum)
return status;
}
*fnum = state->fnum;
/* TODO - fill in *cr.. */
return NT_STATUS_OK;
}

Expand All @@ -2112,7 +2123,8 @@ NTSTATUS cli_nttrans_create(struct cli_state *cli,
struct security_descriptor *secdesc,
struct ea_struct *eas,
int num_eas,
uint16_t *pfid)
uint16_t *pfid,
struct smb_create_returns *cr)
{
TALLOC_CTX *frame = talloc_stackframe();
struct tevent_context *ev;
Expand Down Expand Up @@ -2141,7 +2153,7 @@ NTSTATUS cli_nttrans_create(struct cli_state *cli,
if (!tevent_req_poll_ntstatus(req, ev, &status)) {
goto fail;
}
status = cli_nttrans_create_recv(req, pfid);
status = cli_nttrans_create_recv(req, pfid, cr);
fail:
TALLOC_FREE(frame);
return status;
Expand Down Expand Up @@ -2433,7 +2445,8 @@ NTSTATUS cli_open(struct cli_state *cli, const char *fname, int flags,
create_disposition,
create_options,
0,
pfnum);
pfnum,
NULL);

/* Try and cope will all varients of "we don't do this call"
and fall back to openX. */
Expand Down
2 changes: 1 addition & 1 deletion source3/libsmb/cliquota.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ NTSTATUS cli_get_quota_handle(struct cli_state *cli, uint16_t *quota_fnum)
return cli_ntcreate(cli, FAKE_FILE_NAME_QUOTA_WIN32,
0x00000016, DESIRED_ACCESS_PIPE,
0x00000000, FILE_SHARE_READ|FILE_SHARE_WRITE,
FILE_OPEN, 0x00000000, 0x03, quota_fnum);
FILE_OPEN, 0x00000000, 0x03, quota_fnum, NULL);
}

void free_ntquota_list(SMB_NTQUOTA_LIST **qt_list)
Expand Down
4 changes: 2 additions & 2 deletions source3/libsmb/clisymlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ static void cli_symlink_create_done(struct tevent_req *subreq)
size_t data_len;
NTSTATUS status;

status = cli_ntcreate_recv(subreq, &state->fnum);
status = cli_ntcreate_recv(subreq, &state->fnum, NULL);
TALLOC_FREE(subreq);
if (tevent_req_nterror(req, status)) {
return;
Expand Down Expand Up @@ -275,7 +275,7 @@ static void cli_readlink_opened(struct tevent_req *subreq)
req, struct cli_readlink_state);
NTSTATUS status;

status = cli_ntcreate_recv(subreq, &state->fnum);
status = cli_ntcreate_recv(subreq, &state->fnum, NULL);
TALLOC_FREE(subreq);
if (tevent_req_nterror(req, status)) {
return;
Expand Down
6 changes: 3 additions & 3 deletions source3/libsmb/libsmb_xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -904,7 +904,7 @@ cacl_get(SMBCCTX *context,
status = cli_ntcreate(targetcli, targetpath, 0,
CREATE_ACCESS_READ, 0,
FILE_SHARE_READ|FILE_SHARE_WRITE,
FILE_OPEN, 0x0, 0x0, &fnum);
FILE_OPEN, 0x0, 0x0, &fnum, NULL);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(5, ("cacl_get failed to open %s: %s\n",
targetpath, nt_errstr(status)));
Expand Down Expand Up @@ -1563,7 +1563,7 @@ cacl_set(SMBCCTX *context,

status = cli_ntcreate(targetcli, targetpath, 0, CREATE_ACCESS_READ, 0,
FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN,
0x0, 0x0, &fnum);
0x0, 0x0, &fnum, NULL);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(5, ("cacl_set failed to open %s: %s\n",
targetpath, nt_errstr(status)));
Expand Down Expand Up @@ -1671,7 +1671,7 @@ cacl_set(SMBCCTX *context,
status = cli_ntcreate(targetcli, targetpath, 0,
WRITE_DAC_ACCESS | WRITE_OWNER_ACCESS, 0,
FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN,
0x0, 0x0, &fnum);
0x0, 0x0, &fnum, NULL);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(5, ("cacl_set failed to open %s: %s\n",
targetpath, nt_errstr(status)));
Expand Down
14 changes: 10 additions & 4 deletions source3/libsmb/proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,9 @@ struct tevent_req *cli_ntcreate_send(TALLOC_CTX *mem_ctx,
uint32_t CreateDisposition,
uint32_t CreateOptions,
uint8_t SecurityFlags);
NTSTATUS cli_ntcreate_recv(struct tevent_req *req, uint16_t *pfnum);
NTSTATUS cli_ntcreate_recv(struct tevent_req *req,
uint16_t *pfnum,
struct smb_create_returns *cr);
NTSTATUS cli_ntcreate(struct cli_state *cli,
const char *fname,
uint32_t CreatFlags,
Expand All @@ -366,7 +368,8 @@ NTSTATUS cli_ntcreate(struct cli_state *cli,
uint32_t CreateDisposition,
uint32_t CreateOptions,
uint8_t SecurityFlags,
uint16_t *pfid);
uint16_t *pfid,
struct smb_create_returns *cr);
uint8_t *smb_bytes_push_str(uint8_t *buf, bool ucs2, const char *str,
size_t str_len, size_t *pconverted_size);
uint8_t *smb_bytes_push_bytes(uint8_t *buf, uint8_t prefix,
Expand Down Expand Up @@ -600,7 +603,9 @@ struct tevent_req *cli_nttrans_create_send(TALLOC_CTX *mem_ctx,
struct security_descriptor *secdesc,
struct ea_struct *eas,
int num_eas);
NTSTATUS cli_nttrans_create_recv(struct tevent_req *req, uint16_t *fnum);
NTSTATUS cli_nttrans_create_recv(struct tevent_req *req,
uint16_t *fnum,
struct smb_create_returns *cr);
NTSTATUS cli_nttrans_create(struct cli_state *cli,
const char *fname,
uint32_t CreatFlags,
Expand All @@ -613,7 +618,8 @@ NTSTATUS cli_nttrans_create(struct cli_state *cli,
struct security_descriptor *secdesc,
struct ea_struct *eas,
int num_eas,
uint16_t *pfid);
uint16_t *pfid,
struct smb_create_returns *cr);

/* The following definitions come from libsmb/clifsinfo.c */

Expand Down
2 changes: 1 addition & 1 deletion source3/libsmb/pylibsmb.c
Original file line number Diff line number Diff line change
Expand Up @@ -610,7 +610,7 @@ static PyObject *py_cli_create(struct py_cli_state *self, PyObject *args,
if (!py_tevent_req_wait_exc(self->ev, req)) {
return NULL;
}
status = cli_ntcreate_recv(req, &fnum);
status = cli_ntcreate_recv(req, &fnum, NULL);
TALLOC_FREE(req);

if (!NT_STATUS_IS_OK(status)) {
Expand Down
2 changes: 1 addition & 1 deletion source3/torture/nbench.c
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ static void nbench_cmd_done(struct tevent_req *subreq)
switch (state->cmd->cmd) {
case NBENCH_CMD_NTCREATEX: {
struct ftable *ft;
status = cli_ntcreate_recv(subreq, &state->ft->fnum);
status = cli_ntcreate_recv(subreq, &state->ft->fnum, NULL);
TALLOC_FREE(subreq);
if (status_wrong(req, state->cmd->status, status)) {
return;
Expand Down
2 changes: 1 addition & 1 deletion source3/torture/nbio.c
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ void nb_createx(const char *fname,
0x0,
FILE_SHARE_READ|FILE_SHARE_WRITE,
create_disposition,
create_options, 0, &fd);
create_options, 0, &fd, NULL);
if (!NT_STATUS_IS_OK(status) && handle != -1) {
printf("ERROR: cli_ntcreate failed for %s - %s\n",
fname, nt_errstr(status));
Expand Down
2 changes: 1 addition & 1 deletion source3/torture/test_chain3.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ static void chain3_ntcreate_done(struct tevent_req *subreq)
req, struct chain3_state);
NTSTATUS status;

status = cli_ntcreate_recv(subreq, &state->fnum);
status = cli_ntcreate_recv(subreq, &state->fnum, NULL);
TALLOC_FREE(subreq);
printf("cli_ntcreate returned %s, fnum=%u\n", nt_errstr(status),
(unsigned)state->fnum);
Expand Down
14 changes: 7 additions & 7 deletions source3/torture/test_cleanup.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ bool run_cleanup1(int dummy)
FILE_GENERIC_READ|FILE_GENERIC_WRITE|DELETE_ACCESS,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
FILE_OPEN, FILE_DELETE_ON_CLOSE, 0, &fnum);
FILE_OPEN, FILE_DELETE_ON_CLOSE, 0, &fnum, NULL);
if (!NT_STATUS_IS_OK(status)) {
printf("2nd open of %s failed (%s)\n", fname,
nt_errstr(status));
Expand Down Expand Up @@ -89,7 +89,7 @@ bool run_cleanup2(int dummy)
cli1, fname, 0, FILE_GENERIC_READ|FILE_GENERIC_WRITE,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
FILE_OVERWRITE_IF, 0, 0, &fnum1);
FILE_OVERWRITE_IF, 0, 0, &fnum1, NULL);
if (!NT_STATUS_IS_OK(status)) {
printf("open of %s failed (%s)\n", fname, nt_errstr(status));
return false;
Expand All @@ -110,7 +110,7 @@ bool run_cleanup2(int dummy)
cli2, fname, 0, FILE_GENERIC_READ|FILE_GENERIC_WRITE,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
FILE_OPEN, 0, 0, &fnum2);
FILE_OPEN, 0, 0, &fnum2, NULL);
if (!NT_STATUS_IS_OK(status)) {
printf("open of %s failed (%s)\n", fname, nt_errstr(status));
return false;
Expand Down Expand Up @@ -144,7 +144,7 @@ bool run_cleanup2(int dummy)
cli2, fname, 0, FILE_GENERIC_READ|FILE_GENERIC_WRITE,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
FILE_OPEN, 0, 0, &fnum2);
FILE_OPEN, 0, 0, &fnum2, NULL);
if (!NT_STATUS_IS_OK(status)) {
printf("open of %s failed (%s)\n", fname, nt_errstr(status));
return false;
Expand Down Expand Up @@ -352,7 +352,7 @@ bool run_cleanup4(int dummy)
FILE_GENERIC_READ|DELETE_ACCESS,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ|FILE_SHARE_DELETE,
FILE_OVERWRITE_IF, 0, 0, &fnum1);
FILE_OVERWRITE_IF, 0, 0, &fnum1, NULL);
if (!NT_STATUS_IS_OK(status)) {
printf("creating file failed: %s\n",
nt_errstr(status));
Expand All @@ -364,7 +364,7 @@ bool run_cleanup4(int dummy)
FILE_GENERIC_READ|DELETE_ACCESS,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ|FILE_SHARE_DELETE,
FILE_OPEN, 0, 0, &fnum2);
FILE_OPEN, 0, 0, &fnum2, NULL);
if (!NT_STATUS_IS_OK(status)) {
printf("opening file 1st time failed: %s\n",
nt_errstr(status));
Expand All @@ -390,7 +390,7 @@ bool run_cleanup4(int dummy)
FILE_GENERIC_WRITE|DELETE_ACCESS,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
FILE_OPEN, 0, 0, &fnum2);
FILE_OPEN, 0, 0, &fnum2, NULL);
if (!NT_STATUS_EQUAL(status, NT_STATUS_SHARING_VIOLATION)) {
printf("opening file 2nd time returned: %s\n",
nt_errstr(status));
Expand Down
6 changes: 3 additions & 3 deletions source3/torture/test_notify.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ static void wait_for_one_notify_opened(struct tevent_req *subreq)
req, struct wait_for_one_notify_state);
NTSTATUS status;

status = cli_ntcreate_recv(subreq, &state->dnum);
status = cli_ntcreate_recv(subreq, &state->dnum, NULL);
TALLOC_FREE(subreq);
if (tevent_req_nterror(req, status)) {
return;
Expand Down Expand Up @@ -334,7 +334,7 @@ static void notify_bench3_mkdir1_done(struct tevent_req *subreq)
req, struct notify_bench3_state);
NTSTATUS status;

status = cli_ntcreate_recv(subreq, &state->dnum);
status = cli_ntcreate_recv(subreq, &state->dnum, NULL);
TALLOC_FREE(subreq);
if (tevent_req_nterror(req, status)) {
return;
Expand Down Expand Up @@ -471,7 +471,7 @@ static void notify_bench3_mksubdir_done(struct tevent_req *subreq)
req, struct notify_bench3_state);
NTSTATUS status;

status = cli_ntcreate_recv(subreq, &state->subdir_dnum);
status = cli_ntcreate_recv(subreq, &state->subdir_dnum, NULL);
TALLOC_FREE(subreq);
if (tevent_req_nterror(req, status)) {
return;
Expand Down
Loading

0 comments on commit 69e24b4

Please sign in to comment.