[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