From 5c8aadc590a7ce851cbbb6dd18e40b6ffcf94ba5 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 17 Sep 2013 18:38:37 +0200 Subject: [SERVER] Block signals on network threads --- src/server/net.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'src/server/net.c') diff --git a/src/server/net.c b/src/server/net.c index cd38205..3e9383d 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "sockhelper.h" #include "helper.h" @@ -46,11 +47,12 @@ static inline char recv_request_header(int sock, dnbd3_request_t *request) { - int ret; + int ret, fails = 0; // Read request header from socket - if ( (ret = recv( sock, request, sizeof(*request), MSG_WAITALL )) != sizeof(*request) ) { - if ( ret == 0 ) return FALSE; + while ( (ret = recv( sock, request, sizeof(*request), MSG_WAITALL )) != sizeof(*request) ) { + if ( ret >= 0 || ++fails > 10 ) return FALSE; const int err = errno; + if ( err == EAGAIN || err == EINTR ) continue; printf( "[DEBUG] Error receiving request: Could not read message header (%d/%d, e=%d)\n", ret, (int)sizeof(*request), err ); return FALSE; } @@ -134,6 +136,9 @@ void *net_client_handler(void *dnbd3_client) dnbd3_server_entry_t server_list[NUMBER_SERVERS]; + // Block some signals not important to this thread + blockNoncriticalSignals(); + // Set to zero to make valgrind happy memset( &reply, 0, sizeof(reply) ); memset( &payload, 0, sizeof(payload) ); -- cgit v1.2.3-55-g7522