The branch, master has been updated via 6be10cb Revert fac5c654e2fe17c2c11d150b16088e8a51f6be20 via c8a1082 Move the callers that need to use the new cli_open() back to calling it from cli_openx(). via b44cfdf Add cli_open() back as a synchronous wrapper function the calls NtCreateX followed by openX() if NtCreateX is unsupported. via 4e709dc Rename cli_open -> cli_openx. Prelude to replacing generic cli_open() with a call that uses NTCreateX in preference to OpenAndX. from c326b37 s4 dns: Test SOA queries
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 6be10cb7613d03c3b216a3d43a71622f769f7b05 Author: Jeremy Allison <j...@samba.org> Date: Sat Dec 3 21:44:14 2011 -0800 Revert fac5c654e2fe17c2c11d150b16088e8a51f6be20 s3: Add a fallback for missing open&x support in OS/X Lion This is now done inside the synchronous cli_open() wrapper function. Autobuild-User: Jeremy Allison <j...@samba.org> Autobuild-Date: Sun Dec 4 08:19:31 CET 2011 on sn-devel-104 commit c8a1082f2b4912647d8a28362c7fb3302bdce5c2 Author: Jeremy Allison <j...@samba.org> Date: Sat Dec 3 21:36:47 2011 -0800 Move the callers that need to use the new cli_open() back to calling it from cli_openx(). commit b44cfdf163d5dc0d408a4d2d27854ebfa1e783e5 Author: Jeremy Allison <j...@samba.org> Date: Sat Dec 3 21:31:32 2011 -0800 Add cli_open() back as a synchronous wrapper function the calls NtCreateX followed by openX() if NtCreateX is unsupported. commit 4e709dc42fff464191f21dfa150a18a072d48569 Author: Jeremy Allison <j...@samba.org> Date: Sat Dec 3 21:13:08 2011 -0800 Rename cli_open -> cli_openx. Prelude to replacing generic cli_open() with a call that uses NTCreateX in preference to OpenAndX. ----------------------------------------------------------------------- Summary of changes: source3/client/client.c | 121 +--------------- source3/client/client_proto.h | 2 - source3/client/clitar.c | 4 +- source3/libgpo/gpo_filesync.c | 2 +- source3/libsmb/clifile.c | 236 ++++++++++++++++++++----------- source3/libsmb/proto.h | 7 +- source3/torture/denytest.c | 12 +- source3/torture/locktest.c | 4 +- source3/torture/locktest2.c | 2 +- source3/torture/mangle_test.c | 4 +- source3/torture/masktest.c | 2 +- source3/torture/scanner.c | 8 +- source3/torture/test_case_insensitive.c | 4 +- source3/torture/torture.c | 174 +++++++++++----------- source3/torture/utable.c | 2 +- 15 files changed, 267 insertions(+), 317 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/client/client.c b/source3/client/client.c index b355917..47d4470 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -301,121 +301,6 @@ static void send_message(const char *username) } /**************************************************************************** - Wrapper function around cli_open() that does an NtCreateX open by preference. -****************************************************************************/ - -NTSTATUS smbclient_cli_open(struct cli_state *cli, const char *fname, int flags, - int share_mode_in, uint16_t *pfnum) -{ - NTSTATUS status; - unsigned int openfn = 0; - unsigned int dos_deny = 0; - uint32_t access_mask, share_mode, create_disposition, create_options; - - /* Do the initial mapping into OpenX parameters. */ - if (flags & O_CREAT) { - openfn |= (1<<4); - } - if (!(flags & O_EXCL)) { - if (flags & O_TRUNC) - openfn |= (1<<1); - else - openfn |= (1<<0); - } - - dos_deny = (share_mode_in<<4); - - if ((flags & O_ACCMODE) == O_RDWR) { - dos_deny |= 2; - } else if ((flags & O_ACCMODE) == O_WRONLY) { - dos_deny |= 1; - } - -#if defined(O_SYNC) - if ((flags & O_SYNC) == O_SYNC) { - dos_deny |= (1<<14); - } -#endif /* O_SYNC */ - - if (share_mode_in == DENY_FCB) { - dos_deny = 0xFF; - } - -#if 0 - /* Hmmm. This is what I think the above code - should look like if it's using the constants - we #define. JRA. */ - - if (flags & O_CREAT) { - openfn |= OPENX_FILE_CREATE_IF_NOT_EXIST; - } - if (!(flags & O_EXCL)) { - if (flags & O_TRUNC) - openfn |= OPENX_FILE_EXISTS_TRUNCATE; - else - openfn |= OPENX_FILE_EXISTS_OPEN; - } - - dos_deny = SET_DENY_MODE(share_mode_in); - - if ((flags & O_ACCMODE) == O_RDWR) { - dos_deny |= DOS_OPEN_RDWR; - } else if ((flags & O_ACCMODE) == O_WRONLY) { - dos_deny |= DOS_OPEN_WRONLY; - } - -#if defined(O_SYNC) - if ((flags & O_SYNC) == O_SYNC) { - dos_deny |= FILE_SYNC_OPENMODE; - } -#endif /* O_SYNC */ - - if (share_mode_in == DENY_FCB) { - dos_deny = 0xFF; - } -#endif - - if (!map_open_params_to_ntcreate(fname, dos_deny, - openfn, &access_mask, - &share_mode, &create_disposition, - &create_options, NULL)) { - goto try_openx; - } - - status = cli_ntcreate(cli, - fname, - 0, - access_mask, - 0, - share_mode, - create_disposition, - create_options, - 0, - pfnum); - - /* Try and cope will all varients of "we don't do this call" - and fall back to openX. */ - - if (NT_STATUS_EQUAL(status,NT_STATUS_NOT_IMPLEMENTED) || - NT_STATUS_EQUAL(status,NT_STATUS_INVALID_INFO_CLASS) || - NT_STATUS_EQUAL(status,NT_STATUS_PROCEDURE_NOT_FOUND) || - NT_STATUS_EQUAL(status,NT_STATUS_INVALID_LEVEL) || - NT_STATUS_EQUAL(status,NT_STATUS_INVALID_PARAMETER) || - NT_STATUS_EQUAL(status,NT_STATUS_INVALID_DEVICE_REQUEST) || - NT_STATUS_EQUAL(status,NT_STATUS_INVALID_DEVICE_STATE) || - NT_STATUS_EQUAL(status,NT_STATUS_CTL_FILE_NOT_SUPPORTED) || - NT_STATUS_EQUAL(status,NT_STATUS_UNSUCCESSFUL)) { - goto try_openx; - } - - return status; - - try_openx: - - return cli_open(cli, fname, flags, share_mode_in, pfnum); -} - -/**************************************************************************** Check the space on a device. ****************************************************************************/ @@ -1212,7 +1097,7 @@ static int do_get(const char *rname, const char *lname_in, bool reget) clock_gettime_mono(&tp_start); - status = smbclient_cli_open(targetcli, targetname, O_RDONLY, DENY_NONE, &fnum); + status = cli_open(targetcli, targetname, O_RDONLY, DENY_NONE, &fnum); if (!NT_STATUS_IS_OK(status)) { d_printf("%s opening remote file %s\n", nt_errstr(status), rname); @@ -1971,7 +1856,7 @@ static int do_put(const char *rname, const char *lname, bool reput) clock_gettime_mono(&tp_start); if (reput) { - status = smbclient_cli_open(targetcli, targetname, O_RDWR|O_CREAT, DENY_NONE, &fnum); + status = cli_open(targetcli, targetname, O_RDWR|O_CREAT, DENY_NONE, &fnum); if (NT_STATUS_IS_OK(status)) { if (!NT_STATUS_IS_OK(status = cli_qfileinfo_basic( targetcli, fnum, NULL, @@ -1986,7 +1871,7 @@ static int do_put(const char *rname, const char *lname, bool reput) } } } else { - status = smbclient_cli_open(targetcli, targetname, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE, &fnum); + status = cli_open(targetcli, targetname, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE, &fnum); } if (!NT_STATUS_IS_OK(status)) { diff --git a/source3/client/client_proto.h b/source3/client/client_proto.h index 3032e5b..d119014 100644 --- a/source3/client/client_proto.h +++ b/source3/client/client_proto.h @@ -30,8 +30,6 @@ struct file_info; const char *client_get_cur_dir(void); const char *client_set_cur_dir(const char *newdir); -NTSTATUS smbclient_cli_open(struct cli_state *cli, const char *fname, int flags, - int share_mode_in, uint16_t *pfnum); NTSTATUS do_list(const char *mask, uint16 attribute, NTSTATUS (*fn)(struct cli_state *cli_state, struct file_info *, diff --git a/source3/client/clitar.c b/source3/client/clitar.c index d8890ea..5943926 100644 --- a/source3/client/clitar.c +++ b/source3/client/clitar.c @@ -655,7 +655,7 @@ static NTSTATUS do_atar(const char *rname_in, char *lname, goto cleanup; } - status = smbclient_cli_open(cli, rname, O_RDONLY, DENY_NONE, &fnum); + status = cli_open(cli, rname, O_RDONLY, DENY_NONE, &fnum); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("%s opening remote file %s (%s)\n", nt_errstr(status),rname, client_get_cur_dir())); @@ -1016,7 +1016,7 @@ static int get_file(file_info2 finfo) return False; } - status = smbclient_cli_open(cli, finfo.name, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE, &fnum); + status = cli_open(cli, finfo.name, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE, &fnum); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("abandoning restore\n")); return False; diff --git a/source3/libgpo/gpo_filesync.c b/source3/libgpo/gpo_filesync.c index ead9261..7f0e410 100644 --- a/source3/libgpo/gpo_filesync.c +++ b/source3/libgpo/gpo_filesync.c @@ -50,7 +50,7 @@ NTSTATUS gpo_copy_file(TALLOC_CTX *mem_ctx, int read_size = io_bufsize; off_t nread = 0; - result = cli_open(cli, nt_path, O_RDONLY, DENY_NONE, &fnum); + result = cli_openx(cli, nt_path, O_RDONLY, DENY_NONE, &fnum); if (!NT_STATUS_IS_OK(result)) { goto out; } diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index ec83956..168dd4b 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -2111,84 +2111,81 @@ NTSTATUS cli_nttrans_create(struct cli_state *cli, WARNING: if you open with O_WRONLY then getattrE won't work! ****************************************************************************/ -struct cli_open_state { - struct tevent_context *ev; - struct cli_state *cli; +struct cli_openx_state { const char *fname; uint16_t vwv[15]; uint16_t fnum; - unsigned openfn; - unsigned dos_deny; - uint8_t additional_flags; struct iovec bytes; }; -static void cli_open_done(struct tevent_req *subreq); -static void cli_open_ntcreate_done(struct tevent_req *subreq); +static void cli_openx_done(struct tevent_req *subreq); -struct tevent_req *cli_open_create(TALLOC_CTX *mem_ctx, +struct tevent_req *cli_openx_create(TALLOC_CTX *mem_ctx, struct event_context *ev, struct cli_state *cli, const char *fname, int flags, int share_mode, struct tevent_req **psmbreq) { struct tevent_req *req, *subreq; - struct cli_open_state *state; + struct cli_openx_state *state; + unsigned openfn; + unsigned accessmode; + uint8_t additional_flags; uint8_t *bytes; - req = tevent_req_create(mem_ctx, &state, struct cli_open_state); + req = tevent_req_create(mem_ctx, &state, struct cli_openx_state); if (req == NULL) { return NULL; } - state->ev = ev; - state->cli = cli; - state->fname = fname; + openfn = 0; if (flags & O_CREAT) { - state->openfn |= (1<<4); + openfn |= (1<<4); } if (!(flags & O_EXCL)) { if (flags & O_TRUNC) - state->openfn |= (1<<1); + openfn |= (1<<1); else - state->openfn |= (1<<0); + openfn |= (1<<0); } - state->dos_deny = (share_mode<<4); + accessmode = (share_mode<<4); if ((flags & O_ACCMODE) == O_RDWR) { - state->dos_deny |= 2; + accessmode |= 2; } else if ((flags & O_ACCMODE) == O_WRONLY) { - state->dos_deny |= 1; + accessmode |= 1; } #if defined(O_SYNC) if ((flags & O_SYNC) == O_SYNC) { - state->dos_deny |= (1<<14); + accessmode |= (1<<14); } #endif /* O_SYNC */ if (share_mode == DENY_FCB) { - state->dos_deny = 0xFF; + accessmode = 0xFF; } SCVAL(state->vwv + 0, 0, 0xFF); SCVAL(state->vwv + 0, 1, 0); SSVAL(state->vwv + 1, 0, 0); SSVAL(state->vwv + 2, 0, 0); /* no additional info */ - SSVAL(state->vwv + 3, 0, state->dos_deny); + SSVAL(state->vwv + 3, 0, accessmode); SSVAL(state->vwv + 4, 0, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN); SSVAL(state->vwv + 5, 0, 0); SIVAL(state->vwv + 6, 0, 0); - SSVAL(state->vwv + 8, 0, state->openfn); + SSVAL(state->vwv + 8, 0, openfn); SIVAL(state->vwv + 9, 0, 0); SIVAL(state->vwv + 11, 0, 0); SIVAL(state->vwv + 13, 0, 0); + additional_flags = 0; + if (cli->use_oplocks) { /* if using oplocks then ask for a batch oplock via core and extended methods */ - state->additional_flags = + additional_flags = FLAG_REQUEST_OPLOCK|FLAG_REQUEST_BATCH_OPLOCK; SSVAL(state->vwv+2, 0, SVAL(state->vwv+2, 0) | 6); } @@ -2204,26 +2201,25 @@ struct tevent_req *cli_open_create(TALLOC_CTX *mem_ctx, state->bytes.iov_base = (void *)bytes; state->bytes.iov_len = talloc_get_size(bytes); - subreq = cli_smb_req_create(state, ev, cli, SMBopenX, - state->additional_flags, + subreq = cli_smb_req_create(state, ev, cli, SMBopenX, additional_flags, 15, state->vwv, 1, &state->bytes); if (subreq == NULL) { TALLOC_FREE(req); return NULL; } - tevent_req_set_callback(subreq, cli_open_done, req); + tevent_req_set_callback(subreq, cli_openx_done, req); *psmbreq = subreq; return req; } -struct tevent_req *cli_open_send(TALLOC_CTX *mem_ctx, struct event_context *ev, +struct tevent_req *cli_openx_send(TALLOC_CTX *mem_ctx, struct event_context *ev, struct cli_state *cli, const char *fname, int flags, int share_mode) { struct tevent_req *req, *subreq; NTSTATUS status; - req = cli_open_create(mem_ctx, ev, cli, fname, flags, share_mode, + req = cli_openx_create(mem_ctx, ev, cli, fname, flags, share_mode, &subreq); if (req == NULL) { return NULL; @@ -2236,76 +2232,31 @@ struct tevent_req *cli_open_send(TALLOC_CTX *mem_ctx, struct event_context *ev, return req; } -static void cli_open_done(struct tevent_req *subreq) +static void cli_openx_done(struct tevent_req *subreq) { struct tevent_req *req = tevent_req_callback_data( subreq, struct tevent_req); - struct cli_open_state *state = tevent_req_data( - req, struct cli_open_state); + struct cli_openx_state *state = tevent_req_data( + req, struct cli_openx_state); uint8_t wct; uint16_t *vwv; uint8_t *inbuf; NTSTATUS status; - uint32_t access_mask, share_mode, create_disposition, create_options; status = cli_smb_recv(subreq, state, &inbuf, 3, &wct, &vwv, NULL, NULL); TALLOC_FREE(subreq); - - if (NT_STATUS_IS_OK(status)) { - state->fnum = SVAL(vwv+2, 0); - tevent_req_done(req); - return; - } - - if (!NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) { - tevent_req_nterror(req, status); - return; - } - - /* - * For the new shiny OS/X Lion SMB server, try a ntcreate - * fallback. - */ - - if (!map_open_params_to_ntcreate(state->fname, state->dos_deny, - state->openfn, &access_mask, - &share_mode, &create_disposition, - &create_options, NULL)) { - tevent_req_nterror(req, NT_STATUS_NOT_SUPPORTED); - return; - } - - subreq = cli_ntcreate_send(state, state->ev, state->cli, - state->fname, 0, access_mask, - 0, share_mode, create_disposition, - create_options, 0); - if (tevent_req_nomem(subreq, req)) { - return; - } - tevent_req_set_callback(subreq, cli_open_ntcreate_done, req); -} - -static void cli_open_ntcreate_done(struct tevent_req *subreq) -{ - struct tevent_req *req = tevent_req_callback_data( - subreq, struct tevent_req); - struct cli_open_state *state = tevent_req_data( - req, struct cli_open_state); - NTSTATUS status; - - status = cli_ntcreate_recv(subreq, &state->fnum); - TALLOC_FREE(subreq); if (tevent_req_nterror(req, status)) { return; } + state->fnum = SVAL(vwv+2, 0); tevent_req_done(req); } -NTSTATUS cli_open_recv(struct tevent_req *req, uint16_t *pfnum) +NTSTATUS cli_openx_recv(struct tevent_req *req, uint16_t *pfnum) { - struct cli_open_state *state = tevent_req_data( - req, struct cli_open_state); + struct cli_openx_state *state = tevent_req_data( + req, struct cli_openx_state); NTSTATUS status; if (tevent_req_is_nterror(req, &status)) { @@ -2315,7 +2266,7 @@ NTSTATUS cli_open_recv(struct tevent_req *req, uint16_t *pfnum) return NT_STATUS_OK; } -NTSTATUS cli_open(struct cli_state *cli, const char *fname, int flags, +NTSTATUS cli_openx(struct cli_state *cli, const char *fname, int flags, int share_mode, uint16_t *pfnum) { TALLOC_CTX *frame = talloc_stackframe(); @@ -2337,7 +2288,7 @@ NTSTATUS cli_open(struct cli_state *cli, const char *fname, int flags, goto fail; } - req = cli_open_send(frame, ev, cli, fname, flags, share_mode); + req = cli_openx_send(frame, ev, cli, fname, flags, share_mode); if (req == NULL) { status = NT_STATUS_NO_MEMORY; goto fail; @@ -2348,11 +2299,126 @@ NTSTATUS cli_open(struct cli_state *cli, const char *fname, int flags, goto fail; } - status = cli_open_recv(req, pfnum); + status = cli_openx_recv(req, pfnum); fail: TALLOC_FREE(frame); return status; } +/**************************************************************************** + Synchronous wrapper function that does an NtCreateX open by preference + and falls back to openX if this fails. +****************************************************************************/ + +NTSTATUS cli_open(struct cli_state *cli, const char *fname, int flags, + int share_mode_in, uint16_t *pfnum) +{ + NTSTATUS status; + unsigned int openfn = 0; + unsigned int dos_deny = 0; + uint32_t access_mask, share_mode, create_disposition, create_options; + + /* Do the initial mapping into OpenX parameters. */ + if (flags & O_CREAT) { + openfn |= (1<<4); + } + if (!(flags & O_EXCL)) { + if (flags & O_TRUNC) + openfn |= (1<<1); + else + openfn |= (1<<0); + } + + dos_deny = (share_mode_in<<4); + + if ((flags & O_ACCMODE) == O_RDWR) { + dos_deny |= 2; + } else if ((flags & O_ACCMODE) == O_WRONLY) { + dos_deny |= 1; + } + +#if defined(O_SYNC) + if ((flags & O_SYNC) == O_SYNC) { + dos_deny |= (1<<14); + } +#endif /* O_SYNC */ + + if (share_mode_in == DENY_FCB) { + dos_deny = 0xFF; + } + +#if 0 + /* Hmmm. This is what I think the above code + should look like if it's using the constants -- Samba Shared Repository