From ecc6e5dd28821bf1c207e074f1b5903426a7e4c4 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 1 Dec 2015 13:38:10 +0100 Subject: [FUSE] Stability improvements, runs for longer than a couple secs now :) --- src/shared/sockhelper.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'src/shared/sockhelper.c') 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; +} + -- cgit v1.2.3-55-g7522