[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