diff options
Diffstat (limited to 'src/server/sockhelper.c')
-rw-r--r-- | src/server/sockhelper.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/server/sockhelper.c b/src/server/sockhelper.c index e45efba..fb09ec2 100644 --- a/src/server/sockhelper.c +++ b/src/server/sockhelper.c @@ -189,3 +189,26 @@ bool sock_append(poll_list_t *list, const int sock, bool wantRead, bool wantWrit list->count++; return true; } + +ssize_t sock_sendAll(int sock, void *buffer, 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 ( errno == EINTR ) continue; + if ( errno == EAGAIN || errno == EWOULDBLOCK ) { + usleep( 1000 ); + continue; + } + break; + } + if ( ret == 0 ) break; + done += ret; + } + if ( done == 0 ) return ret; + return done; +} + |