summaryrefslogtreecommitdiff
path: root/source3/smbd/smb2_tcon.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2010-05-21 16:56:10 -0700
committerJeremy Allison <jra@samba.org>2010-05-21 16:56:10 -0700
commitb2a7ad8c951562d1aea6663064784da0b0a98565 (patch)
tree2bd42fcd58d6efed103ad625d04075ded559181e /source3/smbd/smb2_tcon.c
parent6af5e7cde198ac21ed8030fd3744ab0ae7f15fd3 (diff)
downloadsamba-b2a7ad8c951562d1aea6663064784da0b0a98565.tar.gz
samba-b2a7ad8c951562d1aea6663064784da0b0a98565.tar.bz2
samba-b2a7ad8c951562d1aea6663064784da0b0a98565.zip
Make DFS work over SMB2.
Jeremy.
Diffstat (limited to 'source3/smbd/smb2_tcon.c')
-rw-r--r--source3/smbd/smb2_tcon.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/source3/smbd/smb2_tcon.c b/source3/smbd/smb2_tcon.c
index f3e3037bdb..e1b6775ced 100644
--- a/source3/smbd/smb2_tcon.c
+++ b/source3/smbd/smb2_tcon.c
@@ -227,14 +227,38 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
tcon->compat_conn->cnum = tcon->tid;
if (IS_PRINT(tcon->compat_conn)) {
- *out_share_type = 0x03;
+ *out_share_type = SMB2_SHARE_TYPE_PRINT;
} else if (IS_IPC(tcon->compat_conn)) {
- *out_share_type = 0x02;
+ *out_share_type = SMB2_SHARE_TYPE_PIPE;
} else {
- *out_share_type = 0x01;
+ *out_share_type = SMB2_SHARE_TYPE_DISK;
}
- *out_share_flags = SMB2_SHAREFLAG_ALL;
- *out_capabilities = 0;
+
+ *out_share_flags = SMB2_SHAREFLAG_ALLOW_NAMESPACE_CACHING;
+
+ if (lp_msdfs_root(SNUM(tcon->compat_conn)) && lp_host_msdfs()) {
+ *out_share_flags |= (SMB2_SHAREFLAG_DFS|SMB2_SHAREFLAG_DFS_ROOT);
+ *out_capabilities = SMB2_SHARE_CAP_DFS;
+ } else {
+ *out_capabilities = 0;
+ }
+
+ switch(lp_csc_policy(SNUM(tcon->compat_conn))) {
+ case CSC_POLICY_MANUAL:
+ break;
+ case CSC_POLICY_DOCUMENTS:
+ *out_share_flags |= SMB2_SHAREFLAG_AUTO_CACHING;
+ break;
+ case CSC_POLICY_PROGRAMS:
+ *out_share_flags |= SMB2_SHAREFLAG_VDO_CACHING;
+ break;
+ case CSC_POLICY_DISABLE:
+ *out_share_flags |= SMB2_SHAREFLAG_NO_CACHING;
+ break;
+ default:
+ break;
+ }
+
*out_maximal_access = FILE_GENERIC_ALL;
*out_tree_id = tcon->tid;