]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: Show blk and chr devices as nfs reparse points
authorVolker Lendecke <vl@samba.org>
Mon, 8 Jul 2024 09:23:14 +0000 (11:23 +0200)
committerJeremy Allison <jra@samba.org>
Fri, 12 Jul 2024 21:36:16 +0000 (21:36 +0000)
Can't test these in selftest, we can't create devices and I don't want
us to depend on /dev to exist. Tested manually on a system where
/dev/null exists:

Try "help" to get a list of possible commands.
smb: \> allinfo null
altname: null
create_time:    Fri Jun 21 02:45:59 PM 2024 CEST
access_time:    Fri Jun 21 02:45:59 PM 2024 CEST
write_time:     Fri Jun 21 02:45:59 PM 2024 CEST
change_time:    Fri Jun 21 02:45:59 PM 2024 CEST
attributes:  (480)
stream: [::$DATA], 0 bytes
0x80000014 (IO_REPARSE_TAG_NFS)
 0x524843 (NFS_SPECFILE_CHR)
 1/3
smb: \>

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Fri Jul 12 21:36:16 UTC 2024 on atb-devel-224

source3/modules/util_reparse.c
source3/smbd/dosmode.c

index 9a2ae531e7fddcc188fb137b7e0673f928716ea2..2694410be4fa3a7ff2bd202b41ee0c6280c58631 100644 (file)
@@ -135,6 +135,25 @@ static NTSTATUS fsctl_get_reparse_point_sock(struct files_struct *fsp,
                fsp, &reparse_data, ctx, _out_data, max_out_len, _out_len);
 }
 
+static NTSTATUS fsctl_get_reparse_point_dev(struct files_struct *fsp,
+                                           uint64_t nfs_type,
+                                           dev_t rdev,
+                                           TALLOC_CTX *ctx,
+                                           uint8_t **_out_data,
+                                           uint32_t max_out_len,
+                                           uint32_t *_out_len)
+{
+       struct reparse_data_buffer reparse_data = {
+               .tag = IO_REPARSE_TAG_NFS,
+               .parsed.nfs.type = nfs_type,
+               .parsed.nfs.data.dev.major = unix_dev_major(rdev),
+               .parsed.nfs.data.dev.minor = unix_dev_minor(rdev),
+       };
+
+       return fsctl_get_reparse_point_int(
+               fsp, &reparse_data, ctx, _out_data, max_out_len, _out_len);
+}
+
 NTSTATUS fsctl_get_reparse_point(struct files_struct *fsp,
                                 TALLOC_CTX *mem_ctx,
                                 uint32_t *_reparse_tag,
@@ -171,6 +190,28 @@ NTSTATUS fsctl_get_reparse_point(struct files_struct *fsp,
                status = fsctl_get_reparse_point_sock(
                        fsp, mem_ctx, &out_data, max_out_len, &out_len);
                break;
+       case S_IFBLK:
+               DBG_DEBUG("%s is a block device\n", fsp_str_dbg(fsp));
+               status = fsctl_get_reparse_point_dev(
+                       fsp,
+                       NFS_SPECFILE_BLK,
+                       fsp->fsp_name->st.st_ex_rdev,
+                       mem_ctx,
+                       &out_data,
+                       max_out_len,
+                       &out_len);
+               break;
+       case S_IFCHR:
+               DBG_DEBUG("%s is a character device\n", fsp_str_dbg(fsp));
+               status = fsctl_get_reparse_point_dev(
+                       fsp,
+                       NFS_SPECFILE_CHR,
+                       fsp->fsp_name->st.st_ex_rdev,
+                       mem_ctx,
+                       &out_data,
+                       max_out_len,
+                       &out_len);
+               break;
        default:
                break;
        }
index 4ceb618e360caaea7e9880021384af6a66953c52..c5eeb68f2c6ebf688451b8f294dd8ee9ec391438 100644 (file)
@@ -719,6 +719,8 @@ uint32_t fdos_mode(struct files_struct *fsp)
                break;
        case S_IFIFO:
        case S_IFSOCK:
+       case S_IFBLK:
+       case S_IFCHR:
                return FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_REPARSE_POINT;
                break;
        default: