[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Fri Mar 5 06:09:30 MST 2010


The branch, master has been updated
       via  013184a... s4:libcli/wrepl: convert wrepl_associate_stop_send to tevent_req
       via  28033bf... s4:libcli/wrepl: convert wrepl_connect_send to tevent_req
       via  883b109... s4:libcli/wrepl: convert wrepl_associate_send to tevent_req
       via  2e24def... s4:libcli/wrepl: convert wrepl_pull_table_send to tevent_req
       via  50f1dc9... s4:libcli/wrepl: convert wrepl_pull_names_send to tevent_req
       via  1a8815a... s4:libcli/wrepl: use UTIL_TEVENT
       via  0dfc778... s4:libcli/wrepl: avoid neested named structures
       via  4c51c07... s4:torture/nbt: avoid the usage of wrepl_pull_table_send()
      from  6eedba1... libcli/auth: add a const to des_crypt112_16()

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


- Log -----------------------------------------------------------------
commit 013184a1822d2117078f9e0b89a3471a692cbded
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 3 18:35:55 2010 +0100

    s4:libcli/wrepl: convert wrepl_associate_stop_send to tevent_req
    
    metze

commit 28033bf635f0925f24e5f5f580e8ff8830338441
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 3 17:18:23 2010 +0100

    s4:libcli/wrepl: convert wrepl_connect_send to tevent_req
    
    metze

commit 883b10983ba3d1c4d0f692b9c661316d8027a83b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 3 18:38:16 2010 +0100

    s4:libcli/wrepl: convert wrepl_associate_send to tevent_req
    
    metze

commit 2e24def8063f15f6d29fae667e7d1c50b90d1cd5
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 3 15:14:28 2010 +0100

    s4:libcli/wrepl: convert wrepl_pull_table_send to tevent_req
    
    metze

commit 50f1dc9db8fbe0da7a6c6d5dde54da08994be318
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 3 15:12:05 2010 +0100

    s4:libcli/wrepl: convert wrepl_pull_names_send to tevent_req
    
    metze

commit 1a8815abd32b1a888c4fc202000891233f9437fe
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 3 13:38:08 2010 +0100

    s4:libcli/wrepl: use UTIL_TEVENT
    
    metze

commit 0dfc77891509f056352748e3082794cb360200c7
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 3 09:45:01 2010 +0100

    s4:libcli/wrepl: avoid neested named structures
    
    metze

commit 4c51c073806048c6ad65e2ea44877a144f560699
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Mar 3 11:31:03 2010 +0100

    s4:torture/nbt: avoid the usage of wrepl_pull_table_send()
    
    metze

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

Summary of changes:
 source4/libcli/config.mk                 |    2 +-
 source4/libcli/wrepl/winsrepl.c          |  748 +++++++++++++++++++++---------
 source4/libcli/wrepl/winsrepl.h          |   34 +-
 source4/torture/nbt/winsreplication.c    |    9 +-
 source4/wrepl_server/wrepl_out_helpers.c |  114 +++--
 5 files changed, 606 insertions(+), 301 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/libcli/config.mk b/source4/libcli/config.mk
index f67250d..68d4b74 100644
--- a/source4/libcli/config.mk
+++ b/source4/libcli/config.mk
@@ -58,7 +58,7 @@ LIBCLI_DGRAM_OBJ_FILES = $(addprefix $(libclisrcdir)/dgram/, \
 	browse.o)
 
 [SUBSYSTEM::LIBCLI_WREPL]
-PUBLIC_DEPENDENCIES = NDR_WINSREPL samba_socket LIBEVENTS LIBPACKET
+PUBLIC_DEPENDENCIES = NDR_WINSREPL samba_socket LIBEVENTS LIBPACKET UTIL_TEVENT
 
 LIBCLI_WREPL_OBJ_FILES = $(libclisrcdir)/wrepl/winsrepl.o
 
diff --git a/source4/libcli/wrepl/winsrepl.c b/source4/libcli/wrepl/winsrepl.c
index 849511b..4fd21aa 100644
--- a/source4/libcli/wrepl/winsrepl.c
+++ b/source4/libcli/wrepl/winsrepl.c
@@ -30,6 +30,7 @@
 #include "system/network.h"
 #include "lib/socket/netif.h"
 #include "param/param.h"
+#include "lib/util/tevent_ntstatus.h"
 
 static struct wrepl_request *wrepl_request_finished(struct wrepl_request *req, NTSTATUS status);
 
@@ -266,34 +267,89 @@ static NTSTATUS wrepl_request_wait(struct wrepl_request *req)
 	return req->status;
 }
 
