diff options
author | Jeremy Allison <jra@samba.org> | 2010-05-21 16:56:10 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2010-05-21 16:56:10 -0700 |
commit | b2a7ad8c951562d1aea6663064784da0b0a98565 (patch) | |
tree | 2bd42fcd58d6efed103ad625d04075ded559181e /source3 | |
parent | 6af5e7cde198ac21ed8030fd3744ab0ae7f15fd3 (diff) | |
download | samba-b2a7ad8c951562d1aea6663064784da0b0a98565.tar.gz |
Make DFS work over SMB2.
Jeremy.
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/smb.h | 6 | ||||
-rw-r--r-- | source3/param/loadparm.c | 6 | ||||
-rw-r--r-- | source3/smbd/msdfs.c | 3 | ||||
-rw-r--r-- | source3/smbd/smb2_create.c | 17 | ||||
-rw-r--r-- | source3/smbd/smb2_tcon.c | 34 |
5 files changed, 49 insertions, 17 deletions
diff --git a/source3/include/smb.h b/source3/include/smb.h index 93e7323ba84..1ceb54b7926 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -1976,4 +1976,10 @@ struct child_pid { /* Used to keep track of deferred opens. */ struct deferred_open_record; +/* Client-side offline caching policy types */ +#define CSC_POLICY_MANUAL 0 +#define CSC_POLICY_DOCUMENTS 1 +#define CSC_POLICY_PROGRAMS 2 +#define CSC_POLICY_DISABLE 3 + #endif /* _SMB_H */ diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index a78bede2aab..ba9d816429a 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -827,12 +827,6 @@ static const struct enum_list enum_bool_auto[] = { {-1, NULL} }; -/* Client-side offline caching policy types */ -#define CSC_POLICY_MANUAL 0 -#define CSC_POLICY_DOCUMENTS 1 -#define CSC_POLICY_PROGRAMS 2 -#define CSC_POLICY_DISABLE 3 - static const struct enum_list enum_csc_policy[] = { {CSC_POLICY_MANUAL, "manual"}, {CSC_POLICY_DOCUMENTS, "documents"}, diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c index 6dfa88692e2..92c3e0ebad4 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 31813cc82eb..b4b265b9f5e 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 f3e3037bdb6..e1b6775ced8 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; |