diff options
author | Sam Liddicott <sam@liddicott.com> | 2009-05-14 08:58:50 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2009-05-20 13:32:27 +0200 |
commit | 4b21ad9db7babb1e278fa2e3b81737b6df36e2d2 (patch) | |
tree | fc91aff51044875e3ae8b26cb33f579104a1d72d /source4/smb_server/smb | |
parent | e11f9b46c6345471cca76b9772080d3bfd687852 (diff) | |
download | samba-4b21ad9db7babb1e278fa2e3b81737b6df36e2d2.tar.gz samba-4b21ad9db7babb1e278fa2e3b81737b6df36e2d2.tar.bz2 samba-4b21ad9db7babb1e278fa2e3b81737b6df36e2d2.zip |
Have ntvfs_connect() accept union smb_tcon *tcon instead of char* sharename
This change brings ntvfs_connect into compliance with other ntvfs functions
which take an ntvfs module, an ntvfs request and an smb io union.
It now becomes the responsibility of ntvfs modules to examine
tcon->generic.level themselves and derive the share name and any other
options
directly; e.g.
const char *sharename;
switch (tcon->generic.level) {
case RAW_TCON_TCON:
sharename = tcon->tcon.in.service;
break;
case RAW_TCON_TCONX:
sharename = tcon->tconx.in.path;
break;
case RAW_TCON_SMB2:
default:
return NT_STATUS_INVALID_LEVEL;
}
if (strncmp(sharename, "\\\\", 2) == 0) {
char *p = strchr(sharename+2, '\\');
if (p) {
sharename = p + 1;
}
}
service.c smbsrv_tcon_backend() is called before ntvfs_connect and fills in
some of the tcon->..out values.
For the case of RAW_TCON_TCONX, it filles out tcon->tconx.out.tid and
tcon->tconx.out.options
For the case of RAW_TCON_TCON it fills out tcon->tcon.out.tid and
tcon->tcon.out.max_xmit
Thus the ntvfs_connect function for vfs modules may override these values
if desired, but are not required to.
ntvfs_connect functions are required to fill in the tcon->tconx.out.*_type
fields, for RAW_TCON_TCONX, perhaps something like:
if (tcon->generic.level == RAW_TCON_TCONX) {
tcon->tconx.out.fs_type = ntvfs->ctx->fs_type;
tcon->tconx.out.dev_type = ntvfs->ctx->dev_type;
}
Signed-off-by: Sam Liddicott <sam@liddicott.com>
(I fixed the ntvfs_connect() in the smb_server/smb2/
and the RAW_TCON_SMB2 switch case in the modules)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Diffstat (limited to 'source4/smb_server/smb')
-rw-r--r-- | source4/smb_server/smb/reply.c | 24 | ||||
-rw-r--r-- | source4/smb_server/smb/service.c | 3 |
2 files changed, 4 insertions, 23 deletions
diff --git a/source4/smb_server/smb/reply.c b/source4/smb_server/smb/reply.c index 1b309a0c1f..ec7b6783fd 100644 --- a/source4/smb_server/smb/reply.c +++ b/source4/smb_server/smb/reply.c @@ -53,16 +53,6 @@ static void reply_tcon_send(struct ntvfs_request *ntvfs) SMBSRV_CHECK_ASYNC_STATUS(con, union smb_tcon); - if (con->generic.level == RAW_TCON_TCON) { - con->tcon.out.max_xmit = req->smb_conn->negotiate.max_recv; - con->tcon.out.tid = req->tcon->tid; - } else { - /* TODO: take a look at tconx.in.flags! */ - con->tconx.out.tid = req->tcon->tid; - con->tconx.out.dev_type = talloc_strdup(req, req->tcon->ntvfs->dev_type); - con->tconx.out.fs_type = talloc_strdup(req, req->tcon->ntvfs->fs_type); - } - /* construct reply */ smbsrv_setup_reply(req, 2, 0); @@ -109,7 +99,7 @@ void smbsrv_reply_tcon(struct smbsrv_request *req) SMBSRV_SETUP_NTVFS_REQUEST(reply_tcon_send, NTVFS_ASYNC_STATE_MAY_ASYNC); /* Invoke NTVFS connection hook */ - SMBSRV_CALL_NTVFS_BACKEND(ntvfs_connect(req->ntvfs, req->tcon->share_name)); + SMBSRV_CALL_NTVFS_BACKEND(ntvfs_connect(req->ntvfs, con)); } @@ -123,16 +113,6 @@ static void reply_tcon_and_X_send(struct ntvfs_request *ntvfs) SMBSRV_CHECK_ASYNC_STATUS(con, union smb_tcon); - if (con->generic.level == RAW_TCON_TCON) { - con->tcon.out.max_xmit = req->smb_conn->negotiate.max_recv; - con->tcon.out.tid = req->tcon->tid; - } else { - /* TODO: take a look at tconx.in.flags! */ - con->tconx.out.tid = req->tcon->tid; - con->tconx.out.dev_type = talloc_strdup(req, req->tcon->ntvfs->dev_type); - con->tconx.out.fs_type = talloc_strdup(req, req->tcon->ntvfs->fs_type); - } - /* construct reply - two variants */ if (req->smb_conn->negotiate.protocol < PROTOCOL_NT1) { smbsrv_setup_reply(req, 2, 0); @@ -205,7 +185,7 @@ void smbsrv_reply_tcon_and_X(struct smbsrv_request *req) SMBSRV_SETUP_NTVFS_REQUEST(reply_tcon_and_X_send, NTVFS_ASYNC_STATE_MAY_ASYNC); /* Invoke NTVFS connection hook */ - SMBSRV_CALL_NTVFS_BACKEND(ntvfs_connect(req->ntvfs, req->tcon->share_name)); + SMBSRV_CALL_NTVFS_BACKEND(ntvfs_connect(req->ntvfs, con)); } diff --git a/source4/smb_server/smb/service.c b/source4/smb_server/smb/service.c index 85d169fc13..5d8d6bbc32 100644 --- a/source4/smb_server/smb/service.c +++ b/source4/smb_server/smb/service.c @@ -158,7 +158,7 @@ static NTSTATUS make_connection(struct smbsrv_request *req, } /* - backend for tree connect call + backend for tree connect call, in preparation for calling ntvfs_connect() */ NTSTATUS smbsrv_tcon_backend(struct smbsrv_request *req, union smb_tcon *con) { @@ -188,6 +188,7 @@ NTSTATUS smbsrv_tcon_backend(struct smbsrv_request *req, union smb_tcon *con) return status; } + con->tconx.out.tid = req->tcon->tid; con->tconx.out.options = SMB_SUPPORT_SEARCH_BITS | (share_int_option(req->tcon->ntvfs->config, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT) << 2); if (share_bool_option(req->tcon->ntvfs->config, SHARE_MSDFS_ROOT, SHARE_MSDFS_ROOT_DEFAULT) && lp_host_msdfs(req->smb_conn->lp_ctx)) { con->tconx.out.options |= SMB_SHARE_IN_DFS; |