[SCM] Samba Shared Repository - branch master updated
Stefan Metzmacher
metze at samba.org
Tue Jul 24 13:23:02 MDT 2012
The branch, master has been updated
via b9100a7 libcli/smb: pass down smbXcli_tcon to smb1cli_req_create/send() and smb1cli_trans*
via 29dc01b s4:libcli/raw: setup a smbXcli_tcon for each smbcli_tree
via ed72628 s3:libsmb: use a smbXcli_tcon instead of uint16_t cli_state->smb1.tid
via 552dda9 libcli/smb: add smbXcli_tcon structure
via 20e4392 s3:libsmb: make use of cli_state_[g|s]et_tid()
via cc0d490 s4:libcli/raw: parse extended SMBtconX responses
via a6e5b98 s4:libcli/raw: fix SMBtconX response parsing
from d00d206 waf: Update to newer upstream snapshot.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit b9100a7ac443159716398aaadfab34af64d8858b
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Jul 23 21:34:58 2012 +0200
libcli/smb: pass down smbXcli_tcon to smb1cli_req_create/send() and smb1cli_trans*
metze
Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
Autobuild-Date(master): Tue Jul 24 21:22:44 CEST 2012 on sn-devel-104
commit 29dc01b1755081b1b7a9b38ad4f7e6fdaa795bf9
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Jul 23 20:57:23 2012 +0200
s4:libcli/raw: setup a smbXcli_tcon for each smbcli_tree
metze
commit ed726281b3dc32c6e31b81dd1fb76b0568687623
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Jul 23 20:27:58 2012 +0200
s3:libsmb: use a smbXcli_tcon instead of uint16_t cli_state->smb1.tid
metze
commit 552dda970c6b665a36cf2af56142eb1456883528
Author: Luk Claes <luk at debian.org>
Date: Sat Jun 2 18:03:20 2012 +0200
libcli/smb: add smbXcli_tcon structure
Signed-off-by: Luk Claes <luk at debian.org>
Signed-off-by: Stefan Metzmacher <metze at samba.org>
commit 20e4392b255b98c22e12b5dbe1727457b419fb28
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Jul 23 20:38:33 2012 +0200
s3:libsmb: make use of cli_state_[g|s]et_tid()
metze
commit cc0d49063035030dff58d4a2cb9ca45f9316f173
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Jul 24 08:56:02 2012 +0200
s4:libcli/raw: parse extended SMBtconX responses
metze
commit a6e5b98827c9a85a8e062ed9dba10e1205801135
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Jul 24 08:54:02 2012 +0200
s4:libcli/raw: fix SMBtconX response parsing
metze
-----------------------------------------------------------------------
Summary of changes:
libcli/smb/smb1cli_trans.c | 21 +++++---
libcli/smb/smbXcli_base.c | 107 ++++++++++++++++++++++++++++++++++--
libcli/smb/smbXcli_base.h | 29 +++++++++--
source3/include/client.h | 2 +-
source3/libsmb/async_smb.c | 4 +-
source3/libsmb/cliconnect.c | 7 ++-
source3/libsmb/clientgen.c | 16 ++++--
source3/libsmb/clitrans.c | 6 ++-
source4/libcli/raw/clitransport.c | 13 +++--
source4/libcli/raw/clitree.c | 14 ++++-
source4/libcli/raw/interfaces.h | 2 +
source4/libcli/raw/libcliraw.h | 1 +
source4/libcli/raw/rawrequest.c | 2 +
source4/libcli/raw/rawtrans.c | 20 +++++--
14 files changed, 200 insertions(+), 44 deletions(-)
Changeset truncated at 500 lines:
diff --git a/libcli/smb/smb1cli_trans.c b/libcli/smb/smb1cli_trans.c
index ca0fdc1..cc4f7d3 100644
--- a/libcli/smb/smb1cli_trans.c
+++ b/libcli/smb/smb1cli_trans.c
@@ -39,7 +39,7 @@ struct smb1cli_trans_state {
uint32_t timeout_msec;
uint16_t mid;
uint32_t pid;
- uint16_t tid;
+ struct smbXcli_tcon *tcon;
struct smbXcli_session *session;
const char *pipe_name;
uint8_t *pipe_name_conv;
@@ -415,7 +415,8 @@ struct tevent_req *smb1cli_trans_send(
uint8_t additional_flags, uint8_t clear_flags,
uint16_t additional_flags2, uint16_t clear_flags2,
uint32_t timeout_msec,
- uint32_t pid, uint16_t tid,
+ uint32_t pid,
+ struct smbXcli_tcon *tcon,
struct smbXcli_session *session,
const char *pipe_name, uint16_t fid, uint16_t function, int flags,
uint16_t *setup, uint8_t num_setup, uint8_t max_setup,
@@ -470,7 +471,7 @@ struct tevent_req *smb1cli_trans_send(
state->num_rsetup = 0;
state->rsetup = NULL;
state->pid = pid;
- state->tid = tid;
+ state->tcon = tcon;
state->session = session;
ZERO_STRUCT(state->rparam);
ZERO_STRUCT(state->rdata);
@@ -514,7 +515,8 @@ struct tevent_req *smb1cli_trans_send(
state->additional_flags2,
state->clear_flags2,
state->timeout_msec,
- state->pid, state->tid,
+ state->pid,
+ state->tcon,
state->session,
wct, state->vwv,
iov_count, state->iov);
@@ -646,7 +648,8 @@ static void smb1cli_trans_done(struct tevent_req *subreq)
state->additional_flags2,
state->clear_flags2,
state->timeout_msec,
- state->pid, state->tid,
+ state->pid,
+ state->tcon,
state->session,
wct, state->vwv,
iov_count, state->iov);
@@ -753,7 +756,8 @@ static void smb1cli_trans_done2(struct tevent_req *subreq2)
state->additional_flags2,
state->clear_flags2,
state->timeout_msec,
- state->pid, state->tid,
+ state->pid,
+ state->tcon,
state->session,
wct, state->vwv,
iov_count, state->iov);
@@ -844,7 +848,8 @@ NTSTATUS smb1cli_trans(TALLOC_CTX *mem_ctx, struct smbXcli_conn *conn,
uint8_t additional_flags, uint8_t clear_flags,
uint16_t additional_flags2, uint16_t clear_flags2,
uint32_t timeout_msec,
- uint32_t pid, uint16_t tid,
+ uint32_t pid,
+ struct smbXcli_tcon *tcon,
struct smbXcli_session *session,
const char *pipe_name, uint16_t fid, uint16_t function,
int flags,
@@ -879,7 +884,7 @@ NTSTATUS smb1cli_trans(TALLOC_CTX *mem_ctx, struct smbXcli_conn *conn,
additional_flags, clear_flags,
additional_flags2, clear_flags2,
timeout_msec,
- pid, tid, session,
+ pid, tcon, session,
pipe_name, fid, function, flags,
setup, num_setup, max_setup,
param, num_param, max_param,
diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c
index c41890d..037c0dd 100644
--- a/libcli/smb/smbXcli_base.c
+++ b/libcli/smb/smbXcli_base.c
@@ -35,6 +35,7 @@
struct smbXcli_conn;
struct smbXcli_req;
struct smbXcli_session;
+struct smbXcli_tcon;
struct smbXcli_conn {
int read_fd;
@@ -150,10 +151,30 @@ struct smbXcli_session {
} smb2;
};
+struct smbXcli_tcon {
+ struct {
+ uint16_t tcon_id;
+ uint16_t optional_support;
+ uint32_t maximal_access;
+ uint32_t guest_maximal_access;
+ char *service;
+ char *fs_type;
+ } smb1;
+
+ struct {
+ uint32_t tcon_id;
+ uint8_t type;
+ uint32_t flags;
+ uint32_t capabilities;
+ uint32_t maximal_access;
+ } smb2;
+};
+
struct smbXcli_req_state {
struct tevent_context *ev;
struct smbXcli_conn *conn;
struct smbXcli_session *session; /* maybe NULL */
+ struct smbXcli_tcon *tcon; /* maybe NULL */
uint8_t length_hdr[4];
@@ -1094,7 +1115,6 @@ static bool smb1cli_req_cancel(struct tevent_req *req)
uint8_t flags;
uint16_t flags2;
uint32_t pid;
- uint16_t tid;
uint16_t mid;
struct tevent_req *subreq;
NTSTATUS status;
@@ -1103,7 +1123,6 @@ static bool smb1cli_req_cancel(struct tevent_req *req)
flags2 = SVAL(state->smb1.hdr, HDR_FLG2);
pid = SVAL(state->smb1.hdr, HDR_PID);
pid |= SVAL(state->smb1.hdr, HDR_PIDHIGH)<<16;
- tid = SVAL(state->smb1.hdr, HDR_TID);
mid = SVAL(state->smb1.hdr, HDR_MID);
subreq = smb1cli_req_create(state, state->ev,
@@ -1112,7 +1131,8 @@ static bool smb1cli_req_cancel(struct tevent_req *req)
flags, 0,
flags2, 0,
0, /* timeout */
- pid, tid,
+ pid,
+ state->tcon,
state->session,
0, NULL, /* vwv */
0, NULL); /* bytes */
@@ -1149,7 +1169,7 @@ struct tevent_req *smb1cli_req_create(TALLOC_CTX *mem_ctx,
uint16_t clear_flags2,
uint32_t timeout_msec,
uint32_t pid,
- uint16_t tid,
+ struct smbXcli_tcon *tcon,
struct smbXcli_session *session,
uint8_t wct, uint16_t *vwv,
int iov_count,
@@ -1160,6 +1180,7 @@ struct tevent_req *smb1cli_req_create(TALLOC_CTX *mem_ctx,
uint8_t flags = 0;
uint16_t flags2 = 0;
uint16_t uid = 0;
+ uint16_t tid = 0;
if (iov_count > MAX_SMB_IOV) {
/*
@@ -1176,11 +1197,16 @@ struct tevent_req *smb1cli_req_create(TALLOC_CTX *mem_ctx,
state->ev = ev;
state->conn = conn;
state->session = session;
+ state->tcon = tcon;
if (session) {
uid = session->smb1.session_id;
}
+ if (tcon) {
+ tid = tcon->smb1.tcon_id;
+ }
+
state->smb1.recv_cmd = 0xFF;
state->smb1.recv_status = NT_STATUS_INTERNAL_ERROR;
state->smb1.recv_iov = talloc_zero_array(state, struct iovec, 3);
@@ -1423,7 +1449,7 @@ struct tevent_req *smb1cli_req_send(TALLOC_CTX *mem_ctx,
uint16_t clear_flags2,
uint32_t timeout_msec,
uint32_t pid,
- uint16_t tid,
+ struct smbXcli_tcon *tcon,
struct smbXcli_session *session,
uint8_t wct, uint16_t *vwv,
uint32_t num_bytes,
@@ -1440,7 +1466,7 @@ struct tevent_req *smb1cli_req_send(TALLOC_CTX *mem_ctx,
additional_flags, clear_flags,
additional_flags2, clear_flags2,
timeout_msec,
- pid, tid, session,
+ pid, tcon, session,
wct, vwv, 1, &iov);
if (req == NULL) {
return NULL;
@@ -4535,3 +4561,72 @@ NTSTATUS smb2cli_session_set_channel_key(struct smbXcli_session *session,
return NT_STATUS_OK;
}
+
+struct smbXcli_tcon *smbXcli_tcon_create(TALLOC_CTX *mem_ctx)
+{
+ struct smbXcli_tcon *tcon;
+
+ tcon = talloc_zero(mem_ctx, struct smbXcli_tcon);
+ if (tcon == NULL) {
+ return NULL;
+ }
+
+ return tcon;
+}
+
+uint16_t smb1cli_tcon_current_id(struct smbXcli_tcon *tcon)
+{
+ return tcon->smb1.tcon_id;
+}
+
+void smb1cli_tcon_set_id(struct smbXcli_tcon *tcon, uint16_t tcon_id)
+{
+ tcon->smb1.tcon_id = tcon_id;
+}
+
+bool smb1cli_tcon_set_values(struct smbXcli_tcon *tcon,
+ uint16_t tcon_id,
+ uint16_t optional_support,
+ uint32_t maximal_access,
+ uint32_t guest_maximal_access,
+ const char *service,
+ const char *fs_type)
+{
+ tcon->smb1.tcon_id = tcon_id;
+ tcon->smb1.optional_support = optional_support;
+ tcon->smb1.maximal_access = maximal_access;
+ tcon->smb1.guest_maximal_access = guest_maximal_access;
+
+ TALLOC_FREE(tcon->smb1.service);
+ tcon->smb1.service = talloc_strdup(tcon, service);
+ if (service != NULL && tcon->smb1.service == NULL) {
+ return false;
+ }
+
+ TALLOC_FREE(tcon->smb1.fs_type);
+ tcon->smb1.fs_type = talloc_strdup(tcon, fs_type);
+ if (fs_type != NULL && tcon->smb1.fs_type == NULL) {
+ return false;
+ }
+
+ return true;
+}
+
+uint32_t smb2cli_tcon_current_id(struct smbXcli_tcon *tcon)
+{
+ return tcon->smb2.tcon_id;
+}
+
+void smb2cli_tcon_set_values(struct smbXcli_tcon *tcon,
+ uint32_t tcon_id,
+ uint8_t type,
+ uint32_t flags,
+ uint32_t capabilities,
+ uint32_t maximal_access)
+{
+ tcon->smb2.tcon_id = tcon_id;
+ tcon->smb2.type = type;
+ tcon->smb2.flags = flags;
+ tcon->smb2.capabilities = capabilities;
+ tcon->smb2.maximal_access = maximal_access;
+}
diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h
index 9d4847c..a105c82 100644
--- a/libcli/smb/smbXcli_base.h
+++ b/libcli/smb/smbXcli_base.h
@@ -23,6 +23,7 @@
struct smbXcli_conn;
struct smbXcli_session;
+struct smbXcli_tcon;
struct smb_trans_enc_state;
struct GUID;
@@ -109,7 +110,7 @@ struct tevent_req *smb1cli_req_create(TALLOC_CTX *mem_ctx,
uint16_t clear_flags2,
uint32_t timeout_msec,
uint32_t pid,
- uint16_t tid,
+ struct smbXcli_tcon *tcon,
struct smbXcli_session *session,
uint8_t wct, uint16_t *vwv,
int iov_count,
@@ -126,7 +127,7 @@ struct tevent_req *smb1cli_req_send(TALLOC_CTX *mem_ctx,
uint16_t clear_flags2,
uint32_t timeout_msec,
uint32_t pid,
- uint16_t tid,
+ struct smbXcli_tcon *tcon,
struct smbXcli_session *session,
uint8_t wct, uint16_t *vwv,
uint32_t num_bytes,
@@ -151,7 +152,8 @@ struct tevent_req *smb1cli_trans_send(
uint8_t additional_flags, uint8_t clear_flags,
uint16_t additional_flags2, uint16_t clear_flags2,
uint32_t timeout_msec,
- uint32_t pid, uint16_t tid,
+ uint32_t pid,
+ struct smbXcli_tcon *tcon,
struct smbXcli_session *session,
const char *pipe_name, uint16_t fid, uint16_t function, int flags,
uint16_t *setup, uint8_t num_setup, uint8_t max_setup,
@@ -170,7 +172,8 @@ NTSTATUS smb1cli_trans(TALLOC_CTX *mem_ctx, struct smbXcli_conn *conn,
uint8_t additional_flags, uint8_t clear_flags,
uint16_t additional_flags2, uint16_t clear_flags2,
uint32_t timeout_msec,
- uint32_t pid, uint16_t tid,
+ uint32_t pid,
+ struct smbXcli_tcon *tcon,
struct smbXcli_session *session,
const char *pipe_name, uint16_t fid, uint16_t function,
int flags,
@@ -270,6 +273,24 @@ NTSTATUS smb2cli_session_set_channel_key(struct smbXcli_session *session,
const DATA_BLOB channel_key,
const struct iovec *recv_iov);
+struct smbXcli_tcon *smbXcli_tcon_create(TALLOC_CTX *mem_ctx);
+uint16_t smb1cli_tcon_current_id(struct smbXcli_tcon *tcon);
+void smb1cli_tcon_set_id(struct smbXcli_tcon *tcon, uint16_t tcon_id);
+bool smb1cli_tcon_set_values(struct smbXcli_tcon *tcon,
+ uint16_t tcon_id,
+ uint16_t optional_support,
+ uint32_t maximal_access,
+ uint32_t guest_maximal_access,
+ const char *service,
+ const char *fs_type);
+uint32_t smb2cli_tcon_current_id(struct smbXcli_tcon *tcon);
+void smb2cli_tcon_set_values(struct smbXcli_tcon *tcon,
+ uint32_t tcon_id,
+ uint8_t type,
+ uint32_t flags,
+ uint32_t capabilities,
+ uint32_t maximal_access);
+
struct tevent_req *smb2cli_session_setup_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct smbXcli_conn *conn,
diff --git a/source3/include/client.h b/source3/include/client.h
index b6e62a3..9617c2a 100644
--- a/source3/include/client.h
+++ b/source3/include/client.h
@@ -103,8 +103,8 @@ struct cli_state {
struct {
uint16_t pid;
uint16_t vc_num;
- uint16_t tid;
struct smbXcli_session *session;
+ struct smbXcli_tcon *tcon;
} smb1;
struct {
diff --git a/source3/libsmb/async_smb.c b/source3/libsmb/async_smb.c
index a82b0ce..ed68a5d 100644
--- a/source3/libsmb/async_smb.c
+++ b/source3/libsmb/async_smb.c
@@ -92,7 +92,7 @@ struct tevent_req *cli_smb_req_create(TALLOC_CTX *mem_ctx,
additional_flags2, clear_flags2,
cli->timeout,
cli->smb1.pid,
- cli->smb1.tid,
+ cli->smb1.tcon,
cli->smb1.session,
wct, vwv, iov_count, bytes_iov);
if (state->req == NULL) {
@@ -150,7 +150,7 @@ struct tevent_req *cli_smb_send(TALLOC_CTX *mem_ctx,
additional_flags2, clear_flags2,
cli->timeout,
cli->smb1.pid,
- cli->smb1.tid,
+ cli->smb1.tcon,
cli->smb1.session,
wct, vwv, num_bytes, bytes);
if (state->req == NULL) {
diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
index acc3a21..17b5af6 100644
--- a/source3/libsmb/cliconnect.c
+++ b/source3/libsmb/cliconnect.c
@@ -2469,7 +2469,7 @@ static void cli_tcon_andx_done(struct tevent_req *subreq)
cli->dfsroot = ((SVAL(vwv+2, 0) & SMB_SHARE_IN_DFS) != 0);
}
- cli->smb1.tid = SVAL(inhdr, HDR_TID);
+ cli_state_set_tid(cli, SVAL(inhdr, HDR_TID));
tevent_req_done(req);
}
@@ -2541,7 +2541,8 @@ NTSTATUS cli_tree_connect(struct cli_state *cli, const char *share,
if (!NT_STATUS_IS_OK(status)) {
return status;
}
- cli->smb1.tid = tid;
+
+ cli_state_set_tid(cli, tid);
return NT_STATUS_OK;
}
@@ -2591,7 +2592,7 @@ static void cli_tdis_done(struct tevent_req *subreq)
tevent_req_nterror(req, status);
return;
}
- state->cli->smb1.tid = UINT16_MAX;
+ cli_state_set_tid(state->cli, UINT16_MAX);
tevent_req_done(req);
}
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index 88cb44d..ae0350b 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -271,7 +271,11 @@ struct cli_state *cli_state_create(TALLOC_CTX *mem_ctx,
cli->smb1.pid = (uint16_t)getpid();
cli->smb1.vc_num = cli->smb1.pid;
- cli->smb1.tid = UINT16_MAX;
+ cli->smb1.tcon = smbXcli_tcon_create(cli);
+ if (cli->smb1.tcon == NULL) {
+ goto error;
+ }
+ smb1cli_tcon_set_id(cli->smb1.tcon, UINT16_MAX);
cli->smb1.session = smbXcli_session_create(cli, cli->conn);
if (cli->smb1.session == NULL) {
goto error;
@@ -383,7 +387,9 @@ uint16_t cli_getpid(struct cli_state *cli)
bool cli_state_has_tcon(struct cli_state *cli)
{
- if (cli->smb1.tid == UINT16_MAX) {
+ uint16_t tid = cli_state_get_tid(cli);
+
+ if (tid == UINT16_MAX) {
return false;
}
@@ -392,13 +398,13 @@ bool cli_state_has_tcon(struct cli_state *cli)
uint16_t cli_state_get_tid(struct cli_state *cli)
{
- return cli->smb1.tid;
+ return smb1cli_tcon_current_id(cli->smb1.tcon);
}
uint16_t cli_state_set_tid(struct cli_state *cli, uint16_t tid)
{
- uint16_t ret = cli->smb1.tid;
- cli->smb1.tid = tid;
+ uint16_t ret = smb1cli_tcon_current_id(cli->smb1.tcon);
+ smb1cli_tcon_set_id(cli->smb1.tcon, tid);
return ret;
}
diff --git a/source3/libsmb/clitrans.c b/source3/libsmb/clitrans.c
index 5a27678..08fda5f 100644
--- a/source3/libsmb/clitrans.c
+++ b/source3/libsmb/clitrans.c
@@ -89,7 +89,8 @@ struct tevent_req *cli_trans_send(
additional_flags, clear_flags,
additional_flags2, clear_flags2,
cli->timeout,
- cli->smb1.pid, cli->smb1.tid,
+ cli->smb1.pid,
+ cli->smb1.tcon,
cli->smb1.session,
pipe_name, fid, function, flags,
setup, num_setup, max_setup,
@@ -184,7 +185,8 @@ NTSTATUS cli_trans(TALLOC_CTX *mem_ctx, struct cli_state *cli,
additional_flags, clear_flags,
additional_flags2, clear_flags2,
cli->timeout,
- cli->smb1.pid, cli->smb1.tid,
+ cli->smb1.pid,
+ cli->smb1.tcon,
cli->smb1.session,
pipe_name, fid, function, flags,
setup, num_setup, max_setup,
diff --git a/source4/libcli/raw/clitransport.c b/source4/libcli/raw/clitransport.c
index 321df76..f9d96b5 100644
--- a/source4/libcli/raw/clitransport.c
+++ b/source4/libcli/raw/clitransport.c
@@ -213,7 +213,7 @@ struct tevent_req *smbcli_transport_setup_subreq(struct smbcli_request *req)
uint16_t additional_flags2;
uint16_t clear_flags2;
uint32_t pid;
- uint16_t tid;
+ struct smbXcli_tcon *tcon = NULL;
struct smbXcli_session *session = NULL;
uint32_t timeout_msec = transport->options.request_timeout * 1000;
struct iovec *bytes_iov = NULL;
--
Samba Shared Repository
More information about the samba-cvs
mailing list