The branch, master has been updated
       via  6ce3643 s3: tests: smbclient test to ensure we can create and see a 
:foobar stream on the top level directory in a share.
       via  74fd4f9 s3: smbd: Fix opening/creating :stream files on the root 
share directory.
       via  94e7e70 s3: smbd: Remove unused parameter from build_stream_path().
       via  a47012d s3: smbclient: Move cmd_setmode out of clitar.c and back 
into client.c
      from  ea53e86 tdb: Add tdbdump -u

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6ce3643e45bac6660ae69123738c4b39d7bc1864
Author: Jeremy Allison <j...@samba.org>
Date:   Wed Sep 16 16:12:15 2015 -0700

    s3: tests: smbclient test to ensure we can create and see a :foobar stream 
on the top level directory in a share.
    
    Regression test for:
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11522
    
    Remember to remove the ARCHIVE attribute from the toplevel
    share when done (can only be done over SMB2+).
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>
    
    Autobuild-User(master): Ralph Böhme <s...@samba.org>
    Autobuild-Date(master): Fri Sep 18 11:00:44 CEST 2015 on sn-devel-104

commit 74fd4f93efe92516fc507edf71a588660782879e
Author: Jeremy Allison <j...@samba.org>
Date:   Wed Sep 16 12:03:34 2015 -0700

    s3: smbd: Fix opening/creating :stream files on the root share directory.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11522
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 94e7e707783036b57babc73d320d2a3d8c0648d6
Author: Jeremy Allison <j...@samba.org>
Date:   Wed Sep 16 12:42:46 2015 -0700

    s3: smbd: Remove unused parameter from build_stream_path().
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit a47012d5429044c9a3616718bac21360f281aa81
Author: Jeremy Allison <j...@samba.org>
Date:   Thu Sep 17 15:54:40 2015 -0700

    s3: smbclient: Move cmd_setmode out of clitar.c and back into client.c
    
    setmode <file> attribute is a valid smbclient command even if libarchive
    isn't on the system and tarmode isn't compiled in.
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/client/client.c                   | 118 +++++++++++++++++++++++++++
 source3/client/client_proto.h             |   6 ++
 source3/client/clitar.c                   | 129 ------------------------------
 source3/script/tests/test_smbclient_s3.sh |  36 +++++++++
 source3/smbd/filename.c                   |  27 ++++++-
 5 files changed, 184 insertions(+), 132 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/client/client.c b/source3/client/client.c
index f49f3ff..034b48a 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -4656,6 +4656,124 @@ static int cmd_show_connect( void )
        return 0;
 }
 
