summaryrefslogtreecommitdiffstats
path: root/src/shared
diff options
context:
space:
mode:
authorSimon Rettberg2015-11-30 17:31:06 +0100
committerSimon Rettberg2015-11-30 17:31:06 +0100
commit1d0211719bc6ad76f924f8c08e1a28f0509cd4fd (patch)
tree58b8f520514357bb689c781bcaa717092649b03e /src/shared
parent[FUSE] Compiles again (diff)
downloaddnbd3-1d0211719bc6ad76f924f8c08e1a28f0509cd4fd.tar.gz
dnbd3-1d0211719bc6ad76f924f8c08e1a28f0509cd4fd.tar.xz
dnbd3-1d0211719bc6ad76f924f8c08e1a28f0509cd4fd.zip
[FUSE] It works! Kinda...
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/protocol.h14
-rw-r--r--src/shared/sockhelper.c7
-rw-r--r--src/shared/sockhelper.h2
3 files changed, 18 insertions, 5 deletions
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.
*/