summaryrefslogtreecommitdiffstats
path: root/src/shared/sockhelper.c
diff options
context:
space:
mode:
authorSimon Rettberg2015-12-01 13:38:10 +0100
committerSimon Rettberg2015-12-01 13:38:10 +0100
commitecc6e5dd28821bf1c207e074f1b5903426a7e4c4 (patch)
tree5f9d8f8ffbcad5ae6ac1b9a0b3075155995537d8 /src/shared/sockhelper.c
parent[FUSE] It works! Kinda... (diff)
downloaddnbd3-ecc6e5dd28821bf1c207e074f1b5903426a7e4c4.tar.gz
dnbd3-ecc6e5dd28821bf1c207e074f1b5903426a7e4c4.tar.xz
dnbd3-ecc6e5dd28821bf1c207e074f1b5903426a7e4c4.zip
[FUSE] Stability improvements, runs for longer than a couple secs now :)
Diffstat (limited to 'src/shared/sockhelper.c')
-rw-r--r--src/shared/sockhelper.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/shared/sockhelper.c b/src/shared/sockhelper.c
index 0e732c1..f2f8b97 100644
--- a/src/shared/sockhelper.c
+++ b/src/shared/sockhelper.c
@@ -264,17 +264,16 @@ bool sock_append(poll_list_t *list, const int sock, bool wantRead, bool wantWrit
return true;
}
-ssize_t sock_sendAll(int sock, void *buffer, size_t len, int maxtries)
+ssize_t sock_sendAll(const int sock, void *buffer, const size_t len, int maxtries)
{
size_t done = 0;
ssize_t ret = 0;
while ( done < len ) {
if ( maxtries >= 0 && --maxtries == -1 ) break;
ret = write( sock, (char*)buffer + done, len - done );
- if ( ret < 0 ) {
+ if ( ret == -1 ) {
if ( errno == EINTR ) continue;
if ( errno == EAGAIN || errno == EWOULDBLOCK ) {
- usleep( 1000 );
continue;
}
break;
@@ -286,3 +285,21 @@ ssize_t sock_sendAll(int sock, void *buffer, size_t len, int maxtries)
return done;
}
+ssize_t sock_recv(const int sock, void *buffer, const size_t len)
+{
+ size_t done = 0;
+ ssize_t ret = 0;
+ int intrs = 0;
+ while ( done < len ) {
+ ret = recv( sock, (char*)buffer + done, len - done, MSG_NOSIGNAL );
+ if ( ret == -1 ) {
+ if ( errno == EINTR && ++intrs < 10 ) continue;
+ break;
+ }
+ if ( ret == 0 ) break;
+ done += ret;
+ }
+ if ( done == 0 ) return ret;
+ return done;
+}
+