+/**
+ * set_remote_attr - set DOS attributes of a remote file
+ * @filename: path to the file name
+ * @new_attr: attribute bit mask to use
+ * @mode: one of ATTR_SET or ATTR_UNSET
+ *
+ * Update the file attributes with the one provided.
+ */
+int set_remote_attr(const char *filename, uint16_t new_attr, int mode)
+{
+       extern struct cli_state *cli;
+       uint16_t old_attr;
+       NTSTATUS status;
+
+       status = cli_getatr(cli, filename, &old_attr, NULL, NULL);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_printf("cli_getatr failed: %s\n", nt_errstr(status));
+               return 1;
+       }
+
+       if (mode == ATTR_SET) {
+               new_attr |= old_attr;
+       } else {
+               new_attr = old_attr & ~new_attr;
+       }
+
+       status = cli_setatr(cli, filename, new_attr, 0);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_printf("cli_setatr failed: %s\n", nt_errstr(status));
+               return 1;
+       }
+
+       return 0;
+}
+
+/**
+ * cmd_setmode - interactive command to set DOS attributes
+ *
+ * Read a filename and mode from the client command line and update
+ * the file DOS attributes.
+ */
+int cmd_setmode(void)
+{
+       const extern char *cmd_ptr;
+       char *buf;
+       char *fname = NULL;
+       uint16_t attr[2] = {0};
+       int mode = ATTR_SET;
+       int err = 0;
+       bool ok;
+       TALLOC_CTX *ctx = talloc_new(NULL);
+       if (ctx == NULL) {
+               return 1;
+       }
+
+       ok = next_token_talloc(ctx, &cmd_ptr, &buf, NULL);
+       if (!ok) {
+               d_printf("setmode <filename> <[+|-]rsha>\n");
+               err = 1;
+               goto out;
+       }
+
+       fname = talloc_asprintf(ctx,
+                               "%s%s",
+                               client_get_cur_dir(),
+                               buf);
+       if (fname == NULL) {
+               err = 1;
+               goto out;
+       }
+
+       while (next_token_talloc(ctx, &cmd_ptr, &buf, NULL)) {
+               const char *s = buf;
+
+               while (*s) {
+                       switch (*s++) {
+                       case '+':
+                               mode = ATTR_SET;
+                               break;
+                       case '-':
+                               mode = ATTR_UNSET;
+                               break;
+                       case 'r':
+                               attr[mode] |= FILE_ATTRIBUTE_READONLY;
+                               break;
+                       case 'h':
+                               attr[mode] |= FILE_ATTRIBUTE_HIDDEN;
+                               break;
+                       case 's':
+                               attr[mode] |= FILE_ATTRIBUTE_SYSTEM;
+                               break;
+                       case 'a':
+                               attr[mode] |= FILE_ATTRIBUTE_ARCHIVE;
+                               break;
+                       default:
+                               d_printf("setmode <filename> 
<perm=[+|-]rsha>\n");
+                               err = 1;
+                               goto out;
+                       }
+               }
+       }
+
+       if (attr[ATTR_SET] == 0 && attr[ATTR_UNSET] == 0) {
+               d_printf("setmode <filename> <[+|-]rsha>\n");
+               err = 1;
+               goto out;
+       }
+
+       DEBUG(2, ("perm set %d %d\n", attr[ATTR_SET], attr[ATTR_UNSET]));
+
+       /* ignore return value: server might not store DOS attributes */
+       set_remote_attr(fname, attr[ATTR_SET], ATTR_SET);
+       set_remote_attr(fname, attr[ATTR_UNSET], ATTR_UNSET);
+out:
+       talloc_free(ctx);
+       return err;
+}
+
 /****************************************************************************
  iosize command
 ***************************************************************************/
diff --git a/source3/client/client_proto.h b/source3/client/client_proto.h
index 86f1d18..d3d4036 100644
--- a/source3/client/client_proto.h
+++ b/source3/client/client_proto.h
@@ -26,6 +26,11 @@
 struct cli_state;
 struct file_info;
 
+enum {
+        ATTR_UNSET,
+        ATTR_SET,
+};
+
 /* The following definitions come from client/client.c  */
 
 const char *client_get_cur_dir(void);
@@ -36,6 +41,7 @@ NTSTATUS do_list(const char *mask,
                                   const char *dir),
                        bool rec,
                        bool dirs);
+int set_remote_attr(const char *filename, uint16_t new_attr, int mode);
 int cmd_iosize(void);
 
 /* The following definitions come from client/dnsbrowse.c  */
diff --git a/source3/client/clitar.c b/source3/client/clitar.c
index 5561845..7eb3fa0 100644
--- a/source3/client/clitar.c
+++ b/source3/client/clitar.c
@@ -121,11 +121,6 @@ enum tar_selection {
        TAR_EXCLUDE,       /* X flag */
 };
 
