[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Wed Nov 30 07:14:03 MST 2011


The branch, master has been updated
       via  4afbda2 s4:libcli/raw: implement on top of smbXcli_conn/req
       via  99ef6a4 s4:libcli: do the nbss session request within smbcli_sock_connect_*()
       via  52dd549 s4:libcli/raw: remove unused functions
       via  b21f344 s4:libcli: use smbcli_sock_connect() in smbcli_socket_connect()
       via  4877be53 s4:libcli: move smbcli_transport_establish() logic into smbcli_socket_connect()
       via  b51c92a s4:libcli: convert smbcli_transport_connect_* to tevent_req
       via  706e108 s4:lib/socket: add socket_connect_multi_ex_*
      from  99f2177 s3-ctdb: Make use of CTDB_CONTROL_CHECK_SRVIDS

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


- Log -----------------------------------------------------------------
commit 4afbda221c20ffa36a1d1e37ef11f86073a49da6
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Sep 23 08:35:17 2011 +0200

    s4:libcli/raw: implement on top of smbXcli_conn/req
    
    metze
    
    Autobuild-User: Stefan Metzmacher <metze at samba.org>
    Autobuild-Date: Wed Nov 30 15:13:36 CET 2011 on sn-devel-104

commit 99ef6a4bec1058b3649e5e72f8ea85f6df93a154
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Nov 30 08:50:11 2011 +0100

    s4:libcli: do the nbss session request within smbcli_sock_connect_*()
    
    metze

commit 52dd549eb64ea9b79bd4cbeba0fa4183aad7bb4c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Nov 30 08:35:33 2011 +0100

    s4:libcli/raw: remove unused functions
    
    metze

commit b21f344079920194f94bbee7f44d8a6582e4d1a2
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Nov 30 08:33:29 2011 +0100

    s4:libcli: use smbcli_sock_connect() in smbcli_socket_connect()
    
    metze

commit 4877be53df1181f75d603fa4edc67c34e1ba5141
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Nov 30 07:17:31 2011 +0100

    s4:libcli: move smbcli_transport_establish() logic into smbcli_socket_connect()
    
    metze

commit b51c92a903877015acf268ab8ff0e07d3a82b295
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Nov 29 11:57:11 2011 +0100

    s4:libcli: convert smbcli_transport_connect_* to tevent_req
    
    metze

commit 706e10820d490e0865b73f66a8665951aa6a71e3
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Nov 29 16:25:03 2011 +0100

    s4:lib/socket: add socket_connect_multi_ex_*
    
    This add an async establish hook, that gets called
    before a connection success is detected.
    
    This can be used to do a NBT session request
    and it makes sure that we don't cancel the connection
    on port 445, just because the tcp connect on port
    139 worked.
    
    metze

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

Summary of changes:
 source4/client/client.c                  |   18 +-
 source4/lib/socket/connect_multi.c       |  129 ++++-
 source4/lib/socket/socket.h              |   28 +
 source4/libcli/cliconnect.c              |   46 +-
 source4/libcli/libcli.h                  |   10 +-
 source4/libcli/raw/clioplock.c           |   11 +-
 source4/libcli/raw/clisession.c          |    3 +-
 source4/libcli/raw/clisocket.c           |  407 ++++++-----
 source4/libcli/raw/clitransport.c        |  713 ++++++++++---------
 source4/libcli/raw/libcliraw.h           |   73 +--
 source4/libcli/raw/rawnegotiate.c        |  253 +++----
 source4/libcli/raw/rawnotify.c           |   64 +--
 source4/libcli/raw/rawreadwrite.c        |    6 -
 source4/libcli/raw/rawrequest.c          |  227 ++++---
 source4/libcli/raw/rawtrans.c            | 1126 ++++++++----------------------
 source4/libcli/raw/smb_signing.c         |  175 -----
 source4/libcli/smb2/connect.c            |   56 +-
 source4/libcli/smb_composite/connect.c   |   94 +--
 source4/libcli/smb_composite/sesssetup.c |   42 +-
 source4/librpc/rpc/dcerpc_smb.c          |   10 +-
 source4/ntvfs/cifs/vfs_cifs.c            |    3 +-
 source4/torture/basic/base.c             |   36 +-
 source4/torture/raw/lockbench.c          |   26 +-
 source4/torture/raw/openbench.c          |   25 +-
 24 files changed, 1486 insertions(+), 2095 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/client/client.c b/source4/client/client.c
index 57686bb..d7adc41 100644
--- a/source4/client/client.c
+++ b/source4/client/client.c
@@ -3184,6 +3184,7 @@ static int do_message_op(const char *netbios_name, const char *desthost,
 	struct nbt_name called, calling;
 	const char *server_name;
 	struct smbcli_state *cli;
+	bool ok;
 
 	make_nbt_name_client(&calling, netbios_name);
 
@@ -3191,17 +3192,18 @@ static int do_message_op(const char *netbios_name, const char *desthost,
 
 	server_name = destip ? destip : desthost;
 
-	if (!(cli = smbcli_state_init(NULL)) ||
-	    !smbcli_socket_connect(cli, server_name, destports,
-				   ev_ctx, resolve_ctx, options,
-                   socket_options)) {
-		d_printf("Connection to %s failed\n", server_name);
+	cli = smbcli_state_init(NULL);
+	if (cli == NULL) {
+		d_printf("smbcli_state_init() failed\n");
 		return 1;
 	}
 
-	if (!smbcli_transport_establish(cli, &calling, &called)) {
-		d_printf("session request failed\n");
-		talloc_free(cli);
+	ok = smbcli_socket_connect(cli, server_name, destports,
+				   ev_ctx, resolve_ctx, options,
+				   socket_options,
+				   &calling, &called);
+	if (!ok) {
+		d_printf("Connection to %s failed\n", server_name);
 		return 1;
 	}
 
diff --git a/source4/lib/socket/connect_multi.c b/source4/lib/socket/connect_multi.c
index 2b926c8..c8231b3 100644
--- a/source4/lib/socket/connect_multi.c
+++ b/source4/lib/socket/connect_multi.c
@@ -42,6 +42,8 @@ struct connect_multi_state {
 	uint16_t result_port;
 
 	int num_connects_sent, num_connects_recv;
+
+	struct socket_connect_multi_ex *ex;
 };
 
 /*
@@ -59,17 +61,19 @@ static void connect_multi_timer(struct tevent_context *ev,
 				    struct timeval tv, void *p);
 static void connect_multi_next_socket(struct composite_context *result);
 static void continue_one(struct composite_context *creq);
+static void continue_one_ex(struct tevent_req *subreq);
 
 /*
   setup an async socket_connect, with multiple ports
 */
-_PUBLIC_ struct composite_context *socket_connect_multi_send(
+_PUBLIC_ struct composite_context *socket_connect_multi_ex_send(
 						    TALLOC_CTX *mem_ctx,
 						    const char *server_name,
 						    int num_server_ports,
 						    uint16_t *server_ports,
 						    struct resolve_context *resolve_ctx,
-						    struct tevent_context *event_ctx)
+						    struct tevent_context *event_ctx,
+						    struct socket_connect_multi_ex *ex)
 {
 	struct composite_context *result;
 	struct connect_multi_state *multi;
@@ -95,6 +99,8 @@ _PUBLIC_ struct composite_context *socket_connect_multi_send(
 		multi->ports[i] = server_ports[i];
 	}
 
+	multi->ex = ex;
+
 	/*  
 	    we don't want to do the name resolution separately
 		    for each port, so start it now, then only start on
@@ -225,10 +231,61 @@ static void continue_one(struct composite_context *creq)
 	struct connect_multi_state *multi = talloc_get_type(result->private_data, 
 							    struct connect_multi_state);
 	NTSTATUS status;
-	multi->num_connects_recv++;
 
 	status = socket_connect_recv(creq);
 
+	if (multi->ex) {
+		struct tevent_req *subreq;
+
+		subreq = multi->ex->establish_send(state,
+						   result->event_ctx,
+						   state->sock,
+						   state->addr,
+						   multi->ex->private_data);
+		if (composite_nomem(subreq, result)) return;
+		tevent_req_set_callback(subreq, continue_one_ex, state);
+		return;
+	}
+
+	multi->num_connects_recv++;
+
+	if (NT_STATUS_IS_OK(status)) {
+		multi->sock = talloc_steal(multi, state->sock);
+		multi->result_port = state->addr->port;
+	}
+
+	talloc_free(state);
+
+	if (NT_STATUS_IS_OK(status) ||
+	    multi->num_connects_recv == (multi->num_address * multi->num_ports)) {
+		result->status = status;
+		composite_done(result);
+		return;
+	}
+
+	/* try the next port */
+	connect_multi_next_socket(result);
+}
+
+/*
+  one of our multi->ex->establish_send() calls hash finished. If it got a
+  connection or there are none left then we are done
+*/
+static void continue_one_ex(struct tevent_req *subreq)
+{
+	struct connect_one_state *state =
+		tevent_req_callback_data(subreq,
+		struct connect_one_state);
+	struct composite_context *result = state->result;
+	struct connect_multi_state *multi =
+		talloc_get_type_abort(result->private_data,
+		struct connect_multi_state);
+	NTSTATUS status;
+	multi->num_connects_recv++;
+
+	status = multi->ex->establish_recv(subreq);
+	TALLOC_FREE(subreq);
+
 	if (NT_STATUS_IS_OK(status)) {
 		multi->sock = talloc_steal(multi, state->sock);
 		multi->result_port = state->addr->port;
@@ -250,7 +307,7 @@ static void continue_one(struct composite_context *creq)
 /*
   async recv routine for socket_connect_multi()
  */
-_PUBLIC_ NTSTATUS socket_connect_multi_recv(struct composite_context *ctx,
+_PUBLIC_ NTSTATUS socket_connect_multi_ex_recv(struct composite_context *ctx,
 				   TALLOC_CTX *mem_ctx,
 				   struct socket_context **sock,
 				   uint16_t *port)
@@ -267,6 +324,55 @@ _PUBLIC_ NTSTATUS socket_connect_multi_recv(struct composite_context *ctx,
 	return status;
 }
 
+NTSTATUS socket_connect_multi_ex(TALLOC_CTX *mem_ctx,
+				 const char *server_address,
+				 int num_server_ports, uint16_t *server_ports,
+				 struct resolve_context *resolve_ctx,
+				 struct tevent_context *event_ctx,
+				 struct socket_connect_multi_ex *ex,
+				 struct socket_context **result,
+				 uint16_t *result_port)
+{
+	struct composite_context *ctx =
+		socket_connect_multi_ex_send(mem_ctx, server_address,
+					     num_server_ports, server_ports,
+					     resolve_ctx,
+					     event_ctx,
+					     ex);
+	return socket_connect_multi_ex_recv(ctx, mem_ctx, result, result_port);
+}
+
+/*
+  setup an async socket_connect, with multiple ports
+*/
+_PUBLIC_ struct composite_context *socket_connect_multi_send(
+						    TALLOC_CTX *mem_ctx,
+						    const char *server_name,
+						    int num_server_ports,
+						    uint16_t *server_ports,
+						    struct resolve_context *resolve_ctx,
+						    struct tevent_context *event_ctx)
+{
+	return socket_connect_multi_ex_send(mem_ctx,
+					    server_name,
+					    num_server_ports,
+					    server_ports,
+					    resolve_ctx,
+					    event_ctx,
+					    NULL); /* ex */
+}
+
+/*
+  async recv routine for socket_connect_multi()
+ */
+_PUBLIC_ NTSTATUS socket_connect_multi_recv(struct composite_context *ctx,
+				   TALLOC_CTX *mem_ctx,
+				   struct socket_context **sock,
+				   uint16_t *port)
+{
+	return socket_connect_multi_ex_recv(ctx, mem_ctx, sock, port);
+}
+
 NTSTATUS socket_connect_multi(TALLOC_CTX *mem_ctx,
 			      const char *server_address,
 			      int num_server_ports, uint16_t *server_ports,
@@ -275,10 +381,13 @@ NTSTATUS socket_connect_multi(TALLOC_CTX *mem_ctx,
 			      struct socket_context **result,
 			      uint16_t *result_port)
 {
-	struct composite_context *ctx =
-		socket_connect_multi_send(mem_ctx, server_address,
-					  num_server_ports, server_ports,
-					  resolve_ctx,
-					  event_ctx);
-	return socket_connect_multi_recv(ctx, mem_ctx, result, result_port);
+	return socket_connect_multi_ex(mem_ctx,
+				       server_address,
+				       num_server_ports,
+				       server_ports,
+				       resolve_ctx,
+				       event_ctx,
+				       NULL, /* ex */
+				       result,
+				       result_port);
 }
diff --git a/source4/lib/socket/socket.h b/source4/lib/socket/socket.h
index e00b61b..403a723 100644
--- a/source4/lib/socket/socket.h
+++ b/source4/lib/socket/socket.h
@@ -202,6 +202,34 @@ NTSTATUS socket_connect_ev(struct socket_context *sock,
 			   uint32_t flags, 
 			   struct tevent_context *ev);
 
+struct socket_connect_multi_ex {
+	void *private_data;
+	struct tevent_req *(*establish_send)(TALLOC_CTX *mem_ctx,
+					     struct tevent_context *ev,
+					     struct socket_context *sock,
+					     struct socket_address *addr,
+					     void *private_data);
+	NTSTATUS (*establish_recv)(struct tevent_req *req);
+};
+struct composite_context *socket_connect_multi_ex_send(TALLOC_CTX *mem_ctx,
+						       const char *server_address,
+						       int num_server_ports,
+						       uint16_t *server_ports,
+						       struct resolve_context *resolve_ctx,
+						       struct tevent_context *event_ctx,
+						       struct socket_connect_multi_ex *ex);
+NTSTATUS socket_connect_multi_ex_recv(struct composite_context *ctx,
+				      TALLOC_CTX *mem_ctx,
+				      struct socket_context **result,
+				      uint16_t *port);
+NTSTATUS socket_connect_multi_ex(TALLOC_CTX *mem_ctx, const char *server_address,
+				 int num_server_ports, uint16_t *server_ports,
+				 struct resolve_context *resolve_ctx,
+				 struct tevent_context *event_ctx,
+				 struct socket_connect_multi_ex *ex,
+				 struct socket_context **result,
+				 uint16_t *port);
+
 struct composite_context *socket_connect_multi_send(TALLOC_CTX *mem_ctx,
 						    const char *server_address,
 						    int num_server_ports,
diff --git a/source4/libcli/cliconnect.c b/source4/libcli/cliconnect.c
index d670324..45d8d2a 100644
--- a/source4/libcli/cliconnect.c
+++ b/source4/libcli/cliconnect.c
@@ -35,35 +35,47 @@ bool smbcli_socket_connect(struct smbcli_state *cli, const char *server,
 			   struct tevent_context *ev_ctx,
 			   struct resolve_context *resolve_ctx,
 			   struct smbcli_options *options,
-               const char *socket_options)
+			   const char *socket_options,
+			   struct nbt_name *calling,
+			   struct nbt_name *called)
 {
-	struct smbcli_socket *sock;
-
-	sock = smbcli_sock_connect_byname(server, ports, NULL,
-					  resolve_ctx, ev_ctx,
-                      socket_options);
+	NTSTATUS status;
 
-	if (sock == NULL) return false;
-	
-	cli->transport = smbcli_transport_init(sock, cli, true, options);
-	if (!cli->transport) {
+	cli->options = *options;
+
+	status = smbcli_sock_connect(cli,
+				     NULL, /* host_addr */
+				     ports,
+				     server,
+				     resolve_ctx,
+				     ev_ctx,
+				     socket_options,
+				     calling,
+				     called,
+				     &cli->sock);
+	if (!NT_STATUS_IS_OK(status)) {
 		return false;
 	}
 
 	return true;
 }
 
-/* wrapper around smbcli_transport_connect() */
-bool smbcli_transport_establish(struct smbcli_state *cli, 
-				struct nbt_name *calling,
-				struct nbt_name *called)
-{
-	return smbcli_transport_connect(cli->transport, calling, called);
-}
-
 /* wrapper around smb_raw_negotiate() */
 NTSTATUS smbcli_negprot(struct smbcli_state *cli, bool unicode, int maxprotocol)
 {
+	if (unicode) {
+		cli->options.unicode = 1;
+	} else {
+		cli->options.unicode = 0;
+	}
+
+	cli->transport = smbcli_transport_init(cli->sock, cli,
+					       true, &cli->options);
+	cli->sock = NULL;
+	if (!cli->transport) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
 	return smb_raw_negotiate(cli->transport, unicode, maxprotocol);
 }
 
diff --git a/source4/libcli/libcli.h b/source4/libcli/libcli.h
index 81a31d1..9e81740 100644
--- a/source4/libcli/libcli.h
+++ b/source4/libcli/libcli.h
@@ -22,6 +22,7 @@
 #define __LIBCLI_H__
 
 #include "librpc/gen_ndr/nbt.h"
+#include "libcli/raw/libcliraw.h"
 
 struct substitute_context;
 
@@ -30,6 +31,8 @@ struct substitute_context;
    i.e. a single session on a single socket. 
  */
 struct smbcli_state {
+	struct smbcli_options options;
+	struct smbcli_socket *sock; /* NULL if connected */
 	struct smbcli_transport *transport;
 	struct smbcli_session *session;
 	struct smbcli_tree *tree;
@@ -88,10 +91,9 @@ bool smbcli_socket_connect(struct smbcli_state *cli, const char *server,
 			   struct tevent_context *ev_ctx,
 			   struct resolve_context *resolve_ctx,
 			   struct smbcli_options *options,
-               const char *socket_options);
-bool smbcli_transport_establish(struct smbcli_state *cli, 
-				struct nbt_name *calling,
-				struct nbt_name *called);
+			   const char *socket_options,
+			   struct nbt_name *calling,
+			   struct nbt_name *called);
 NTSTATUS smbcli_negprot(struct smbcli_state *cli, bool unicode, int maxprotocol);
 NTSTATUS smbcli_session_setup(struct smbcli_state *cli, 
 			      struct cli_credentials *credentials,
diff --git a/source4/libcli/raw/clioplock.c b/source4/libcli/raw/clioplock.c
index 42ac6b5..396ab96 100644
--- a/source4/libcli/raw/clioplock.c
+++ b/source4/libcli/raw/clioplock.c
@@ -40,11 +40,12 @@ _PUBLIC_ bool smbcli_oplock_ack(struct smbcli_tree *tree, uint16_t fnum, uint16_
 	SSVAL(req->out.vwv,VWV(6),0);
 	SSVAL(req->out.vwv,VWV(7),0);
 
-	/* this request does not expect a reply, so tell the signing
-	   subsystem not to allocate an id for a reply */
-	req->one_way_request = 1;
-
-	ret = smbcli_request_send(req);	
+	/*
+	 * The low level code knows it is a
+	 * one way request by looking at SMBlockingX,
+	 * wct == 8 and LOCKING_ANDX_OPLOCK_RELEASE
+	 */
+	ret = smbcli_request_send(req);
 
 	return ret;
 }
diff --git a/source4/libcli/raw/clisession.c b/source4/libcli/raw/clisession.c
index 41765bf..d68f309 100644
--- a/source4/libcli/raw/clisession.c
+++ b/source4/libcli/raw/clisession.c
@@ -23,6 +23,7 @@
 #include "libcli/raw/libcliraw.h"
 #include "libcli/raw/raw_proto.h"
 #include "system/filesys.h"
+#include "../libcli/smb/smbXcli_base.h"
 
 #define SETUP_REQUEST_SESSION(cmd, wct, buflen) do { \
 	req = smbcli_request_setup_session(session, cmd, wct, buflen); \
@@ -68,7 +69,7 @@ struct smbcli_session *smbcli_session_init(struct smbcli_transport *transport,
 	if (capabilities & CAP_EXTENDED_SECURITY) {
 		flags2 |= FLAGS2_EXTENDED_SECURITY;
 	}
-	if (session->transport->negotiate.sign_info.doing_signing) {
+	if (smb1cli_conn_signing_is_active(session->transport->conn)) {
 		flags2 |= FLAGS2_SMB_SECURITY_SIGNATURES;
 	}
 
diff --git a/source4/libcli/raw/clisocket.c b/source4/libcli/raw/clisocket.c
index 70a83a4..dd3ea39 100644
--- a/source4/libcli/raw/clisocket.c
+++ b/source4/libcli/raw/clisocket.c
@@ -21,6 +21,9 @@
 */
 
 #include "includes.h"
+#include "system/network.h"
+#include "../lib/async_req/async_sock.h"
+#include "../lib/util/tevent_ntstatus.h"
 #include "lib/events/events.h"
 #include "libcli/raw/libcliraw.h"
 #include "libcli/composite/composite.h"
@@ -28,128 +31,220 @@
 #include "libcli/resolve/resolve.h"
 #include "param/param.h"
 #include "libcli/raw/raw_proto.h"
+#include "../libcli/smb/read_smb.h"
 
-/*
-  send a session request
-*/
-struct smbcli_request *smbcli_transport_connect_send(struct smbcli_transport *transport,
-						     struct nbt_name *calling, 
-						     struct nbt_name *called)
+struct smbcli_transport_connect_state {
+	struct tevent_context *ev;
+	struct socket_context *sock;
+	uint8_t *request;
+	struct iovec iov;
+	uint8_t *response;
+};
+
+static void smbcli_transport_connect_writev_done(struct tevent_req *subreq);
+static void smbcli_transport_connect_read_smb_done(struct tevent_req *subreq);
+
+static struct tevent_req *smbcli_transport_connect_send(TALLOC_CTX *mem_ctx,
+						 struct tevent_context *ev,
+						 struct socket_context *sock,
+						 uint16_t port,
+						 uint32_t timeout_msec,
+						 struct nbt_name *calling,
+						 struct nbt_name *called)
 {
-	uint8_t *p;
-	struct smbcli_request *req;
+	struct tevent_req *req;
+	struct smbcli_transport_connect_state *state;
+	struct tevent_req *subreq;
 	DATA_BLOB calling_blob, called_blob;
-	TALLOC_CTX *tmp_ctx = talloc_new(transport);
+	uint8_t *p;
 	NTSTATUS status;
 
-	status = nbt_name_dup(transport, called, &transport->called);
-	if (!NT_STATUS_IS_OK(status)) goto failed;
-	
-	status = nbt_name_to_blob(tmp_ctx, &calling_blob, calling);
-	if (!NT_STATUS_IS_OK(status)) goto failed;
+	req = tevent_req_create(mem_ctx, &state,
+				struct smbcli_transport_connect_state);
+	if (req == NULL) {
+		return NULL;
+	}
+	state->ev = ev;
+	state->sock = sock;
 
-	status = nbt_name_to_blob(tmp_ctx, &called_blob, called);
-	if (!NT_STATUS_IS_OK(status)) goto failed;
+	if (port != 139) {
+		tevent_req_done(req);
+		return tevent_req_post(req, ev);
+	}
 
-  	/* allocate output buffer */
-	req = smbcli_request_setup_nonsmb(transport, 
-					  NBT_HDR_SIZE + 
-					  calling_blob.length + called_blob.length);
-	if (req == NULL) goto failed;
+	status = nbt_name_to_blob(state, &calling_blob, calling);
+	if (tevent_req_nterror(req, status)) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list