diff options
| author | Volker Lendecke <vl@samba.org> | 2009-02-23 08:53:01 +0100 | 
|---|---|---|
| committer | Volker Lendecke <vl@samba.org> | 2009-02-24 20:40:48 +0100 | 
| commit | a60480b71ad7cdaa495b7624f04bc477a3330cbf (patch) | |
| tree | cdd07435485a3133c344fb0ecfd76242019e6e91 /lib | |
| parent | 08f028f179f474f83d46b1a23d1cfbd8848b68b0 (diff) | |
| download | samba-a60480b71ad7cdaa495b7624f04bc477a3330cbf.tar.gz samba-a60480b71ad7cdaa495b7624f04bc477a3330cbf.tar.bz2 samba-a60480b71ad7cdaa495b7624f04bc477a3330cbf.zip  | |
Add more conventional async_send
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/async_req/async_sock.c | 67 | ||||
| -rw-r--r-- | lib/async_req/async_sock.h | 6 | 
2 files changed, 73 insertions, 0 deletions
diff --git a/lib/async_req/async_sock.c b/lib/async_req/async_sock.c index 7bb52767af..323d285729 100644 --- a/lib/async_req/async_sock.c +++ b/lib/async_req/async_sock.c @@ -378,6 +378,73 @@ struct async_req *async_recv(TALLOC_CTX *mem_ctx, struct tevent_context *ev,  	return result;  } +struct async_send_state { +	int fd; +	const void *buf; +	size_t len; +	int flags; +	ssize_t sent; +}; + +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 tevent_req *result; +	struct async_send_state *state; +	struct tevent_fd *fde; + +	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; + +	fde = tevent_add_fd(ev, state, fd, TEVENT_FD_WRITE, async_send_handler, +			    result); +	if (fde == NULL) { +		TALLOC_FREE(result); +		return NULL; +	} +	return result; +} + +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); +} + +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 (tevent_req_is_unix_error(req, perrno)) { +		return -1; +	} +	return state->sent; +} +  struct async_connect_state {  	int fd;  	int result; diff --git a/lib/async_req/async_sock.h b/lib/async_req/async_sock.h index bfa23d7836..89dabdac4c 100644 --- a/lib/async_req/async_sock.h +++ b/lib/async_req/async_sock.h @@ -36,6 +36,12 @@ struct async_req *async_recv(TALLOC_CTX *mem_ctx, struct tevent_context *ev,  			     int fd, void *buffer, size_t length,  			     int flags); +struct tevent_req *async_send_send(TALLOC_CTX *mem_ctx, +				   struct tevent_context *ev, +				   int fd, const void *buf, size_t len, +				   int flags); +ssize_t async_send_recv(struct tevent_req *req, int *perrno); +  struct tevent_req *async_connect_send(TALLOC_CTX *mem_ctx,  				      struct tevent_context *ev,  				      int fd, const struct sockaddr *address,  | 
