]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
vfs: Add the streams_xattr:ext_prefix parameter
authorVolker Lendecke <vl@samba.org>
Thu, 4 Sep 2025 14:56:39 +0000 (16:56 +0200)
committerRalph Boehme <slow@samba.org>
Tue, 21 Oct 2025 17:33:29 +0000 (17:33 +0000)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
docs-xml/manpages/vfs_streams_xattr.8.xml
source3/modules/vfs_streams_xattr.c

index e8680c2b4a0e68e304587a2e8245e3db4111326e..48e6f20c8b6da4898157eb420132a01f18f6ecba 100644 (file)
            </listitem>
          </varlistentry>
 
+         <varlistentry>
+           <term>streams_xattr:ext_prefix = STRING</term>
+           <listitem>
+             <para>Name prefix used when storing overflow xattrs of a
+             stream. It defaults to
+             <command>streams_xattr:prefix</command> with the string
+             "Ext" appended. If
+             <command>streams_xattr:prefix</command> ends in a ".",
+             "Ext" is inserted before the ".".</para>
+             <para>The overflow xattrs will be named according to a
+             pattern following "user.DosStreamExt.0.ADS-NAME".</para>
+           </listitem>
+         </varlistentry>
+
        </variablelist>
 
 </refsect1>
index 7ea42220207cec2a28bf02282e73ef350ac1217c..455789d562aa06adc28de17698af554f20862a91 100644 (file)
@@ -34,6 +34,7 @@
 struct streams_xattr_config {
        const char *prefix;
        size_t prefix_len;
+       const char *ext_prefix;
        size_t max_extents;
        bool store_stream_type;
 };
@@ -1081,6 +1082,8 @@ static int streams_xattr_connect(vfs_handle_struct *handle,
        struct streams_xattr_config *config;
        const char *default_prefix = SAMBA_XATTR_DOSSTREAM_PREFIX;
        const char *prefix;
+       char *default_ext_prefix = NULL;
+       const char *ext_prefix = NULL;
        int rc, max_xattrs;
 
        rc = SMB_VFS_NEXT_CONNECT(handle, service, user);
@@ -1113,6 +1116,36 @@ static int streams_xattr_connect(vfs_handle_struct *handle,
                return -1;
        }
 
+       if (config->prefix[config->prefix_len - 1] == '.') {
+               default_ext_prefix = talloc_asprintf(talloc_tos(),
+                                                    "%.*sExt.",
+                                                    (int)(config->prefix_len -
+                                                          1),
+                                                    config->prefix);
+       } else {
+               default_ext_prefix = talloc_asprintf(talloc_tos(),
+                                                    "%sExt",
+                                                    config->prefix);
+       }
+
+       if (default_ext_prefix == NULL) {
+               errno = ENOMEM;
+               return -1;
+       }
+
+       ext_prefix = lp_parm_const_string(SNUM(handle->conn),
+                                         "streams_xattr",
+                                         "ext_prefix",
+                                         default_ext_prefix);
+       TALLOC_FREE(default_ext_prefix);
+       config->ext_prefix = talloc_strdup(config, ext_prefix);
+       if (config->ext_prefix == NULL) {
+               DEBUG(1, ("talloc_strdup() failed\n"));
+               errno = ENOMEM;
+               return -1;
+       }
+       DBG_DEBUG("using stream ext prefix: %s\n", config->ext_prefix);
+
        config->store_stream_type = lp_parm_bool(SNUM(handle->conn),
                                                 "streams_xattr",
                                                 "store_stream_type",