[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha6-1156-g25df6d7

Volker Lendecke vlendec at samba.org
Tue Feb 24 19:41:25 GMT 2009


The branch, master has been updated
       via  25df6d74131b8b9bd8924ca70eb891ff97d3ddfd (commit)
       via  a60480b71ad7cdaa495b7624f04bc477a3330cbf (commit)
       via  08f028f179f474f83d46b1a23d1cfbd8848b68b0 (commit)
       via  bbbdfa20566a607e0fdfdd190bb12bc3130e8bee (commit)
       via  5766bf896cf85d17023410addb540ebbbef366dd (commit)
       via  008901827058251a31de99426858f87c77bcf23b (commit)
       via  202a31d96d9abaf09716bad4c57caf38ef03cc81 (commit)
       via  5d653f69de27ee22137333bc319ae2d7e60e56b0 (commit)
       via  4021029cddddcb23c41cd7f8b711f3a8d83c3931 (commit)
       via  f9df355befdef7c424ebc70abfeb696de095235e (commit)
       via  e50075a5804204068f07cb82337d3a251b368245 (commit)
       via  70f788ba7ea7ffa4d0808d0a299d98ee894a89a2 (commit)
       via  ae1a0b553414dafbe7a0aa38581a352b202e1411 (commit)
       via  53b059fc52c0908d4f8cbc98510b10d96850dcc6 (commit)
       via  76c6330dfb78e536bc7620719d12859ff7418c36 (commit)
       via  39976035ebd669d168afa91274d7e368305bf69d (commit)
       via  70814474f55befc1617e1162a23d14838ba451a3 (commit)
       via  c50233695e002d9f7c872821f7b90cdea632dd30 (commit)
       via  dbc79381a87269e8ca0631e001aebb064ab4851b (commit)
      from  365925eea308673f15e03d81b69f04b8908468e7 (commit)

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


- Log -----------------------------------------------------------------
commit 25df6d74131b8b9bd8924ca70eb891ff97d3ddfd
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Feb 23 08:56:35 2009 +0100

    Add more conventional async_recv

commit a60480b71ad7cdaa495b7624f04bc477a3330cbf
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Feb 23 08:53:01 2009 +0100

    Add more conventional async_send

commit 08f028f179f474f83d46b1a23d1cfbd8848b68b0
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Feb 23 00:21:27 2009 +0100

    Remove unused param_connect struct

commit bbbdfa20566a607e0fdfdd190bb12bc3130e8bee
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Feb 23 00:20:24 2009 +0100

    Remove unused recvall

commit 5766bf896cf85d17023410addb540ebbbef366dd
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Feb 23 00:18:29 2009 +0100

    Use read_packet for wb_resp_read

commit 008901827058251a31de99426858f87c77bcf23b
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Feb 23 00:06:56 2009 +0100

    Use read_packet for wb_req_read

commit 202a31d96d9abaf09716bad4c57caf38ef03cc81
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 23:18:04 2009 +0100

    Remove read_pkt

commit 5d653f69de27ee22137333bc319ae2d7e60e56b0
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 23:17:15 2009 +0100

    Replace read_pkt by read_packet in np_read

commit 4021029cddddcb23c41cd7f8b711f3a8d83c3931
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 23:13:34 2009 +0100

    Add async read_packet

commit f9df355befdef7c424ebc70abfeb696de095235e
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 23:12:56 2009 +0100

    Fix async writev

commit e50075a5804204068f07cb82337d3a251b368245
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 22:03:06 2009 +0100

    Remove async sendall

commit 70f788ba7ea7ffa4d0808d0a299d98ee894a89a2
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 22:01:35 2009 +0100

    Use async_writev in np_write

commit ae1a0b553414dafbe7a0aa38581a352b202e1411
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 21:55:03 2009 +0100

    Use async writev for wb_resp_write

commit 53b059fc52c0908d4f8cbc98510b10d96850dcc6
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 21:41:57 2009 +0100

    Use async writev in wb_req_write

commit 76c6330dfb78e536bc7620719d12859ff7418c36
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 20:16:32 2009 +0100

    Add async writev

commit 39976035ebd669d168afa91274d7e368305bf69d
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 19:49:18 2009 +0100

    Convert async_connect to tevent_req

commit 70814474f55befc1617e1162a23d14838ba451a3
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 19:48:46 2009 +0100

    tevent.h requires bool and uint[16|32|64]_t

commit c50233695e002d9f7c872821f7b90cdea632dd30
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 19:47:54 2009 +0100

    Add tevent_req_is_unix_error

commit dbc79381a87269e8ca0631e001aebb064ab4851b
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Feb 22 11:53:50 2009 +0100

    Convert name_mangle() to use talloc

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

Summary of changes:
 lib/async_req/async_sock.c        |  583 ++++++++++++++++++++++---------------
 lib/async_req/async_sock.h        |   46 ++-
 lib/tevent/tevent.h               |    1 +
 lib/util/tevent_unix.c            |   46 +++
 lib/util/tevent_unix.h            |   27 ++
 source3/Makefile.in               |    3 +-
 source3/include/proto.h           |   11 +-
 source3/lib/util.c                |   99 -------
 source3/lib/util_sock.c           |   29 +-
 source3/lib/wb_reqtrans.c         |  401 +++++++------------------
 source3/lib/wbclient.c            |   62 +++--
 source3/libsmb/cliconnect.c       |   25 ++-
 source3/libsmb/nmblib.c           |   15 +-
 source3/rpc_server/srv_pipe_hnd.c |   38 ++--
 source3/utils/smbfilter.c         |   11 +-
 15 files changed, 693 insertions(+), 704 deletions(-)
 create mode 100644 lib/util/tevent_unix.c
 create mode 100644 lib/util/tevent_unix.h


Changeset truncated at 500 lines:

diff --git a/lib/async_req/async_sock.c b/lib/async_req/async_sock.c
index 02ae880..3563421 100644
--- a/lib/async_req/async_sock.c
+++ b/lib/async_req/async_sock.c
@@ -22,6 +22,7 @@
 #include "lib/tevent/tevent.h"
 #include "lib/async_req/async_req.h"
 #include "lib/async_req/async_sock.h"
+#include "lib/util/tevent_unix.h"
 #include <fcntl.h>
 
 #ifndef TALLOC_FREE
@@ -33,10 +34,7 @@
  */
 enum async_syscall_type {
 	ASYNC_SYSCALL_SEND,
-	ASYNC_SYSCALL_SENDALL,
 	ASYNC_SYSCALL_RECV,
-	ASYNC_SYSCALL_RECVALL,
-	ASYNC_SYSCALL_CONNECT
 };
 
 /**
@@ -54,36 +52,12 @@ struct async_syscall_state {
 			size_t length;
 			int flags;
 		} param_send;
-		struct param_sendall {
-			int fd;
-			const void *buffer;
-			size_t length;
-			int flags;
-			size_t sent;
-		} param_sendall;
 		struct param_recv {
 			int fd;
 			void *buffer;
 			size_t length;
 			int flags;
 		} param_recv;
-		struct param_recvall {
-			int fd;
-			void *buffer;
-			size_t length;
-			int flags;
-			size_t received;
-		} param_recvall;
-		struct param_connect {
-			/**
-			 * connect needs to be done on a nonblocking
-			 * socket. Keep the old flags around
-			 */
-			long old_sockflags;
-			int fd;
-			const struct sockaddr *address;
-			socklen_t address_len;
-		} param_connect;
 	} param;
 
 	union {
@@ -337,109 +311,6 @@ struct async_req *async_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
 }
 
 /**
- * fde event handler for the "sendall" syscall group
- * @param[in] ev	The event context that sent us here
- * @param[in] fde	The file descriptor event associated with the send
- * @param[in] flags	Can only be TEVENT_FD_WRITE here
- * @param[in] priv	private data, "struct async_req *" in this case
- */
-
-static void async_sendall_callback(struct tevent_context *ev,
-				   struct tevent_fd *fde, uint16_t flags,
-				   void *priv)
-{
-	struct async_req *req = talloc_get_type_abort(
-		priv, struct async_req);
-	struct async_syscall_state *state = talloc_get_type_abort(
-		req->private_data, struct async_syscall_state);
-	struct param_sendall *p = &state->param.param_sendall;
-
-	if (state->syscall_type != ASYNC_SYSCALL_SENDALL) {
-		async_req_error(req, EIO);
-		return;
-	}
-
-	state->result.result_ssize_t = send(p->fd,
-					    (const char *)p->buffer + p->sent,
-					    p->length - p->sent, p->flags);
-	state->sys_errno = errno;
-
-	if (state->result.result_ssize_t == -1) {
-		async_req_error(req, state->sys_errno);
-		return;
-	}
-
-	if (state->result.result_ssize_t == 0) {
-		async_req_error(req, EOF);
-		return;
-	}
-
-	p->sent += state->result.result_ssize_t;
-	if (p->sent > p->length) {
-		async_req_error(req, EIO);
-		return;
-	}
-
-	if (p->sent == p->length) {
-		TALLOC_FREE(state->fde);
-		async_req_done(req);
-	}
-}
-
-/**
- * @brief Send all bytes to a socket
- * @param[in] mem_ctx	The memory context to hang the result off
- * @param[in] ev	The event context to work from
- * @param[in] fd	The socket to send to
- * @param[in] buffer	The buffer to send
- * @param[in] length	How many bytes to send
- * @param[in] flags	flags passed to send(2)
- *
- * async_sendall calls send(2) as long as it is necessary to send all of the
- * "length" bytes
- */
-
-struct async_req *sendall_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
-			       int fd, const void *buffer, size_t length,
-			       int flags)
-{
-	struct async_req *result;
-	struct async_syscall_state *state;
-
-	result = async_fde_syscall_new(
-		mem_ctx, ev, ASYNC_SYSCALL_SENDALL,
-		fd, TEVENT_FD_WRITE, async_sendall_callback,
-		&state);
-	if (result == NULL) {
-		return NULL;
-	}
-
-	state->param.param_sendall.fd = fd;
-	state->param.param_sendall.buffer = buffer;
-	state->param.param_sendall.length = length;
-	state->param.param_sendall.flags = flags;
-	state->param.param_sendall.sent = 0;
-
-	return result;
-}
-
-ssize_t sendall_recv(struct async_req *req, int *perr)
-{
-	struct async_syscall_state *state = talloc_get_type_abort(
-		req->private_data, struct async_syscall_state);
-	int err;
-
-	err = async_req_simple_recv_errno(req);
-
-	if (err != 0) {
-		*perr = err;
-		return -1;
-	}
-
-	return state->result.result_ssize_t;
-}
-
-/**
  * fde event handler for the "recv" syscall
  * @param[in] ev	The event context that sent us here
  * @param[in] fde	The file descriptor event associated with the recv
@@ -507,106 +378,138 @@ struct async_req *async_recv(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
 	return result;
 }
 
-/**
- * fde event handler for the "recvall" syscall group
- * @param[in] ev	The event context that sent us here
- * @param[in] fde	The file descriptor event associated with the recv
- * @param[in] flags	Can only be TEVENT_FD_READ here
- * @param[in] priv	private data, "struct async_req *" in this case
- */
+struct async_send_state {
+	int fd;
+	const void *buf;
+	size_t len;
+	int flags;
+	ssize_t sent;
+};
 
