summaryrefslogtreecommitdiffstats
path: root/src/server/sockhelper.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/sockhelper.c')
-rw-r--r--src/server/sockhelper.c23
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;
+}
+