-enum {
-       ATTR_UNSET,
-       ATTR_SET,
-};
-
 struct tar {
        TALLOC_CTX *talloc_ctx;
 
@@ -216,7 +211,6 @@ static int make_remote_path(const char *full_path);
 static int max_token (const char *str);
 static NTSTATUS is_subpath(const char *sub, const char *full,
                           bool *_subpath_match);
-static int set_remote_attr(const char *filename, uint16_t new_attr, int mode);
 
 /**
  * tar_get_ctx - retrieve global tar context handle
@@ -383,88 +377,6 @@ out:
        return err;
 }
 
-/**
- * cmd_setmode - interactive command to set DOS attributes
- *
- * Read a filename and mode from the client command line and update
- * the file DOS attributes.
- */
-int cmd_setmode(void)
-{
-       const extern char *cmd_ptr;
-       char *buf;
-       char *fname = NULL;
-       uint16_t attr[2] = {0};
-       int mode = ATTR_SET;
-       int err = 0;
-       bool ok;
-       TALLOC_CTX *ctx = talloc_new(NULL);
-       if (ctx == NULL) {
-               return 1;
-       }
-
-       ok = next_token_talloc(ctx, &cmd_ptr, &buf, NULL);
-       if (!ok) {
-               DBG(0, ("setmode <filename> <[+|-]rsha>\n"));
-               err = 1;
-               goto out;
-       }
-
-       fname = talloc_asprintf(ctx,
-                               "%s%s",
-                               client_get_cur_dir(),
-                               buf);
-       if (fname == NULL) {
-               err = 1;
-               goto out;
-       }
-
-       while (next_token_talloc(ctx, &cmd_ptr, &buf, NULL)) {
-               const char *s = buf;
-
-               while (*s) {
-                       switch (*s++) {
-                       case '+':
-                               mode = ATTR_SET;
-                               break;
-                       case '-':
-                               mode = ATTR_UNSET;
-                               break;
-                       case 'r':
-                               attr[mode] |= FILE_ATTRIBUTE_READONLY;
-                               break;
-                       case 'h':
-                               attr[mode] |= FILE_ATTRIBUTE_HIDDEN;
-                               break;
-                       case 's':
-                               attr[mode] |= FILE_ATTRIBUTE_SYSTEM;
-                               break;
-                       case 'a':
-                               attr[mode] |= FILE_ATTRIBUTE_ARCHIVE;
-                               break;
-                       default:
-                               DBG(0, ("setmode <filename> 
<perm=[+|-]rsha>\n"));
-                               err = 1;
-                               goto out;
-                       }
-               }
-       }
-
-       if (attr[ATTR_SET] == 0 && attr[ATTR_UNSET] == 0) {
-               DBG(0, ("setmode <filename> <[+|-]rsha>\n"));
-               err = 1;
-               goto out;
-       }
-
-       DBG(2, ("perm set %d %d\n", attr[ATTR_SET], attr[ATTR_UNSET]));
-
-       /* ignore return value: server might not store DOS attributes */
-       set_remote_attr(fname, attr[ATTR_SET], ATTR_SET);
-       set_remote_attr(fname, attr[ATTR_UNSET], ATTR_UNSET);
-out:
-       talloc_free(ctx);
-       return err;
-}
 
 /**
  * tar_parse_args - parse and set tar command line arguments
@@ -1631,41 +1543,6 @@ out:
        return status;
 }
 
-/**
- * set_remote_attr - set DOS attributes of a remote file
- * @filename: path to the file name
- * @new_attr: attribute bit mask to use
- * @mode: one of ATTR_SET or ATTR_UNSET
- *
- * Update the file attributes with the one provided.
- */
-static int set_remote_attr(const char *filename, uint16_t new_attr, int mode)
-{
-       extern struct cli_state *cli;
-       uint16_t old_attr;
-       NTSTATUS status;
-
-       status = cli_getatr(cli, filename, &old_attr, NULL, NULL);
-       if (!NT_STATUS_IS_OK(status)) {
-               DBG(0, ("cli_getatr failed: %s\n", nt_errstr(status)));
-               return 1;
-       }
-
-       if (mode == ATTR_SET) {
-               new_attr |= old_attr;
-       } else {
-               new_attr = old_attr & ~new_attr;
-       }
-
-       status = cli_setatr(cli, filename, new_attr, 0);
-       if (!NT_STATUS_IS_OK(status)) {
-               DBG(1, ("cli_setatr failed: %s\n", nt_errstr(status)));
-               return 1;
-       }
-
-       return 0;
-}
-
 
 /**
  * make_remote_path - recursively make remote dirs
@@ -1932,12 +1809,6 @@ int cmd_tarmode(void)
        return 1;
 }
 
-int cmd_setmode(void)
-{
-       NOT_IMPLEMENTED;
-       return 1;
-}
-
 int cmd_tar(void)
 {
        NOT_IMPLEMENTED;
diff --git a/source3/script/tests/test_smbclient_s3.sh 
b/source3/script/tests/test_smbclient_s3.sh
index 69c7452..c073b43 100755
--- a/source3/script/tests/test_smbclient_s3.sh
+++ b/source3/script/tests/test_smbclient_s3.sh
@@ -971,6 +971,38 @@ EOF
     fi
 }
 
+# Test creating a stream on the root of the share directory filname - :foobar
+test_toplevel_stream()
+{
+    tmpfile=$PREFIX/smbclient_interactive_prompt_commands
+    cat > $tmpfile <<EOF
+put ${PREFIX}/smbclient_interactive_prompt_commands :foobar
+allinfo \\
+setmode \\ -a
+quit
+EOF
+    cmd='CLI_FORCE_INTERACTIVE=yes $SMBCLIENT "$@" -U$USERNAME%$PASSWORD 
//$SERVER/tmp -I $SERVER_IP -mSMB3 $ADDARGS < $tmpfile 2>&1'
+    eval echo "$cmd"
+    out=`eval $cmd`
+    ret=$?
+    rm -f $tmpfile
+
+    if [ $ret != 0 ] ; then
+       echo "$out"
+       echo "failed creating toplevel stream :foobar with error $ret"
+       false
+       return
+    fi
+
+    echo "$out" | grep '^stream:.*:foobar'
+    ret=$?
+    if [ $ret != 0 ] ; then
+       echo "$out"
+       echo "failed creating toplevel stream :foobar"
+       false
+    fi
+}
+
 
 LOGDIR_PREFIX=test_smbclient_s3
 
@@ -1059,6 +1091,10 @@ testit "server-side file copy" \
     test_scopy || \
     failed=`expr $failed + 1`
 
+testit "creating a :stream at root of share" \
+    test_toplevel_stream || \
+    failed=`expr $failed + 1`
+
 testit "rm -rf $LOGDIR" \
     rm -rf $LOGDIR || \
     failed=`expr $failed + 1`
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index 6899d2a..3ed60e2 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -32,7 +32,6 @@
 
 static NTSTATUS build_stream_path(TALLOC_CTX *mem_ctx,
                                  connection_struct *conn,
-                                 const char *orig_path,
                                  struct smb_filename *smb_fname);
 
 /****************************************************************************
@@ -371,6 +370,29 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx,
                         */
                        *stream = '\0';
                        stream = tmp;
+
+                       if (smb_fname->base_name[0] == '\0') {
+                               /*
+                                * orig_name was just a stream name.
+                                * This is a stream on the root of
+                                * the share. Replace base_name with
+                                * a "."
+                                */
+                               smb_fname->base_name =
+                                       talloc_strdup(smb_fname, ".");
+                               if (smb_fname->base_name == NULL) {
+                                       status = NT_STATUS_NO_MEMORY;
+                                       goto err;
+                               }
+                               if (SMB_VFS_STAT(conn, smb_fname) != 0) {
+                                       status = map_nt_error_from_unix(errno);
+                                       goto err;
+                               }
+                               DEBUG(5, ("conversion finished %s -> %s\n",
+                                       orig_path,
+                                       smb_fname->base_name));
+                               goto done;
+                       }
                }
        }
 
@@ -981,7 +1003,7 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx,
                smb_fname->stream_name = stream;
 
                /* Check path now that the base_name has been converted. */
-               status = build_stream_path(ctx, conn, orig_path, smb_fname);
+               status = build_stream_path(ctx, conn, smb_fname);
                if (!NT_STATUS_IS_OK(status)) {
                        goto fail;
                }
@@ -1233,7 +1255,6 @@ int get_real_filename(connection_struct *conn, const char 
*path,
 
 static NTSTATUS build_stream_path(TALLOC_CTX *mem_ctx,
                                  connection_struct *conn,
-                                 const char *orig_path,
                                  struct smb_filename *smb_fname)
 {
        NTSTATUS status;


-- 
Samba Shared Repository

Reply via email to