lib: Add before/after hooks to async_connect
authorVolker Lendecke <vl@samba.org>
Thu, 16 May 2013 14:11:54 +0000 (16:11 +0200)
committerChristian Ambach <ambi@samba.org>
Fri, 17 May 2013 09:22:45 +0000 (11:22 +0200)
This will facilitiate [un]become_root for smbd to connect safely to ctdbd.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Christian Ambach <ambi@samba.org>
lib/async_req/async_sock.c
lib/async_req/async_sock.h
source3/lib/ctdb_conn.c
source3/lib/util_sock.c
source3/libsmb/unexpected.c
source3/torture/wbc_async.c

index 9909bc6eb3a32511975bf6ee02c89c6db7274d2e..59dde885921a93661fbac417a8860be90baecde1 100644 (file)
@@ -217,6 +217,10 @@ struct async_connect_state {
        long old_sockflags;
        socklen_t address_len;
        struct sockaddr_storage address;
+
+       void (*before_connect)(void *private_data);
+       void (*after_connect)(void *private_data);
+       void *private_data;
 };
 
 static void async_connect_connected(struct tevent_context *ev,
@@ -236,10 +240,12 @@ static void async_connect_connected(struct tevent_context *ev,
  * connect in an async state. This will be reset when the request is finished.
  */
 
-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 tevent_req *async_connect_send(
+       TALLOC_CTX *mem_ctx, struct tevent_context *ev, int fd,
+       const struct sockaddr *address, socklen_t address_len,
+       void (*before_connect)(void *private_data),
+       void (*after_connect)(void *private_data),
+       void *private_data)
 {
        struct tevent_req *result;
        struct async_connect_state *state;
@@ -258,6 +264,9 @@ struct tevent_req *async_connect_send(TALLOC_CTX *mem_ctx,
 
        state->fd = fd;
        state->sys_errno = 0;
+       state->before_connect = before_connect;
+       state->after_connect = after_connect;
+       state->private_data = private_data;
 
        state->old_sockflags = fcntl(fd, F_GETFL, 0);
        if (state->old_sockflags == -1) {
@@ -273,7 +282,16 @@ struct tevent_req *async_connect_send(TALLOC_CTX *mem_ctx,
 
        set_blocking(fd, false);
 
+       if (state->before_connect != NULL) {
+               state->before_connect(state->private_data);
+       }
+
        state->result = connect(fd, address, address_len);
+
+       if (state->after_connect != NULL) {
+               state->after_connect(state->private_data);
+       }
+
        if (state->result == 0) {
                tevent_req_done(result);
                goto done;
@@ -328,8 +346,17 @@ static void async_connect_connected(struct tevent_context *ev,
                tevent_req_data(req, struct async_connect_state);
        int ret;
 
+       if (state->before_connect != NULL) {
+               state->before_connect(state->private_data);
+       }
+
        ret = connect(state->fd, (struct sockaddr *)(void *)&state->address,
                      state->address_len);
+
+       if (state->after_connect != NULL) {
+               state->after_connect(state->private_data);
+       }
+
        if (ret == 0) {
                state->sys_errno = 0;
                TALLOC_FREE(fde);
index af917bcb836986f4af9983ea7ec7d78f583f74a9..494b92eb29f87f66a054478c68aaf90b42b42742 100644 (file)
@@ -40,10 +40,12 @@ struct tevent_req *recvfrom_send(TALLOC_CTX *mem_ctx,
                                 socklen_t *addr_len);
 ssize_t recvfrom_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,
-                                     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,
+       void (*before_connect)(void *private_data),
+       void (*after_connect)(void *private_data),
+       void *private_data);
 int async_connect_recv(struct tevent_req *req, int *perrno);
 
 struct tevent_req *writev_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
index a96615fb6ca1ca8cd1f707bcd539c76c80fff697..d7bf6a575513284ef8a67e5631f66bee39406eb6 100644 (file)
@@ -83,7 +83,7 @@ struct tevent_req *ctdb_conn_init_send(TALLOC_CTX *mem_ctx,
 
        subreq = async_connect_send(state, ev, state->conn->fd,
                                    (struct sockaddr *)&state->addr,
-                                   sizeof(state->addr));
+                                   sizeof(state->addr), NULL, NULL, NULL);
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
        }
index 8f212e5d851efc7412f076d3d595626ff96b6292..eb38055d19a7b2eff085791950e29e74f9ad0c01 100644 (file)
@@ -586,7 +586,7 @@ struct tevent_req *open_socket_out_send(TALLOC_CTX *mem_ctx,
 
        subreq = async_connect_send(state, state->ev, state->fd,
                                    (struct sockaddr *)&state->ss,
-                                   state->salen);
+                                   state->salen, NULL, NULL, NULL);
        if ((subreq == NULL)
            || !tevent_req_set_endtime(
                    subreq, state->ev,
@@ -638,7 +638,7 @@ static void open_socket_out_connected(struct tevent_req *subreq)
 
                subreq = async_connect_send(state, state->ev, state->fd,
                                            (struct sockaddr *)&state->ss,
-                                           state->salen);
+                                           state->salen, NULL, NULL, NULL);
                if (tevent_req_nomem(subreq, req)) {
                        return;
                }
index f537b3d0a7347d56933d00e168232829919724c8..2c01bb7515407784f174b9637167a8633c561d74 100644 (file)
@@ -514,7 +514,7 @@ struct tevent_req *nb_packet_reader_send(TALLOC_CTX *mem_ctx,
 
        subreq = async_connect_send(state, ev, state->reader->sock,
                                    (struct sockaddr *)(void *)&state->addr,
-                                   sizeof(state->addr));
+                                   sizeof(state->addr), NULL, NULL, NULL);
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
        }
index 9252b58bc98a93ecccf778093bfdab1ed99dc66e..71e4de7c88e56cc898c01a804d4990fa3402ff53 100644 (file)
@@ -288,7 +288,7 @@ static struct tevent_req *wb_connect_send(TALLOC_CTX *mem_ctx,
 
        subreq = async_connect_send(mem_ctx, ev, wb_ctx->fd,
                                    (struct sockaddr *)(void *)&sunaddr,
-                                   sizeof(sunaddr));
+                                   sizeof(sunaddr), NULL, NULL, NULL);
        if (subreq == NULL) {
                goto nomem;
        }