From: Volker Lendecke Date: Fri, 20 Sep 2024 20:58:03 +0000 (+0200) Subject: libsmb: Define to transfer file types via smb3 unix extensions X-Git-Tag: tdb-1.4.13~1064 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a9983bb6ed12e28b41d412f8ade13d1e9a66bee7;p=thirdparty%2Fsamba.git libsmb: Define to transfer file types via smb3 unix extensions Ride on the definitions of the SMB1 extensions, send the UNIX type in the 3 bits above the permissions and extra (suid,sgid,sticky) bits Signed-off-by: Volker Lendecke Reviewed-by: Ralph Boehme --- diff --git a/libcli/smb/smb_unix_ext.h b/libcli/smb/smb_unix_ext.h index 2f2357d8acf..1145fd3cad6 100644 --- a/libcli/smb/smb_unix_ext.h +++ b/libcli/smb/smb_unix_ext.h @@ -117,7 +117,9 @@ Offset Size Name #define UNIX_USR_MASK 0000700 #define UNIX_PERM_MASK 0000777 #define UNIX_EXTRA_MASK 0007000 -#define UNIX_ALL_MASK 0007777 +#define UNIX_FILETYPE_MASK 0070000 +#define UNIX_FILETYPE_SHIFT 12 +#define UNIX_ALL_MASK 0077777 /* Flags for chflags (CIFS_UNIX_EXTATTR_CAP capability) and * SMB_QUERY_FILE_UNIX_INFO2. diff --git a/libcli/smb/smb_util.h b/libcli/smb/smb_util.h index 3c71f50b442..cd91e42f30a 100644 --- a/libcli/smb/smb_util.h +++ b/libcli/smb/smb_util.h @@ -34,6 +34,8 @@ uint32_t unix_perms_to_wire(mode_t perms); mode_t wire_perms_to_unix(uint32_t perms); mode_t wire_filetype_to_unix(uint32_t wire_type); uint32_t unix_filetype_to_wire(mode_t mode); +mode_t wire_mode_to_unix(uint32_t wire); +uint32_t unix_mode_to_wire(mode_t mode); bool smb_buffer_oob(uint32_t bufsize, uint32_t offset, uint32_t length); diff --git a/libcli/smb/util.c b/libcli/smb/util.c index b134aaf8b89..a864a1078cd 100644 --- a/libcli/smb/util.c +++ b/libcli/smb/util.c @@ -195,6 +195,19 @@ uint32_t unix_filetype_to_wire(mode_t mode) return UNIX_TYPE_UNKNOWN; } +mode_t wire_mode_to_unix(uint32_t wire) +{ + uint32_t wire_type = (wire & UNIX_FILETYPE_MASK) >> + UNIX_FILETYPE_SHIFT; + return wire_perms_to_unix(wire) | wire_filetype_to_unix(wire_type); +} + +uint32_t unix_mode_to_wire(mode_t mode) +{ + uint32_t wire_type = unix_filetype_to_wire(mode); + return unix_perms_to_wire(mode) | (wire_type << UNIX_FILETYPE_SHIFT); +} + bool smb_buffer_oob(uint32_t bufsize, uint32_t offset, uint32_t length) { if ((offset + length < offset) || (offset + length < length)) {