]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3/librpc: smbXsrv.idl: store share_type, share_flags and capabilities in struct...
authorRalph Boehme <slow@samba.org>
Tue, 18 Mar 2025 10:31:45 +0000 (11:31 +0100)
committerRalph Boehme <slow@samba.org>
Fri, 17 Jul 2026 10:18:36 +0000 (10:18 +0000)
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Anoop C S <anoopcs@samba.org>
source3/librpc/idl/smbXsrv.idl
source3/smbd/smb2_tcon.c

index 52a8ef7921ad4ec763e3124fe2f3d9412bd287f2..e75b97975ea8c5b65a2b056754aaa3cb44ef7e0d 100644 (file)
@@ -400,6 +400,9 @@ interface smbXsrv
                [ref] smbXsrv_tcon_global0              *global;
                NTSTATUS                                status;
                NTTIME                                  idle_time;
+               uint8                                   share_type;
+               uint32                                  share_flags;
+               uint32                                  capabilities;
                [ignore] connection_struct              *compat;
        } smbXsrv_tcon;
 
index df3c225957114930f2f7088ca3c26584672c8962..27a83e47be137d94a50752a36b0ab3fa0d76b0d3 100644 (file)
@@ -393,33 +393,29 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
        tcon->status = NT_STATUS_OK;
 
        if (IS_PRINT(tcon->compat)) {
-               *out_share_type = SMB2_SHARE_TYPE_PRINT;
+               tcon->share_type = SMB2_SHARE_TYPE_PRINT;
        } else if (IS_IPC(tcon->compat)) {
-               *out_share_type = SMB2_SHARE_TYPE_PIPE;
+               tcon->share_type = SMB2_SHARE_TYPE_PIPE;
        } else {
-               *out_share_type = SMB2_SHARE_TYPE_DISK;
+               tcon->share_type = SMB2_SHARE_TYPE_DISK;
        }
 
-       *out_share_flags = 0;
-
        if (lp_msdfs_root(SNUM(tcon->compat)) && lp_host_msdfs()) {
-               *out_share_flags |= (SMB2_SHAREFLAG_DFS|SMB2_SHAREFLAG_DFS_ROOT);
-               *out_capabilities = SMB2_SHARE_CAP_DFS;
-       } else {
-               *out_capabilities = 0;
+               tcon->share_flags |= (SMB2_SHAREFLAG_DFS|SMB2_SHAREFLAG_DFS_ROOT);
+               tcon->capabilities = SMB2_SHARE_CAP_DFS;
        }
 
        switch(lp_csc_policy(SNUM(tcon->compat))) {
        case CSC_POLICY_MANUAL:
                break;
        case CSC_POLICY_DOCUMENTS:
-               *out_share_flags |= SMB2_SHAREFLAG_AUTO_CACHING;
+               tcon->share_flags |= SMB2_SHAREFLAG_AUTO_CACHING;
                break;
        case CSC_POLICY_PROGRAMS:
-               *out_share_flags |= SMB2_SHAREFLAG_VDO_CACHING;
+               tcon->share_flags |= SMB2_SHAREFLAG_VDO_CACHING;
                break;
        case CSC_POLICY_DISABLE:
-               *out_share_flags |= SMB2_SHAREFLAG_NO_CACHING;
+               tcon->share_flags |= SMB2_SHAREFLAG_NO_CACHING;
                break;
        default:
                break;
@@ -427,11 +423,11 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
 
        if (lp_hide_unreadable(SNUM(tcon->compat)) ||
            lp_hide_unwriteable_files(SNUM(tcon->compat))) {
-               *out_share_flags |= SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM;
+               tcon->share_flags |= SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM;
        }
 
        if (encryption_desired) {
-               *out_share_flags |= SMB2_SHAREFLAG_ENCRYPT_DATA;
+               tcon->share_flags |= SMB2_SHAREFLAG_ENCRYPT_DATA;
        }
 
        /*
@@ -439,7 +435,7 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
         * behavior on a cluster...
         */
        if (conn->protocol >= PROTOCOL_SMB3_00 &&
-           *out_share_type == SMB2_SHARE_TYPE_DISK)
+           tcon->share_type == SMB2_SHARE_TYPE_DISK)
        {
                bool persistent = false; /* persistent handles not implemented yet */
                bool cluster = lp_clustering();
@@ -469,7 +465,7 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
                                        "CONTINUOUS AVAILABILITY",
                                        persistent);
                if (announce) {
-                       *out_capabilities |= SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY;
+                       tcon->capabilities |= SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY;
                }
 
                /*
@@ -480,7 +476,7 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
                                        "SCALE OUT",
                                        scaleout);
                if (announce) {
-                       *out_capabilities |= SMB2_SHARE_CAP_SCALEOUT;
+                       tcon->capabilities |= SMB2_SHARE_CAP_SCALEOUT;
                }
 
                /*
@@ -491,7 +487,7 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
                                        "CLUSTER",
                                        witness);
                if (announce) {
-                       *out_capabilities |= SMB2_SHARE_CAP_CLUSTER;
+                       tcon->capabilities |= SMB2_SHARE_CAP_CLUSTER;
                }
 
                /*
@@ -508,10 +504,13 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
                                                asymmetric);
                }
                if (announce) {
-                       *out_capabilities |= SMB2_SHARE_CAP_ASYMMETRIC;
+                       tcon->capabilities |= SMB2_SHARE_CAP_ASYMMETRIC;
                }
        }
 
+       *out_share_type = tcon->share_type;
+       *out_share_flags = tcon->share_flags;
+       *out_capabilities = tcon->capabilities;
        *out_maximal_access = tcon->compat->share_access;
 
        *out_tree_id = tcon->global->tcon_wire_id;