]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libsmb: Define to transfer file types via smb3 unix extensions
authorVolker Lendecke <vl@samba.org>
Fri, 20 Sep 2024 20:58:03 +0000 (22:58 +0200)
committerRalph Boehme <slow@samba.org>
Thu, 26 Sep 2024 15:22:46 +0000 (15:22 +0000)
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 <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
libcli/smb/smb_unix_ext.h
libcli/smb/smb_util.h
libcli/smb/util.c

index 2f2357d8acfedc9765929bdb74e079ebb4f96d69..1145fd3cad6446cb69c71d4dca445d5ef8533f0b 100644 (file)
@@ -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.
index 3c71f50b442f800924e55d9c5322850d99a3d105..cd91e42f30a4721ca069c11fc96aff6018b3a2ec 100644 (file)
@@ -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);
 
index b134aaf8b89f041890583259df2463463294a740..a864a1078cd6e4d448fdefff651a097a5333e028 100644 (file)
@@ -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)) {