Streamline the async_sock API a bit
authorVolker Lendecke <vl@samba.org>
Fri, 28 Nov 2008 18:52:52 +0000 (19:52 +0100)
committerVolker Lendecke <vl@samba.org>
Mon, 8 Dec 2008 21:09:33 +0000 (22:09 +0100)
source3/include/async_sock.h
source3/lib/async_sock.c

index 3c9045360161e3b1f256c4c1ad448b4942802ed7..f0cd5fdaa4e9ada828c29b63d7f6c31521160654 100644 (file)
 
 #include "includes.h"
 
-ssize_t async_syscall_result_ssize_t(struct async_req **req, int *perrno);
-size_t  async_syscall_result_size_t (struct async_req **req, int *perrno);
-ssize_t async_syscall_result_int    (struct async_req **req, int *perrno);
+ssize_t async_syscall_result_ssize_t(struct async_req *req, int *perrno);
+size_t async_syscall_result_size_t(struct async_req *req, int *perrno);
+ssize_t async_syscall_result_int(struct async_req *req, int *perrno);
 
 struct async_req *async_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
                             int fd, const void *buffer, size_t length,
                             int flags);
-struct async_req *async_sendall(TALLOC_CTX *mem_ctx, struct event_context *ev,
-                               int fd, const void *buffer, size_t length,
-                               int flags);
 struct async_req *async_recv(TALLOC_CTX *mem_ctx, struct event_context *ev,
                             int fd, void *buffer, size_t length,
                             int flags);
-struct async_req *async_recvall(TALLOC_CTX *mem_ctx, struct event_context *ev,
-                               int fd, void *buffer, size_t length,
-                               int flags);
 struct async_req *async_connect(TALLOC_CTX *mem_ctx, struct event_context *ev,
                                int fd, const struct sockaddr *address,
                                socklen_t address_len);
 
+struct async_req *sendall_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
+                              int fd, const void *buffer, size_t length,
+                              int flags);
+NTSTATUS sendall_recv(struct async_req *req);
+
+struct async_req *recvall_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
+                              int fd, void *buffer, size_t length,
+                              int flags);
+NTSTATUS recvall_recv(struct async_req *req);
+
 #endif
index ffba6de83245a147d2b13772aaae38ad3b0d5f8b..ba860e8e78be4b6963f7cace47b1aef5329b2d8a 100644 (file)
@@ -177,18 +177,13 @@ static struct async_req *async_fde_syscall_new(
  * @retval The return value from the asynchronously called syscall
  */
 
-ssize_t async_syscall_result_ssize_t(struct async_req **req, int *perrno)
+ssize_t async_syscall_result_ssize_t(struct async_req *req, int *perrno)
 {
        struct async_syscall_state *state = talloc_get_type_abort(
-               (*req)->private_data, struct async_syscall_state);
-
-       int sys_errno = state->sys_errno;
-       ssize_t result = state->result.result_ssize_t;
-
-       TALLOC_FREE(*req);
+               req->private_data, struct async_syscall_state);
 
-       *perrno = sys_errno;
-       return result;
+       *perrno = state->sys_errno;
+       return state->result.result_ssize_t;
 }
 
 /**
@@ -198,18 +193,13 @@ ssize_t async_syscall_result_ssize_t(struct async_req **req, int *perrno)
  * @retval The return value from the asynchronously called syscall
  */
 
-size_t async_syscall_result_size_t(struct async_req **req, int *perrno)
+size_t async_syscall_result_size_t(struct async_req *req, int *perrno)
 {
        struct async_syscall_state *state = talloc_get_type_abort(
-               (*req)->private_data, struct async_syscall_state);
-
-       int sys_errno = state->sys_errno;
-       size_t result = state->result.result_ssize_t;
-
-       TALLOC_FREE(*req);
+               req->private_data, struct async_syscall_state);
 
-       *perrno = sys_errno;
-       return result;
+       *perrno = state->sys_errno;
+       return state->result.result_size_t;
 }
 
 /**
@@ -219,18 +209,13 @@ size_t async_syscall_result_size_t(struct async_req **req, int *perrno)
  * @retval The return value from the asynchronously called syscall
  */
 
-ssize_t async_syscall_result_int(struct async_req **req, int *perrno)
+ssize_t async_syscall_result_int(struct async_req *req, int *perrno)
 {
        struct async_syscall_state *state = talloc_get_type_abort(
-               (*req)->private_data, struct async_syscall_state);
-
-       int sys_errno = state->sys_errno;
-       int result = state->result.result_ssize_t;
-
-       TALLOC_FREE(*req);
+               req->private_data, struct async_syscall_state);
 
-       *perrno = sys_errno;
-       return result;
+       *perrno = state->sys_errno;
+       return state->result.result_int;
 }
 
 /**
@@ -353,9 +338,9 @@ static void async_sendall_callback(struct event_context *ev,
  * "length" bytes
  */
 
-struct async_req *async_sendall(TALLOC_CTX *mem_ctx, struct event_context *ev,
-                               int fd, const void *buffer, size_t length,
-                               int flags)
+struct async_req *sendall_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
+                              int fd, const void *buffer, size_t length,
+                              int flags)
 {
        struct async_req *result;
        struct async_syscall_state *state;
@@ -377,6 +362,15 @@ struct async_req *async_sendall(TALLOC_CTX *mem_ctx, struct event_context *ev,
        return result;
 }
 
+NTSTATUS sendall_recv(struct async_req *req)
+{
+       SMB_ASSERT(req->state >= ASYNC_REQ_DONE);
+       if (req->state == ASYNC_REQ_ERROR) {
+               return req->status;
+       }
+       return NT_STATUS_OK;
+}
+
 /**
  * fde event handler for the "recv" syscall
  * @param[in] ev       The event context that sent us here
@@ -498,9 +492,9 @@ static void async_recvall_callback(struct event_context *ev,
  * async_recvall will call recv(2) until "length" bytes are received
  */
 
-struct async_req *async_recvall(TALLOC_CTX *mem_ctx, struct event_context *ev,
-                               int fd, void *buffer, size_t length,
-                               int flags)
+struct async_req *recvall_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
+                              int fd, void *buffer, size_t length,
+                              int flags)
 {
        struct async_req *result;
        struct async_syscall_state *state;
@@ -522,6 +516,15 @@ struct async_req *async_recvall(TALLOC_CTX *mem_ctx, struct event_context *ev,
        return result;
 }
 
+NTSTATUS recvall_recv(struct async_req *req)
+{
+       SMB_ASSERT(req->state >= ASYNC_REQ_DONE);
+       if (req->state == ASYNC_REQ_ERROR) {
+               return req->status;
+       }
+       return NT_STATUS_OK;
+}
+
 /**
  * fde event handler for connect(2)
  * @param[in] ev       The event context that sent us here