diff options
Diffstat (limited to 'src/shared/sockhelper.c')
-rw-r--r-- | src/shared/sockhelper.c | 23 |
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; +} + |