From b2a7ad8c951562d1aea6663064784da0b0a98565 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 21 May 2010 16:56:10 -0700 Subject: Make DFS work over SMB2. Jeremy. --- source3/smbd/msdfs.c | 3 ++- source3/smbd/smb2_create.c | 17 ++++++++++++----- source3/smbd/smb2_tcon.c | 34 +++++++++++++++++++++++++++++----- 3 files changed, 43 insertions(+), 11 deletions(-) (limited to 'source3/smbd') diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c index 6dfa88692e..92c3e0ebad 100644 --- a/source3/smbd/msdfs.c +++ b/source3/smbd/msdfs.c @@ -50,6 +50,7 @@ static NTSTATUS parse_dfs_path(connection_struct *conn, struct dfs_path *pdp, /* MUST BE TALLOCED */ bool *ppath_contains_wcard) { + struct smbd_server_connection *sconn = smbd_server_conn; char *pathname_local; char *p,*temp; char *servicename; @@ -77,7 +78,7 @@ static NTSTATUS parse_dfs_path(connection_struct *conn, sepchar = pdp->posix_path ? '/' : '\\'; - if (*pathname != sepchar) { + if (!sconn->allow_smb2 && (*pathname != sepchar)) { DEBUG(10,("parse_dfs_path: path %s doesn't start with %c\n", pathname, sepchar )); /* diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c index 31813cc82e..b4b265b9f5 100644 --- a/source3/smbd/smb2_create.c +++ b/source3/smbd/smb2_create.c @@ -673,11 +673,18 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, in_create_options &= ~(0x10);/* NTCREATEX_OPTIONS_SYNC_ALERT */ in_create_options &= ~(0x20);/* NTCREATEX_OPTIONS_ASYNC_ALERT */ - /* convert '\\' into '/' */ - status = check_path_syntax(fname); - if (!NT_STATUS_IS_OK(status)) { - tevent_req_nterror(req, status); - return tevent_req_post(req, ev); + /* + * For a DFS path the function parse_dfs_path() + * will do the path processing. + */ + + if (!smb1req->flags2 & FLAGS2_DFS_PATHNAMES) { + /* convert '\\' into '/' */ + status = check_path_syntax(fname); + if (!NT_STATUS_IS_OK(status)) { + tevent_req_nterror(req, status); + return tevent_req_post(req, ev); + } } status = filename_convert(req, 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; -- cgit