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

Reply via email to