diff --git a/src/client.c b/src/client.c index afac65d..0e3a200 100644 --- a/src/client.c +++ b/src/client.c @@ -4,6 +4,7 @@ #include "ioutil.h" #include "bitset.h" #include "nbdtypes.h" +#include "self_pipe.h" #include @@ -119,11 +120,11 @@ int client_read_request( struct client * client , struct nbd_request *out_reques FD_ZERO(&fds); FD_SET(client->socket, &fds); - FD_SET(client->serve->close_signal[0], &fds); + self_pipe_fd_set( client->serve->close_signal, &fds ); CLIENT_ERROR_ON_FAILURE(select(FD_SETSIZE, &fds, NULL, NULL, NULL), "select() failed"); - if (FD_ISSET(client->serve->close_signal[0], &fds)) + if ( self_pipe_fd_isset( client->serve->close_signal, &fds ) ) return 0; if (readloop(client->socket, &request_raw, sizeof(request_raw)) == -1) { diff --git a/src/control.c b/src/control.c index e8ee026..bd3eb79 100644 --- a/src/control.c +++ b/src/control.c @@ -31,6 +31,7 @@ #include "parse.h" #include "readwrite.h" #include "bitset.h" +#include "self_pipe.h" #include #include @@ -141,7 +142,7 @@ void* mirror_runner(void* serve_params_uncast) break; case ACTION_EXIT: debug("exit!"); - write(serve->close_signal[1], serve, 1); /* any byte will do */ + serve_signal_close( serve ); /* fall through */ case ACTION_NOTHING: debug("nothing!"); @@ -261,14 +262,14 @@ int control_mirror(struct control_params* client, int linesc, char** lines) /** Command parser to alter access control list from socket input */ int control_acl(struct control_params* client, int linesc, char** lines) { - int parsed; + int parsedc; struct ip_and_mask (*acl)[], (*old_acl)[]; - parsed = parse_acl(&acl, linesc, lines); - if (parsed != linesc) { + parsedc = parse_acl(&acl, linesc, lines); + if (parsedc != linesc) { write(client->socket, "1: bad spec: ", 13); - write(client->socket, lines[parsed], - strlen(lines[parsed])); + write(client->socket, lines[parsedc], + strlen(lines[parsedc])); write(client->socket, "\n", 1); free(acl); } diff --git a/src/serve.c b/src/serve.c index 9451c6d..6fa0368 100644 --- a/src/serve.c +++ b/src/serve.c @@ -5,6 +5,7 @@ #include "util.h" #include "bitset.h" #include "control.h" +#include "self_pipe.h" #include #include @@ -250,14 +251,14 @@ void serve_accept_loop(struct server* params) FD_ZERO(&fds); FD_SET(params->server_fd, &fds); - FD_SET(params->close_signal[0], &fds); + self_pipe_fd_set( params->close_signal, &fds ); if (params->control_socket_name) FD_SET(params->control_fd, &fds); SERVER_ERROR_ON_FAILURE(select(FD_SETSIZE, &fds, NULL, NULL, NULL), "select() failed"); - if (FD_ISSET(params->close_signal[0], &fds)) + if ( self_pipe_fd_isset( params->close_signal, &fds) ) return; activity_fd = FD_ISSET(params->server_fd, &fds) ? params->server_fd: @@ -298,6 +299,14 @@ void serve_init_allocation_map(struct server* params) close(fd); } + +/* Tell the server to close all the things. */ +void serve_signal_close( struct server * serve ) +{ + self_pipe_signal( serve->close_signal ); +} + + /** Closes sockets, frees memory and waits for all client threads to finish */ void serve_cleanup(struct server* params) { @@ -314,8 +323,9 @@ void serve_cleanup(struct server* params) pthread_mutex_destroy(¶ms->l_io); if (params->proxy_fd); close(params->proxy_fd); - close(params->close_signal[0]); - close(params->close_signal[1]); + + self_pipe_destroy( params->close_signal ); + free(params->block_allocation_map); if (params->mirror) @@ -336,7 +346,9 @@ void do_serve(struct server* params) { pthread_mutex_init(¶ms->l_accept, NULL); pthread_mutex_init(¶ms->l_io, NULL); - SERVER_ERROR_ON_FAILURE(pipe(params->close_signal) , "pipe failed"); + + params->close_signal = self_pipe_create(); + if ( NULL == params->close_signal) { SERVER_ERROR( "pipe failed" ); } serve_open_server_socket(params); serve_open_control_socket(params); diff --git a/src/serve.h b/src/serve.h index 1f5bc05..b1e112b 100644 --- a/src/serve.h +++ b/src/serve.h @@ -70,7 +70,7 @@ struct server { int proxy_fd; /** to interrupt accept loop and clients, write() to close_signal[1] */ - int close_signal[2]; + struct self_pipe * close_signal; struct mirror_status* mirror; int server_fd; @@ -84,6 +84,7 @@ struct server { int server_detect_closed(struct server* serve); void server_dirty(struct server *serve, off64_t from, int len); +void serve_signal_close( struct server *serve ); struct mode_readwrite_params {