From: Volker Lendecke Date: Thu, 4 Sep 2025 14:56:39 +0000 (+0200) Subject: vfs: Add the streams_xattr:ext_prefix parameter X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0dc7816fab6d64c6291e7d28f2ed9c992ad5d9e2;p=thirdparty%2Fsamba.git vfs: Add the streams_xattr:ext_prefix parameter Signed-off-by: Volker Lendecke Reviewed-by: Ralph Boehme --- diff --git a/docs-xml/manpages/vfs_streams_xattr.8.xml b/docs-xml/manpages/vfs_streams_xattr.8.xml index e8680c2b4a0..48e6f20c8b6 100644 --- a/docs-xml/manpages/vfs_streams_xattr.8.xml +++ b/docs-xml/manpages/vfs_streams_xattr.8.xml @@ -92,6 +92,20 @@ + + streams_xattr:ext_prefix = STRING + + Name prefix used when storing overflow xattrs of a + stream. It defaults to + streams_xattr:prefix with the string + "Ext" appended. If + streams_xattr:prefix ends in a ".", + "Ext" is inserted before the ".". + The overflow xattrs will be named according to a + pattern following "user.DosStreamExt.0.ADS-NAME". + + + diff --git a/source3/modules/vfs_streams_xattr.c b/source3/modules/vfs_streams_xattr.c index 7ea42220207..455789d562a 100644 --- a/source3/modules/vfs_streams_xattr.c +++ b/source3/modules/vfs_streams_xattr.c @@ -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",