+const char *wrepl_best_ip(struct loadparm_context *lp_ctx, const char *peer_ip)
+{
+	struct interface *ifaces;
+	load_interfaces(lp_ctx, lp_interfaces(lp_ctx), &ifaces);
+	return iface_best_ip(ifaces, peer_ip);
+}
+
 struct wrepl_connect_state {
-	struct composite_context *result;
 	struct wrepl_socket *wrepl_socket;
-	struct composite_context *creq;
 };
 
-/*
-  handler for winrepl connection completion
-*/
-static void wrepl_connect_handler(struct composite_context *creq)
+static void wrepl_connect_handler(struct composite_context *creq);
+
+struct tevent_req *wrepl_connect_send(TALLOC_CTX *mem_ctx,
+				      struct tevent_context *ev,
+				      struct wrepl_socket *wrepl_socket,
+				      const char *our_ip, const char *peer_ip)
+{
+	struct tevent_req *req;
+	struct wrepl_connect_state *state;
+	struct composite_context *subreq;
+	struct socket_address *peer, *us;
+
+	req = tevent_req_create(mem_ctx, &state,
+				struct wrepl_connect_state);
+	if (req == NULL) {
+		return NULL;
+	}
+
+	state->wrepl_socket	= wrepl_socket;
+
+	us = socket_address_from_strings(state, wrepl_socket->sock->backend_name,
+					 our_ip, 0);
+	if (tevent_req_nomem(us, req)) {
+		return tevent_req_post(req, ev);
+	}
+
+	peer = socket_address_from_strings(state, wrepl_socket->sock->backend_name,
+					   peer_ip, WINS_REPLICATION_PORT);
+	if (tevent_req_nomem(peer, req)) {
+		return tevent_req_post(req, ev);
+	}
+
+	subreq = socket_connect_send(wrepl_socket->sock, us, peer,
+				     0, wrepl_socket->event.ctx);
+	if (tevent_req_nomem(subreq, req)) {
+		return tevent_req_post(req, ev);
+	}
+
+	subreq->async.fn = wrepl_connect_handler;
+	subreq->async.private_data = req;
+
+	return req;
+}
+
+static void wrepl_connect_handler(struct composite_context *subreq)
 {
-	struct wrepl_connect_state *state = talloc_get_type(creq->async.private_data, 
+	struct tevent_req *req = talloc_get_type_abort(subreq->async.private_data,
+				 struct tevent_req);
+	struct wrepl_connect_state *state = tevent_req_data(req,
 					    struct wrepl_connect_state);
 	struct wrepl_socket *wrepl_socket = state->wrepl_socket;
-	struct composite_context *result = state->result;
+	NTSTATUS status;
 
-	result->status = socket_connect_recv(state->creq);
-	if (!composite_is_ok(result)) return;
+	status = socket_connect_recv(subreq);
+	if (!NT_STATUS_IS_OK(status)) {
+		tevent_req_nterror(req, status);
+		return;
+	}
 
 	wrepl_socket->event.fde = event_add_fd(wrepl_socket->event.ctx, wrepl_socket, 
 					       socket_get_fd(wrepl_socket->sock), 
 					       EVENT_FD_READ,
 					       wrepl_handler, wrepl_socket);
-	if (composite_nomem(wrepl_socket->event.fde, result)) return;
+	if (tevent_req_nomem(wrepl_socket->event.fde, req)) {
+		return;
+	}
 
 	/* setup the stream -> packet parser */
 	wrepl_socket->packet = packet_init(wrepl_socket);
-	if (composite_nomem(wrepl_socket->packet, result)) return;
+	if (tevent_req_nomem(wrepl_socket->packet, req)) {
+		return;
+	}
 	packet_set_private(wrepl_socket->packet, wrepl_socket);
 	packet_set_socket(wrepl_socket->packet, wrepl_socket->sock);
 	packet_set_callback(wrepl_socket->packet, wrepl_finish_recv);
@@ -303,69 +359,27 @@ static void wrepl_connect_handler(struct composite_context *creq)
 	packet_set_fde(wrepl_socket->packet, wrepl_socket->event.fde);
 	packet_set_serialise(wrepl_socket->packet);
 
-	composite_done(result);
-}
-
-const char *wrepl_best_ip(struct loadparm_context *lp_ctx, const char *peer_ip)
-{
-	struct interface *ifaces;
-	load_interfaces(lp_ctx, lp_interfaces(lp_ctx), &ifaces);
-	return iface_best_ip(ifaces, peer_ip);
-}
-
-
-/*
-  connect a wrepl_socket to a WINS server
-*/
-struct composite_context *wrepl_connect_send(struct wrepl_socket *wrepl_socket,
-					     const char *our_ip, const char *peer_ip)
-{
-	struct composite_context *result;
-	struct wrepl_connect_state *state;
-	struct socket_address *peer, *us;
-
-	result = talloc_zero(wrepl_socket, struct composite_context);
-	if (!result) return NULL;
-
-	result->state		= COMPOSITE_STATE_IN_PROGRESS;
-	result->event_ctx	= wrepl_socket->event.ctx;
-
-	state = talloc_zero(result, struct wrepl_connect_state);
-	if (composite_nomem(state, result)) return result;
-	result->private_data	= state;
-	state->result		= result;
-	state->wrepl_socket	= wrepl_socket;
-
-	us = socket_address_from_strings(state, wrepl_socket->sock->backend_name, 
-					 our_ip, 0);
-	if (composite_nomem(us, result)) return result;
-
-	peer = socket_address_from_strings(state, wrepl_socket->sock->backend_name, 
-					   peer_ip, WINS_REPLICATION_PORT);
-	if (composite_nomem(peer, result)) return result;
-
-	state->creq = socket_connect_send(wrepl_socket->sock, us, peer,
-					  0, wrepl_socket->event.ctx);
-	composite_continue(result, state->creq, wrepl_connect_handler, state);
-	return result;
+	tevent_req_done(req);
 }
 
 /*
   connect a wrepl_socket to a WINS server - recv side
 */
-NTSTATUS wrepl_connect_recv(struct composite_context *result)
+NTSTATUS wrepl_connect_recv(struct tevent_req *req)
 {
-	struct wrepl_connect_state *state = talloc_get_type(result->private_data,
+	struct wrepl_connect_state *state = tevent_req_data(req,
 					    struct wrepl_connect_state);
 	struct wrepl_socket *wrepl_socket = state->wrepl_socket;
-	NTSTATUS status = composite_wait(result);
+	NTSTATUS status;
 
-	if (!NT_STATUS_IS_OK(status)) {
+	if (tevent_req_is_nterror(req, &status)) {
 		wrepl_socket_dead(wrepl_socket, status);
+		tevent_req_received(req);
+		return status;
 	}
 
-	talloc_free(result);
-	return status;
+	tevent_req_received(req);
+	return NT_STATUS_OK;
 }
 
 /*
@@ -374,8 +388,25 @@ NTSTATUS wrepl_connect_recv(struct composite_context *result)
 NTSTATUS wrepl_connect(struct wrepl_socket *wrepl_socket,
 		       const char *our_ip, const char *peer_ip)
 {
-	struct composite_context *c_req = wrepl_connect_send(wrepl_socket, our_ip, peer_ip);
-	return wrepl_connect_recv(c_req);
+	struct tevent_req *subreq;
+	bool ok;
+	NTSTATUS status;
+
+	subreq = wrepl_connect_send(wrepl_socket, wrepl_socket->event.ctx,
+				    wrepl_socket, our_ip, peer_ip);
+	NT_STATUS_HAVE_NO_MEMORY(subreq);
+
+	ok = tevent_req_poll(subreq, wrepl_socket->event.ctx);
+	if (!ok) {
+		TALLOC_FREE(subreq);
+		return NT_STATUS_INTERNAL_ERROR;
+	}
+
+	status = wrepl_connect_recv(subreq);
+	TALLOC_FREE(subreq);
+	NT_STATUS_NOT_OK_RETURN(status);
+
+	return NT_STATUS_OK;
 }
 
 /* 
@@ -557,22 +588,39 @@ NTSTATUS wrepl_request(struct wrepl_socket *wrepl_socket,
 }
 
 
-/*
-  setup an association - send
-*/
-struct wrepl_request *wrepl_associate_send(struct wrepl_socket *wrepl_socket,
-					   struct wrepl_associate *io)
+struct wrepl_associate_state {
+	struct wrepl_packet packet;
+	uint32_t assoc_ctx;
+	uint16_t major_version;
+};
+
+static void wrepl_associate_done(struct wrepl_request *subreq);
+
+struct tevent_req *wrepl_associate_send(TALLOC_CTX *mem_ctx,
+					struct tevent_context *ev,
+					struct wrepl_socket *wrepl_socket,
+					const struct wrepl_associate *io)
 {
-	struct wrepl_packet *packet;
-	struct wrepl_request *req;
+	struct tevent_req *req;
+	struct wrepl_associate_state *state;
+	struct wrepl_request *subreq;
+
+	if (wrepl_socket->event.ctx != ev) {
+		/* TODO: remove wrepl_socket->event.ctx !!! */
+		smb_panic("wrepl_associate_send event context mismatch!");
+		return NULL;
+	}
 
-	packet = talloc_zero(wrepl_socket, struct wrepl_packet);
-	if (packet == NULL) return NULL;
+	req = tevent_req_create(mem_ctx, &state,
+				struct wrepl_associate_state);
+	if (req == NULL) {
+		return NULL;
+	};
 
-	packet->opcode                      = WREPL_OPCODE_BITS;
-	packet->mess_type                   = WREPL_START_ASSOCIATION;
-	packet->message.start.minor_version = 2;
-	packet->message.start.major_version = 5;
+	state->packet.opcode				= WREPL_OPCODE_BITS;
+	state->packet.mess_type				= WREPL_START_ASSOCIATION;
+	state->packet.message.start.minor_version	= 2;
+	state->packet.message.start.major_version	= 5;
 
 	/*
 	 * nt4 uses 41 bytes for the start_association call
@@ -582,39 +630,68 @@ struct wrepl_request *wrepl_associate_send(struct wrepl_socket *wrepl_socket,
 	 * if we don't do this nt4 uses an old version of the wins replication protocol
 	 * and that would break nt4 <-> samba replication
 	 */
-	packet->padding	= data_blob_talloc(packet, NULL, 21);
-	if (packet->padding.data == NULL) {
-		talloc_free(packet);
-		return NULL;
+	state->packet.padding	= data_blob_talloc(state, NULL, 21);
+	if (tevent_req_nomem(state->packet.padding.data, req)) {
+		return tevent_req_post(req, ev);
 	}
-	memset(packet->padding.data, 0, packet->padding.length);
+	memset(state->packet.padding.data, 0, state->packet.padding.length);
 
-	req = wrepl_request_send(wrepl_socket, packet, NULL);
+	subreq = wrepl_request_send(wrepl_socket, &state->packet, NULL);
+	if (tevent_req_nomem(subreq, req)) {
+		return tevent_req_post(req, ev);
+	}
+	subreq->async.fn = wrepl_associate_done;
+	subreq->async.private_data = req;
 
-	talloc_free(packet);
+	return req;
+}
+
+static void wrepl_associate_done(struct wrepl_request *subreq)
+{
+	struct tevent_req *req = talloc_get_type_abort(subreq->async.private_data,
+				 struct tevent_req);
+	struct wrepl_associate_state *state = tevent_req_data(req,
+					      struct wrepl_associate_state);
+	NTSTATUS status;
+	struct wrepl_packet *packet;
+
+	status = wrepl_request_recv(subreq, state, &packet);
+	if (!NT_STATUS_IS_OK(status)) {
+		tevent_req_nterror(req, status);
+		return;
+	}
+
+	if (packet->mess_type != WREPL_START_ASSOCIATION_REPLY) {
+		tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
+		return;
+	}
 
-	return req;	
+	state->assoc_ctx = packet->message.start_reply.assoc_ctx;
+	state->major_version = packet->message.start_reply.major_version;
+
+	tevent_req_done(req);
 }
 
 /*
   setup an association - recv
 */
-NTSTATUS wrepl_associate_recv(struct wrepl_request *req,
+NTSTATUS wrepl_associate_recv(struct tevent_req *req,
 			      struct wrepl_associate *io)
 {
-	struct wrepl_packet *packet=NULL;
+	struct wrepl_associate_state *state = tevent_req_data(req,
+					      struct wrepl_associate_state);
 	NTSTATUS status;
-	status = wrepl_request_recv(req, req->wrepl_socket, &packet);
-	NT_STATUS_NOT_OK_RETURN(status);
-	if (packet->mess_type != WREPL_START_ASSOCIATION_REPLY) {
-		status = NT_STATUS_UNEXPECTED_NETWORK_ERROR;
-	}
-	if (NT_STATUS_IS_OK(status)) {
-		io->out.assoc_ctx = packet->message.start_reply.assoc_ctx;
-		io->out.major_version = packet->message.start_reply.major_version;
+
+	if (tevent_req_is_nterror(req, &status)) {
+		tevent_req_received(req);
+		return status;
 	}
-	talloc_free(packet);
-	return status;
+
+	io->out.assoc_ctx = state->assoc_ctx;
+	io->out.major_version = state->major_version;
+
+	tevent_req_received(req);
+	return NT_STATUS_OK;
 }
 
 /*
@@ -623,54 +700,108 @@ NTSTATUS wrepl_associate_recv(struct wrepl_request *req,
 NTSTATUS wrepl_associate(struct wrepl_socket *wrepl_socket,
 			 struct wrepl_associate *io)
 {
-	struct wrepl_request *req = wrepl_associate_send(wrepl_socket, io);
-	return wrepl_associate_recv(req, io);
+	struct tevent_req *subreq;
+	bool ok;
+	NTSTATUS status;
+
+	subreq = wrepl_associate_send(wrepl_socket, wrepl_socket->event.ctx,
+				      wrepl_socket, io);
+	NT_STATUS_HAVE_NO_MEMORY(subreq);
+
+	ok = tevent_req_poll(subreq, wrepl_socket->event.ctx);
+	if (!ok) {
+		TALLOC_FREE(subreq);
+		return NT_STATUS_INTERNAL_ERROR;
+	}
+
+	status = wrepl_associate_recv(subreq, io);
+	TALLOC_FREE(subreq);
+	NT_STATUS_NOT_OK_RETURN(status);
+
+	return NT_STATUS_OK;
 }
 
+struct wrepl_associate_stop_state {
+	struct wrepl_packet packet;
+	struct wrepl_send_ctrl ctrl;
+};
 
-/*
-  stop an association - send
-*/
-struct wrepl_request *wrepl_associate_stop_send(struct wrepl_socket *wrepl_socket,
-						struct wrepl_associate_stop *io)
+static void wrepl_associate_stop_done(struct wrepl_request *subreq);
+
+struct tevent_req *wrepl_associate_stop_send(TALLOC_CTX *mem_ctx,
+					     struct tevent_context *ev,
+					     struct wrepl_socket *wrepl_socket,
+					     const struct wrepl_associate_stop *io)
 {
-	struct wrepl_packet *packet;
-	struct wrepl_request *req;
-	struct wrepl_send_ctrl ctrl;
+	struct tevent_req *req;
+	struct wrepl_associate_stop_state *state;
+	struct wrepl_request *subreq;
+
+	if (wrepl_socket->event.ctx != ev) {
+		/* TODO: remove wrepl_socket->event.ctx !!! */
+		smb_panic("wrepl_associate_stop_send event context mismatch!");
+		return NULL;
+	}
 
-	packet = talloc_zero(wrepl_socket, struct wrepl_packet);
-	if (packet == NULL) return NULL;
+	req = tevent_req_create(mem_ctx, &state,
+				struct wrepl_associate_stop_state);
+	if (req == NULL) {
+		return NULL;
+	};
 
-	packet->opcode			= WREPL_OPCODE_BITS;
-	packet->assoc_ctx		= io->in.assoc_ctx;
-	packet->mess_type		= WREPL_STOP_ASSOCIATION;
-	packet->message.stop.reason	= io->in.reason;
+	state->packet.opcode			= WREPL_OPCODE_BITS;
+	state->packet.assoc_ctx			= io->in.assoc_ctx;
+	state->packet.mess_type			= WREPL_STOP_ASSOCIATION;
+	state->packet.message.stop.reason	= io->in.reason;
 
-	ZERO_STRUCT(ctrl);
 	if (io->in.reason == 0) {
-		ctrl.send_only			= true;
-		ctrl.disconnect_after_send	= true;
+		state->ctrl.send_only			= true;
+		state->ctrl.disconnect_after_send	= true;
 	}
 
-	req = wrepl_request_send(wrepl_socket, packet, &ctrl);
+	subreq = wrepl_request_send(wrepl_socket, &state->packet, &state->ctrl);
+	if (tevent_req_nomem(subreq, req)) {
+		return tevent_req_post(req, ev);
+	}
+	subreq->async.fn = wrepl_associate_stop_done;
+	subreq->async.private_data = req;
 
-	talloc_free(packet);
+	return req;
+}
 
-	return req;	
+static void wrepl_associate_stop_done(struct wrepl_request *subreq)
+{
+	struct tevent_req *req = talloc_get_type_abort(subreq->async.private_data,
+				 struct tevent_req);
+	struct wrepl_associate_stop_state *state = tevent_req_data(req,
+						   struct wrepl_associate_stop_state);
+	NTSTATUS status;
+
+	/* currently we don't care about a possible response */
+	status = wrepl_request_recv(subreq, state, NULL);
+	if (!NT_STATUS_IS_OK(status)) {
+		tevent_req_nterror(req, status);
+		return;
+	}
+
+	tevent_req_done(req);
 }
 
 /*
   stop an association - recv
 */
-NTSTATUS wrepl_associate_stop_recv(struct wrepl_request *req,
+NTSTATUS wrepl_associate_stop_recv(struct tevent_req *req,
 				   struct wrepl_associate_stop *io)
 {
-	struct wrepl_packet *packet=NULL;
 	NTSTATUS status;
-	status = wrepl_request_recv(req, req->wrepl_socket, &packet);
-	NT_STATUS_NOT_OK_RETURN(status);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list