From: Volker Lendecke Date: Mon, 23 Feb 2009 07:56:35 +0000 (+0100) Subject: Add more conventional async_recv X-Git-Tag: samba-4.0.0alpha7~35^2~24^2~1 X-Git-Url: http://git.samba.org/samba.git/?p=kai%2Fsamba-autobuild%2F.git;a=commitdiff_plain;h=25df6d74131b8b9bd8924ca70eb891ff97d3ddfd Add more conventional async_recv --- diff --git a/lib/async_req/async_sock.c b/lib/async_req/async_sock.c index 323d2857295..3563421e0e5 100644 --- a/lib/async_req/async_sock.c +++ b/lib/async_req/async_sock.c @@ -445,6 +445,73 @@ ssize_t async_send_recv(struct tevent_req *req, int *perrno) return state->sent; } +struct async_recv_state { + int fd; + void *buf; + size_t len; + int flags; + ssize_t received; +}; + +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 tevent_req *result; + struct async_recv_state *state; + struct tevent_fd *fde; + + result = tevent_req_create(mem_ctx, &state, struct async_recv_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_READ, async_recv_handler, + result); + if (fde == NULL) { + TALLOC_FREE(result); + return NULL; + } + return result; +} + +static void async_recv_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_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); +} + +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 (tevent_req_is_unix_error(req, perrno)) { + return -1; + } + return state->received; +} + 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 89dabdac4c4..bfc4346d39a 100644 --- a/lib/async_req/async_sock.h +++ b/lib/async_req/async_sock.h @@ -42,6 +42,11 @@ struct tevent_req *async_send_send(TALLOC_CTX *mem_ctx, int flags); ssize_t async_send_recv(struct tevent_req *req, int *perrno); +struct tevent_req *async_recv_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + int fd, void *buf, size_t len, int flags); +ssize_t async_recv_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,