From 1d0211719bc6ad76f924f8c08e1a28f0509cd4fd Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Mon, 30 Nov 2015 17:31:06 +0100 Subject: [FUSE] It works! Kinda... --- src/shared/protocol.h | 14 ++++++++++++-- src/shared/sockhelper.c | 7 ++++--- src/shared/sockhelper.h | 2 ++ 3 files changed, 18 insertions(+), 5 deletions(-) (limited to 'src/shared') diff --git a/src/shared/protocol.h b/src/shared/protocol.h index 41e9af2..a5c7bbd 100644 --- a/src/shared/protocol.h +++ b/src/shared/protocol.h @@ -35,6 +35,8 @@ static inline int dnbd3_read_reply(int sock, dnbd3_reply_t *reply, bool wait) static inline bool dnbd3_get_reply(int sock, dnbd3_reply_t *reply) { + int ret = dnbd3_read_reply( sock, reply, true ); + if ( ret != REPLY_INTR ) return ret == REPLY_OK; return dnbd3_read_reply( sock, reply, true ) == REPLY_OK; } @@ -61,7 +63,11 @@ static inline bool dnbd3_select_image(int sock, const char *lower_name, uint16_t iov[0].iov_len = sizeof(request); iov[1].iov_base = &serialized; iov[1].iov_len = len; - return writev( sock, iov, 2 ) == len + (ssize_t)sizeof(request); + ssize_t ret = writev( sock, iov, 2 ); + if ( ret == -1 && errno == EINTR ) { + ret = writev( sock, iov, 2 ); + } + return ret == len + (ssize_t)sizeof(request); } static inline bool dnbd3_get_block(int sock, uint64_t offset, uint32_t size, uint64_t handle) @@ -123,7 +129,11 @@ static inline bool dnbd3_select_image_reply(serialized_buffer_t *buffer, int soc return false; } // receive reply payload - if ( recv( sock, buffer, reply.size, MSG_WAITALL | MSG_NOSIGNAL ) != reply.size ) { + ssize_t ret = recv( sock, buffer, reply.size, MSG_WAITALL | MSG_NOSIGNAL ); + if ( ret == -1 && errno == EINTR ) { + ret = recv( sock, buffer, reply.size, MSG_WAITALL | MSG_NOSIGNAL ); + } + if ( ret != reply.size ) { return false; } // handle/check reply payload diff --git a/src/shared/sockhelper.c b/src/shared/sockhelper.c index 3748d38..0e732c1 100644 --- a/src/shared/sockhelper.c +++ b/src/shared/sockhelper.c @@ -56,7 +56,10 @@ int sock_connect(const dnbd3_host_t * const addr, const int connect_ms, const in if ( client_sock == -1 ) return -1; // Apply connect timeout sock_setTimeout( client_sock, connect_ms ); - if ( connect( client_sock, (struct sockaddr *)&ss, addrlen ) == -1 ) { + for ( int i = 0;; ++i ) { + int ret = connect( client_sock, (struct sockaddr *)&ss, addrlen ); + if ( ret != -1 ) break; + if ( errno == EINTR && i < 5 ) continue; close( client_sock ); return -1; } @@ -70,8 +73,6 @@ int sock_resolveToDnbd3Host(const char * const address, dnbd3_host_t * const des { if ( count <= 0 ) return 0; - const int on = 1; - int sock = -1; struct addrinfo hints, *res, *ptr; char bufferAddr[100], bufferPort[6]; char *addr = bufferAddr; diff --git a/src/shared/sockhelper.h b/src/shared/sockhelper.h index 3a4ab6c..dc22e2b 100644 --- a/src/shared/sockhelper.h +++ b/src/shared/sockhelper.h @@ -31,6 +31,8 @@ int sock_resolveToDnbd3Host(const char * const address, dnbd3_host_t * const des void sock_setTimeout(const int sockfd, const int milliseconds); +bool sock_printable(struct sockaddr *addr, socklen_t addrLen, char *output, int len); + /** * Create new poll list. */ -- cgit v1.2.3-55-g7522