[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha6-241-g22e3004

Volker Lendecke vlendec at samba.org
Fri Jan 30 11:48:26 GMT 2009


The branch, master has been updated
       via  22e3004829fe742efdbf750611749b9aaf585515 (commit)
       via  b873ede89d3155438f7f9938d9a027cb4e3791e7 (commit)
       via  a0d52e7d54da450a734d7bc7f3827a2791e802b1 (commit)
       via  0bd92281e49b91a9b9a14486adbe6f44affb7a13 (commit)
       via  7b934c6af3f80c9d75151906eed929045cec28a2 (commit)
      from  fb7b92abc2bea4b3d91cdd896f02db88065a4b8f (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 22e3004829fe742efdbf750611749b9aaf585515
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jan 29 22:54:55 2009 +0100

    Add the "SMBD" rpc transport
    
    The idea of this is that all client utils like smbpasswd and also for example
    "net join" do not access our internal databases like passdb and secrets.tdb
    directly anymore but pass everything throught the well-established RPC
    interfaces.
    
    The way you use this is the following: With rpc_cli_smbd_conn_init() or its
    async variant you initialize a "struct rpc_cli_smbd_conn". This structure is
    the link to a freshly forked smbd, ready to be used for RPC services. You
    should only ever have one such structure in your program. More don't hurt, but
    are plainly unnecessary.
    
    If you want to use the SAMR pipe to change a passwort, you connect to that pipe
    with rpc_pipe_open_local. Do you normal rpccli_samr calls on that and your
    locally forked smbd will connect to passdb for you.
    
    GD, this might make the distinction between the _l and _r calls in libnetapi
    mostly unnecessary. At least it is intended to do so... :-)

commit b873ede89d3155438f7f9938d9a027cb4e3791e7
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jan 29 22:41:33 2009 +0100

    Make rpc_transport_np_init async

commit a0d52e7d54da450a734d7bc7f3827a2791e802b1
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Jan 26 20:45:19 2009 +0100

    Add async cli_ntcreate

commit 0bd92281e49b91a9b9a14486adbe6f44affb7a13
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Jan 26 08:37:13 2009 +0100

    Make cli_tcon_andx async

commit 7b934c6af3f80c9d75151906eed929045cec28a2
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Jan 25 21:54:55 2009 +0100

    Make cli_session_setup_guest async

-----------------------------------------------------------------------

Summary of changes:
 source3/Makefile.in                     |    2 +-
 source3/client/smbspool.c               |    9 +-
 source3/include/proto.h                 |   77 ++++-
 source3/include/smb.h                   |    1 +
 source3/libsmb/cliconnect.c             |  337 +++++++++++----
 source3/libsmb/clidfs.c                 |    9 +-
 source3/libsmb/clifile.c                |  132 ++++++
 source3/libsmb/libsmb_server.c          |   17 +-
 source3/libsmb/passchange.c             |   10 +-
 source3/nmbd/nmbd_synclists.c           |    2 +-
 source3/rpc_client/cli_pipe.c           |   55 +++
 source3/rpc_client/rpc_transport_np.c   |  153 ++++++--
 source3/rpc_client/rpc_transport_smbd.c |  694 +++++++++++++++++++++++++++++++
 source3/torture/locktest.c              |    7 +-
 source3/torture/masktest.c              |    7 +-
 source3/torture/torture.c               |   20 +-
 source3/utils/net_rpc.c                 |    4 +-
 source3/utils/smbcacls.c                |   10 +-
 source3/winbindd/winbindd_cm.c          |    9 +-
 19 files changed, 1384 insertions(+), 171 deletions(-)
 create mode 100644 source3/rpc_client/rpc_transport_smbd.c


Changeset truncated at 500 lines:

diff --git a/source3/Makefile.in b/source3/Makefile.in
index 5448643..9bc6329 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -579,7 +579,7 @@ RPC_PARSE_OBJ = $(RPC_PARSE_OBJ2) \
 	        rpc_parse/parse_eventlog.o rpc_parse/parse_buffer.o
 
 RPC_CLIENT_OBJ = rpc_client/cli_pipe.o rpc_client/rpc_transport_np.o \
-	rpc_client/rpc_transport_sock.o
+	rpc_client/rpc_transport_sock.o rpc_client/rpc_transport_smbd.o
 
 LOCKING_OBJ = locking/locking.o locking/brlock.o locking/posix.o
 
diff --git a/source3/client/smbspool.c b/source3/client/smbspool.c
index 1910ccd..7943cf5 100644
--- a/source3/client/smbspool.c
+++ b/source3/client/smbspool.c
@@ -432,10 +432,13 @@ smb_complete_connection(const char *myname,
 		return NULL;
 	}
 
-	if (!cli_send_tconX(cli, share, "?????", password, strlen(password) + 1)) {
-		fprintf(stderr, "ERROR: Tree connect failed (%s)\n", cli_errstr(cli));
+	nt_status = cli_tcon_andx(cli, share, "?????", password,
+				  strlen(password) + 1);
+	if (!NT_STATUS_IS_OK(nt_status)) {
+		fprintf(stderr, "ERROR: Tree connect failed (%s)\n",
+			nt_errstr(nt_status));
 
-		if (get_exit_code(cli, cli_nt_error(cli)) == 2) {
+		if (get_exit_code(cli, nt_status) == 2) {
 			*need_auth = true;
 		}
 
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 8276847..d30eb09 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -2323,9 +2323,19 @@ NTSTATUS cli_session_setup(struct cli_state *cli,
 			   const char *pass, int passlen,
 			   const char *ntpass, int ntpasslen,
 			   const char *workgroup);
+struct async_req *cli_session_setup_guest_send(TALLOC_CTX *mem_ctx,
+					       struct event_context *ev,
+					       struct cli_state *cli);
+NTSTATUS cli_session_setup_guest_recv(struct async_req *req);
 bool cli_ulogoff(struct cli_state *cli);
-bool cli_send_tconX(struct cli_state *cli, 
-		    const char *share, const char *dev, const char *pass, int passlen);
+struct async_req *cli_tcon_andx_send(TALLOC_CTX *mem_ctx,
+				     struct event_context *ev,
+				     struct cli_state *cli,
+				     const char *share, const char *dev,
+				     const char *pass, int passlen);
+NTSTATUS cli_tcon_andx_recv(struct async_req *req);
+NTSTATUS cli_tcon_andx(struct cli_state *cli, const char *share,
+		       const char *dev, const char *pass, int passlen);
 bool cli_tdis(struct cli_state *cli);
 void cli_negprot_sendsync(struct cli_state *cli);
 NTSTATUS cli_negprot(struct cli_state *cli);
@@ -2499,6 +2509,28 @@ int cli_nt_create_full(struct cli_state *cli, const char *fname,
 		 uint32 FileAttributes, uint32 ShareAccess,
 		 uint32 CreateDisposition, uint32 CreateOptions,
 		 uint8 SecuityFlags);
+struct async_req *cli_ntcreate_send(TALLOC_CTX *mem_ctx,
+				    struct event_context *ev,
+				    struct cli_state *cli,
+				    const char *fname,
+				    uint32_t CreatFlags,
+				    uint32_t DesiredAccess,
+				    uint32_t FileAttributes,
+				    uint32_t ShareAccess,
+				    uint32_t CreateDisposition,
+				    uint32_t CreateOptions,
+				    uint8_t SecurityFlags);
+NTSTATUS cli_ntcreate_recv(struct async_req *req, uint16_t *pfnum);
+NTSTATUS cli_ntcreate(struct cli_state *cli,
+		      const char *fname,
+		      uint32_t CreatFlags,
+		      uint32_t DesiredAccess,
+		      uint32_t FileAttributes,
+		      uint32_t ShareAccess,
+		      uint32_t CreateDisposition,
+		      uint32_t CreateOptions,
+		      uint8_t SecurityFlags,
+		      uint16_t *pfid);
 int cli_nt_create(struct cli_state *cli, const char *fname, uint32 DesiredAccess);
 uint8_t *smb_bytes_push_str(uint8_t *buf, bool ucs2, const char *str,
 			    size_t str_len, size_t *pconverted_size);
@@ -5294,14 +5326,55 @@ NTSTATUS cli_rpc_pipe_open_krb5(struct cli_state *cli,
 NTSTATUS cli_get_session_key(TALLOC_CTX *mem_ctx,
 			     struct rpc_pipe_client *cli,
 			     DATA_BLOB *session_key);
+NTSTATUS rpc_pipe_open_local(TALLOC_CTX *mem_ctx,
+			     struct rpc_cli_smbd_conn *conn,
+			     const struct ndr_syntax_id *syntax,
+			     struct rpc_pipe_client **presult);
 
 /* The following definitions come from rpc_client/rpc_transport_np.c  */
 
+struct async_req *rpc_transport_np_init_send(TALLOC_CTX *mem_ctx,
+					     struct event_context *ev,
+					     struct cli_state *cli,
+					     const struct ndr_syntax_id *abstract_syntax);
+NTSTATUS rpc_transport_np_init_recv(struct async_req *req,
+				    TALLOC_CTX *mem_ctx,
+				    struct rpc_cli_transport **presult);
 NTSTATUS rpc_transport_np_init(TALLOC_CTX *mem_ctx, struct cli_state *cli,
 			       const struct ndr_syntax_id *abstract_syntax,
 			       struct rpc_cli_transport **presult);
 struct cli_state *rpc_pipe_np_smb_conn(struct rpc_pipe_client *p);
 
+/* The following definitions come from rpc_client/rpc_transport_smbd.c  */
+
+struct async_req *rpc_cli_smbd_conn_init_send(TALLOC_CTX *mem_ctx,
+					      struct event_context *ev,
+					      void (*stdout_callback)(char *buf,
+								      size_t len,
+								      void *priv),
+					      void *priv);
+NTSTATUS rpc_cli_smbd_conn_init_recv(struct async_req *req,
+				     TALLOC_CTX *mem_ctx,
+				     struct rpc_cli_smbd_conn **pconn);
+NTSTATUS rpc_cli_smbd_conn_init(TALLOC_CTX *mem_ctx,
+				struct rpc_cli_smbd_conn **pconn,
+				void (*stdout_callback)(char *buf,
+							size_t len,
+							void *priv),
+				void *priv);
+
+struct async_req *rpc_transport_smbd_init_send(TALLOC_CTX *mem_ctx,
+					       struct event_context *ev,
+					       struct rpc_cli_smbd_conn *conn,
+					       const struct ndr_syntax_id *abstract_syntax);
+NTSTATUS rpc_transport_smbd_init_recv(struct async_req *req,
+				      TALLOC_CTX *mem_ctx,
+				      struct rpc_cli_transport **presult);
+NTSTATUS rpc_transport_smbd_init(TALLOC_CTX *mem_ctx,
+				 struct rpc_cli_smbd_conn *conn,
+				 const struct ndr_syntax_id *abstract_syntax,
+				 struct rpc_cli_transport **presult);
+
 /* The following definitions come from rpc_client/rpc_transport_sock.c  */
 
 NTSTATUS rpc_transport_sock_init(TALLOC_CTX *mem_ctx, int fd,
diff --git a/source3/include/smb.h b/source3/include/smb.h
index 3f71cde..9451710 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -367,6 +367,7 @@ struct uuid;
 struct named_mutex;
 struct pcap_cache;
 struct wb_context;
+struct rpc_cli_smbd_conn;
 
 struct vfs_fsp_data {
     struct vfs_fsp_data *next;
diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
index 5778e7f..ed5adc5 100644
--- a/source3/libsmb/cliconnect.c
+++ b/source3/libsmb/cliconnect.c
@@ -161,50 +161,79 @@ static uint32 cli_session_setup_capabilities(struct cli_state *cli)
  Do a NT1 guest session setup.
 ****************************************************************************/
 
-static NTSTATUS cli_session_setup_guest(struct cli_state *cli)
+struct async_req *cli_session_setup_guest_send(TALLOC_CTX *mem_ctx,
+					       struct event_context *ev,
+					       struct cli_state *cli)
 {
-	char *p;
-	uint32 capabilities = cli_session_setup_capabilities(cli);
+	struct async_req *result;
+	uint16_t vwv[13];
+	uint8_t *bytes;
 
-	memset(cli->outbuf, '\0', smb_size);
-	cli_set_message(cli->outbuf,13,0,True);
-	SCVAL(cli->outbuf,smb_com,SMBsesssetupX);
-	cli_setup_packet(cli);
-			
-	SCVAL(cli->outbuf,smb_vwv0,0xFF);
-	SSVAL(cli->outbuf,smb_vwv2,CLI_BUFFER_SIZE);
-	SSVAL(cli->outbuf,smb_vwv3,2);
-	SSVAL(cli->outbuf,smb_vwv4,cli->pid);
-	SIVAL(cli->outbuf,smb_vwv5,cli->sesskey);
-	SSVAL(cli->outbuf,smb_vwv7,0);
-	SSVAL(cli->outbuf,smb_vwv8,0);
-	SIVAL(cli->outbuf,smb_vwv11,capabilities); 
-	p = smb_buf(cli->outbuf);
-	p += clistr_push(cli, p, "", -1, STR_TERMINATE); /* username */
-	p += clistr_push(cli, p, "", -1, STR_TERMINATE); /* workgroup */
-	p += clistr_push(cli, p, "Unix", -1, STR_TERMINATE);
-	p += clistr_push(cli, p, "Samba", -1, STR_TERMINATE);
-	cli_setup_bcc(cli, p);
+	SCVAL(vwv+0, 0, 0xFF);
+	SCVAL(vwv+0, 1, 0);
+	SSVAL(vwv+1, 0, 0);
+	SSVAL(vwv+2, 0, CLI_BUFFER_SIZE);
+	SSVAL(vwv+3, 0, 2);
+	SSVAL(vwv+4, 0, cli->pid);
+	SIVAL(vwv+5, 0, cli->sesskey);
+	SSVAL(vwv+7, 0, 0);
+	SSVAL(vwv+8, 0, 0);
+	SSVAL(vwv+9, 0, 0);
+	SSVAL(vwv+10, 0, 0);
+	SIVAL(vwv+11, 0, cli_session_setup_capabilities(cli));
+
+	bytes = talloc_array(talloc_tos(), uint8_t, 0);
+
+	bytes = smb_bytes_push_str(bytes, cli_ucs2(cli), "",  1, /* username */
+				   NULL);
+	bytes = smb_bytes_push_str(bytes, cli_ucs2(cli), "", 1, /* workgroup */
+				   NULL);
+	bytes = smb_bytes_push_str(bytes, cli_ucs2(cli), "Unix",
+				   strlen("Unix")+1, NULL);
+	bytes = smb_bytes_push_str(bytes, cli_ucs2(cli), "Samba",
+				   strlen("Samba")+1, NULL);
+
+	if (bytes == NULL) {
+		return NULL;
+	}
+
+	result = cli_request_send(mem_ctx, ev, cli, SMBsesssetupX, 0,
+				  13, vwv, 0, talloc_get_size(bytes), bytes);
+	TALLOC_FREE(bytes);
+	return result;
+}
 
-	if (!cli_send_smb(cli) || !cli_receive_smb(cli)) {
-		return cli_nt_error(cli);
+NTSTATUS cli_session_setup_guest_recv(struct async_req *req)
+{
+	struct cli_request *cli_req = talloc_get_type_abort(
+		req->private_data, struct cli_request);
+	struct cli_state *cli = cli_req->cli;
+	uint8_t wct;
+	uint16_t *vwv;
+	uint16_t num_bytes;
+	uint8_t *bytes;
+	uint8_t *p;
+	NTSTATUS status;
+
+	if (async_req_is_error(req, &status)) {
+		return status;
 	}
-	
-	show_msg(cli->inbuf);
-	
-	if (cli_is_error(cli)) {
-		return cli_nt_error(cli);
+
+	status = cli_pull_reply(req, &wct, &vwv, &num_bytes, &bytes);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
 	}
 
-	cli->vuid = SVAL(cli->inbuf,smb_uid);
+	p = bytes;
 
-	p = smb_buf(cli->inbuf);
-	p += clistr_pull(cli->inbuf, cli->server_os, p, sizeof(fstring),
-			 -1, STR_TERMINATE);
-	p += clistr_pull(cli->inbuf, cli->server_type, p, sizeof(fstring),
-			 -1, STR_TERMINATE);
-	p += clistr_pull(cli->inbuf, cli->server_domain, p, sizeof(fstring),
-			 -1, STR_TERMINATE);
+	cli->vuid = SVAL(cli_req->inbuf, smb_uid);
+
+	p += clistr_pull(cli_req->inbuf, cli->server_os, (char *)p,
+			 sizeof(fstring), bytes+num_bytes-p, STR_TERMINATE);
+	p += clistr_pull(cli_req->inbuf, cli->server_type, (char *)p,
+			 sizeof(fstring), bytes+num_bytes-p, STR_TERMINATE);
+	p += clistr_pull(cli_req->inbuf, cli->server_domain, (char *)p,
+			 sizeof(fstring), bytes+num_bytes-p, STR_TERMINATE);
 
 	if (strstr(cli->server_type, "Samba")) {
 		cli->is_samba = True;
@@ -215,6 +244,43 @@ static NTSTATUS cli_session_setup_guest(struct cli_state *cli)
 	return NT_STATUS_OK;
 }
 
+static NTSTATUS cli_session_setup_guest(struct cli_state *cli)
+{
+	TALLOC_CTX *frame = talloc_stackframe();
+	struct event_context *ev;
+	struct async_req *req;
+	NTSTATUS status;
+
+	if (cli->fd_event != NULL) {
+		/*
+		 * Can't use sync call while an async call is in flight
+		 */
+		status = NT_STATUS_INVALID_PARAMETER;
+		goto fail;
+	}
+
+	ev = event_context_init(frame);
+	if (ev == NULL) {
+		status = NT_STATUS_NO_MEMORY;
+		goto fail;
+	}
+
+	req = cli_session_setup_guest_send(frame, ev, cli);
+	if (req == NULL) {
+		status = NT_STATUS_NO_MEMORY;
+		goto fail;
+	}
+
+	while (req->state < ASYNC_REQ_DONE) {
+		event_loop_once(ev);
+	}
+
+	status = cli_session_setup_guest_recv(req);
+ fail:
+	TALLOC_FREE(frame);
+	return status;
+}
+
 /****************************************************************************
  Do a NT1 plaintext session setup.
 ****************************************************************************/
@@ -1107,13 +1173,17 @@ bool cli_ulogoff(struct cli_state *cli)
  Send a tconX.
 ****************************************************************************/
 
-bool cli_send_tconX(struct cli_state *cli, 
-		    const char *share, const char *dev, const char *pass, int passlen)
+struct async_req *cli_tcon_andx_send(TALLOC_CTX *mem_ctx,
+				     struct event_context *ev,
+				     struct cli_state *cli,
+				     const char *share, const char *dev,
+				     const char *pass, int passlen)
 {
-	fstring fullshare, pword;
-	char *p;
-	memset(cli->outbuf,'\0',smb_size);
-	memset(cli->inbuf,'\0',smb_size);
+	fstring pword;
+	char *tmp = NULL;
+	struct async_req *result;
+	uint16_t vwv[4];
+	uint8_t *bytes;
 
 	fstrcpy(cli->share, share);
 
@@ -1121,9 +1191,10 @@ bool cli_send_tconX(struct cli_state *cli,
 	if (cli->sec_mode & NEGOTIATE_SECURITY_USER_LEVEL) {
 		passlen = 1;
 		pass = "";
-	} else if (!pass) {
-		DEBUG(1, ("Server not using user level security and no password supplied.\n"));
-		return False;
+	} else if (pass == NULL) {
+		DEBUG(1, ("Server not using user level security and no "
+			  "password supplied.\n"));
+		goto access_denied;
 	}
 
 	if ((cli->sec_mode & NEGOTIATE_SECURITY_CHALLENGE_RESPONSE) &&
@@ -1132,28 +1203,32 @@ bool cli_send_tconX(struct cli_state *cli,
 			DEBUG(1, ("Server requested LANMAN password "
 				  "(share-level security) but "
 				  "'client lanman auth' is disabled\n"));
-			return False;
+			goto access_denied;
 		}
 
 		/*
-		 * Non-encrypted passwords - convert to DOS codepage before encryption.
+		 * Non-encrypted passwords - convert to DOS codepage before
+		 * encryption.
 		 */
 		passlen = 24;
-		SMBencrypt(pass,cli->secblob.data,(uchar *)pword);
+		SMBencrypt(pass, cli->secblob.data, (uchar *)pword);
 	} else {
-		if((cli->sec_mode & (NEGOTIATE_SECURITY_USER_LEVEL|NEGOTIATE_SECURITY_CHALLENGE_RESPONSE)) == 0) {
+		if((cli->sec_mode & (NEGOTIATE_SECURITY_USER_LEVEL
+				     |NEGOTIATE_SECURITY_CHALLENGE_RESPONSE))
+		   == 0) {
 			if (!lp_client_plaintext_auth() && (*pass)) {
 				DEBUG(1, ("Server requested plaintext "
 					  "password but 'client plaintext "
 					  "auth' is disabled\n"));
-				return False;
+				goto access_denied;
 			}
 
 			/*
-			 * Non-encrypted passwords - convert to DOS codepage before using.
+			 * Non-encrypted passwords - convert to DOS codepage
+			 * before using.
 			 */
-			passlen = clistr_push(cli, pword, pass, sizeof(pword), STR_TERMINATE);
-
+			passlen = clistr_push(cli, pword, pass, sizeof(pword),
+					      STR_TERMINATE);
 		} else {
 			if (passlen) {
 				memcpy(pword, pass, passlen);
@@ -1161,52 +1236,139 @@ bool cli_send_tconX(struct cli_state *cli,
 		}
 	}
 
-	slprintf(fullshare, sizeof(fullshare)-1,
-		 "\\\\%s\\%s", cli->desthost, share);
+	SCVAL(vwv+0, 0, 0xFF);
+	SCVAL(vwv+0, 1, 0);
+	SSVAL(vwv+1, 0, 0);
+	SSVAL(vwv+2, 0, TCONX_FLAG_EXTENDED_RESPONSE);
+	SSVAL(vwv+3, 0, passlen);
 
-	cli_set_message(cli->outbuf,4, 0, True);
-	SCVAL(cli->outbuf,smb_com,SMBtconX);
-	cli_setup_packet(cli);
+	if (passlen) {
+		bytes = (uint8_t *)talloc_memdup(talloc_tos(), pword, passlen);
+	} else {
+		bytes = talloc_array(talloc_tos(), uint8_t, 0);
+	}
 
-	SSVAL(cli->outbuf,smb_vwv0,0xFF);
-	SSVAL(cli->outbuf,smb_vwv2,TCONX_FLAG_EXTENDED_RESPONSE);
-	SSVAL(cli->outbuf,smb_vwv3,passlen);
+	/*
+	 * Add the sharename
+	 */
+	tmp = talloc_asprintf_strupper_m(talloc_tos(), "\\\\%s\\%s",
+					 cli->desthost, share);
+	if (tmp == NULL) {
+		TALLOC_FREE(bytes);
+		return NULL;
+	}
+	bytes = smb_bytes_push_str(bytes, cli_ucs2(cli), tmp, strlen(tmp)+1,
+				   NULL);
+	TALLOC_FREE(tmp);
 
-	p = smb_buf(cli->outbuf);
-	if (passlen) {
-		memcpy(p,pword,passlen);
+	/*
+	 * Add the devicetype
+	 */
+	tmp = talloc_strdup_upper(talloc_tos(), dev);
+	if (tmp == NULL) {
+		TALLOC_FREE(bytes);
+		return NULL;
 	}
-	p += passlen;
-	p += clistr_push(cli, p, fullshare, -1, STR_TERMINATE |STR_UPPER);
-	p += clistr_push(cli, p, dev, -1, STR_TERMINATE |STR_UPPER | STR_ASCII);
+	bytes = smb_bytes_push_str(bytes, false, tmp, strlen(tmp)+1, NULL);
+	TALLOC_FREE(tmp);
 
-	cli_setup_bcc(cli, p);
+	if (bytes == NULL) {
+		return NULL;
+	}
 
-	cli_send_smb(cli);
-	if (!cli_receive_smb(cli))
-		return False;
+	result = cli_request_send(mem_ctx, ev, cli, SMBtconX, 0,
+				  4, vwv, 0, talloc_get_size(bytes), bytes);
+	TALLOC_FREE(bytes);
+	return result;
 
-	if (cli_is_error(cli))
-		return False;
+ access_denied:
+	result = async_req_new(mem_ctx);
+	if (async_post_status(result, ev, NT_STATUS_ACCESS_DENIED)) {
+		return result;
+	}
+	TALLOC_FREE(result);
+	return NULL;
+}
 
-	clistr_pull(cli->inbuf, cli->dev, smb_buf(cli->inbuf), sizeof(fstring),
-		    -1, STR_TERMINATE|STR_ASCII);
+NTSTATUS cli_tcon_andx_recv(struct async_req *req)
+{
+	struct cli_request *cli_req = talloc_get_type_abort(
+		req->private_data, struct cli_request);
+	struct cli_state *cli = cli_req->cli;
+	uint8_t wct;
+	uint16_t *vwv;
+	uint16_t num_bytes;
+	uint8_t *bytes;
+	NTSTATUS status;
 
-	if (cli->protocol >= PROTOCOL_NT1 &&
-	    smb_buflen(cli->inbuf) == 3) {
+	if (async_req_is_error(req, &status)) {
+		return status;
+	}
+
+	status = cli_pull_reply(req, &wct, &vwv, &num_bytes, &bytes);
+	if (!NT_STATUS_IS_OK(status)) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list