-static void async_recvall_callback(struct tevent_context *ev,
-				   struct tevent_fd *fde, uint16_t flags,
-				   void *priv)
+static void async_send_handler(struct tevent_context *ev,
+			       struct tevent_fd *fde,
+			       uint16_t flags, void *private_data);
+
+struct tevent_req *async_send_send(TALLOC_CTX *mem_ctx,
+				   struct tevent_context *ev,
+				   int fd, const void *buf, size_t len,
+				   int flags)
 {
-	struct async_req *req = talloc_get_type_abort(
-		priv, struct async_req);
-	struct async_syscall_state *state = talloc_get_type_abort(
-		req->private_data, struct async_syscall_state);
-	struct param_recvall *p = &state->param.param_recvall;
+	struct tevent_req *result;
+	struct async_send_state *state;
+	struct tevent_fd *fde;
 
-	if (state->syscall_type != ASYNC_SYSCALL_RECVALL) {
-		async_req_error(req, EIO);
-		return;
+	result = tevent_req_create(mem_ctx, &state, struct async_send_state);
+	if (result == NULL) {
+		return result;
 	}
+	state->fd = fd;
+	state->buf = buf;
+	state->len = len;
+	state->flags = flags;
 
-	state->result.result_ssize_t = recv(p->fd,
-					    (char *)p->buffer + p->received,
-					    p->length - p->received, p->flags);
-	state->sys_errno = errno;
-
-	if (state->result.result_ssize_t == -1) {
-		async_req_error(req, state->sys_errno);
-		return;
+	fde = tevent_add_fd(ev, state, fd, TEVENT_FD_WRITE, async_send_handler,
+			    result);
+	if (fde == NULL) {
+		TALLOC_FREE(result);
+		return NULL;
 	}
+	return result;
+}
 
-	if (state->result.result_ssize_t == 0) {
-		async_req_error(req, EIO);
+static void async_send_handler(struct tevent_context *ev,
+			       struct tevent_fd *fde,
+			       uint16_t flags, void *private_data)
+{
+	struct tevent_req *req = talloc_get_type_abort(
+		private_data, struct tevent_req);
+	struct async_send_state *state = talloc_get_type_abort(
+		req->private_state, struct async_send_state);
+
+	state->sent = send(state->fd, state->buf, state->len, state->flags);
+	if (state->sent == -1) {
+		tevent_req_error(req, errno);
 		return;
 	}
+	tevent_req_done(req);
+}
 
-	p->received += state->result.result_ssize_t;
-	if (p->received > p->length) {
-		async_req_error(req, EIO);
-		return;
-	}
+ssize_t async_send_recv(struct tevent_req *req, int *perrno)
+{
+	struct async_send_state *state = talloc_get_type_abort(
+		req->private_state, struct async_send_state);
 
-	if (p->received == p->length) {
-		TALLOC_FREE(state->fde);
-		async_req_done(req);
+	if (tevent_req_is_unix_error(req, perrno)) {
+		return -1;
 	}
+	return state->sent;
 }
 
-/**
- * Receive a specified number of bytes from a socket
- * @param[in] mem_ctx	The memory context to hang the result off
- * @param[in] ev	The event context to work from
- * @param[in] fd	The socket to recv from
- * @param[in] buffer	The buffer to recv into
- * @param[in] length	How many bytes to recv
- * @param[in] flags	flags passed to recv(2)
- *
- * async_recvall will call recv(2) until "length" bytes are received
- */
+struct async_recv_state {
+	int fd;
+	void *buf;
+	size_t len;
+	int flags;
+	ssize_t received;
+};
 
-struct async_req *recvall_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
-			       int fd, void *buffer, size_t length,
-			       int flags)
+static void async_recv_handler(struct tevent_context *ev,
+			       struct tevent_fd *fde,
+			       uint16_t flags, void *private_data);
+
+struct tevent_req *async_recv_send(TALLOC_CTX *mem_ctx,
+				   struct tevent_context *ev,
+				   int fd, void *buf, size_t len, int flags)
 {
-	struct async_req *result;
-	struct async_syscall_state *state;
+	struct tevent_req *result;
+	struct async_recv_state *state;
+	struct tevent_fd *fde;
 
-	result = async_fde_syscall_new(
-		mem_ctx, ev, ASYNC_SYSCALL_RECVALL,
-		fd, TEVENT_FD_READ, async_recvall_callback,
-		&state);
+	result = tevent_req_create(mem_ctx, &state, struct async_recv_state);
 	if (result == NULL) {
-		return NULL;
+		return result;
 	}
+	state->fd = fd;
+	state->buf = buf;
+	state->len = len;
+	state->flags = flags;
 
-	state->param.param_recvall.fd = fd;
-	state->param.param_recvall.buffer = buffer;
-	state->param.param_recvall.length = length;
-	state->param.param_recvall.flags = flags;
-	state->param.param_recvall.received = 0;
-
+	fde = tevent_add_fd(ev, state, fd, TEVENT_FD_READ, async_recv_handler,
+			    result);
+	if (fde == NULL) {
+		TALLOC_FREE(result);
+		return NULL;
+	}
 	return result;
 }
 
-ssize_t recvall_recv(struct async_req *req, int *perr)
+static void async_recv_handler(struct tevent_context *ev,
+			       struct tevent_fd *fde,
+			       uint16_t flags, void *private_data)
 {
-	struct async_syscall_state *state = talloc_get_type_abort(
-		req->private_data, struct async_syscall_state);
-	int err;
+	struct tevent_req *req = talloc_get_type_abort(
+		private_data, struct tevent_req);
+	struct async_recv_state *state = talloc_get_type_abort(
+		req->private_state, struct async_recv_state);
+
+	state->received = recv(state->fd, state->buf, state->len,
+			       state->flags);
+	if (state->received == -1) {
+		tevent_req_error(req, errno);
+		return;
+	}
+	tevent_req_done(req);
+}
 
-	err = async_req_simple_recv_errno(req);
+ssize_t async_recv_recv(struct tevent_req *req, int *perrno)
+{
+	struct async_recv_state *state = talloc_get_type_abort(
+		req->private_state, struct async_recv_state);
 
-	if (err != 0) {
-		*perr = err;
+	if (tevent_req_is_unix_error(req, perrno)) {
 		return -1;
 	}
-
-	return state->result.result_ssize_t;
+	return state->received;
 }
 
 struct async_connect_state {
@@ -633,17 +536,18 @@ static void async_connect_connected(struct tevent_context *ev,
  * connect in an async state. This will be reset when the request is finished.
  */
 
-struct async_req *async_connect_send(TALLOC_CTX *mem_ctx,
-				     struct tevent_context *ev,
-				     int fd, const struct sockaddr *address,
-				     socklen_t address_len)
+struct tevent_req *async_connect_send(TALLOC_CTX *mem_ctx,
+				      struct tevent_context *ev,
+				      int fd, const struct sockaddr *address,
+				      socklen_t address_len)
 {
-	struct async_req *result;
+	struct tevent_req *result;
 	struct async_connect_state *state;
 	struct tevent_fd *fde;
 
-	if (!async_req_setup(mem_ctx, &result, &state,
-			     struct async_connect_state)) {
+	result = tevent_req_create(
+		mem_ctx, &state, struct async_connect_state);
+	if (result == NULL) {
 		return NULL;
 	}
 
@@ -664,8 +568,8 @@ struct async_req *async_connect_send(TALLOC_CTX *mem_ctx,
 
 	state->result = connect(fd, address, address_len);
 	if (state->result == 0) {
-		state->sys_errno = 0;
-		goto post_status;
+		errno = 0;
+		goto post_errno;
 	}
 
 	/**
@@ -686,22 +590,20 @@ struct async_req *async_connect_send(TALLOC_CTX *mem_ctx,
 	fde = tevent_add_fd(ev, state, fd, TEVENT_FD_READ | TEVENT_FD_WRITE,
 			   async_connect_connected, result);
 	if (fde == NULL) {
-		state->sys_errno = ENOMEM;
-		goto post_status;
+		errno = ENOMEM;
+		goto post_errno;
 	}
 	return result;
 
  post_errno:
 	state->sys_errno = errno;
- post_status:
 	fcntl(fd, F_SETFL, state->old_sockflags);
-	if (!async_post_error(result, ev, state->sys_errno)) {
-		goto fail;
+	if (state->sys_errno == 0) {
+		tevent_req_done(result);
+	} else {
+		tevent_req_error(result, state->sys_errno);
 	}
-	return result;
- fail:
-	TALLOC_FREE(result);
-	return NULL;
+	return tevent_req_post(result, ev);
 }
 
 /**
@@ -716,10 +618,10 @@ static void async_connect_connected(struct tevent_context *ev,
 				    struct tevent_fd *fde, uint16_t flags,
 				    void *priv)
 {
-	struct async_req *req = talloc_get_type_abort(
-		priv, struct async_req);
+	struct tevent_req *req = talloc_get_type_abort(
+		priv, struct tevent_req);
 	struct async_connect_state *state = talloc_get_type_abort(
-		req->private_data, struct async_connect_state);
+		req->private_state, struct async_connect_state);
 
 	TALLOC_FREE(fde);
 
@@ -743,27 +645,27 @@ static void async_connect_connected(struct tevent_context *ev,
 		DEBUG(10, ("connect returned %s\n", strerror(errno)));
 
 		fcntl(state->fd, F_SETFL, state->old_sockflags);
-		async_req_error(req, state->sys_errno);
+		tevent_req_error(req, state->sys_errno);
 		return;
 	}
 
 	state->sys_errno = 0;
-	async_req_done(req);
+	tevent_req_done(req);
 }
 
-int async_connect_recv(struct async_req *req, int *perrno)
+int async_connect_recv(struct tevent_req *req, int *perrno)
 {
 	struct async_connect_state *state = talloc_get_type_abort(
-		req->private_data, struct async_connect_state);
+		req->private_state, struct async_connect_state);
 	int err;
 
 	fcntl(state->fd, F_SETFL, state->old_sockflags);
 
-
-	if (async_req_is_errno(req, &err)) {
+	if (tevent_req_is_unix_error(req, &err)) {
 		*perrno = err;
 		return -1;
 	}
+
 	if (state->sys_errno == 0) {
 		return 0;
 	}
@@ -771,3 +673,226 @@ int async_connect_recv(struct async_req *req, int *perrno)
 	*perrno = state->sys_errno;
 	return -1;
 }


-- 
Samba Shared Repository


More information about the samba-cvs mailing list