From e4d054654f30ad8be900e72e1f943f93baf1809c Mon Sep 17 00:00:00 2001 From: Jay Sorg Date: Wed, 6 Aug 2014 12:11:59 -0700 Subject: [PATCH] pulse sink: check for partial sends --- sesman/chansrv/pulse/module-xrdp-sink.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/sesman/chansrv/pulse/module-xrdp-sink.c b/sesman/chansrv/pulse/module-xrdp-sink.c index d072c0d4..8606f412 100644 --- a/sesman/chansrv/pulse/module-xrdp-sink.c +++ b/sesman/chansrv/pulse/module-xrdp-sink.c @@ -277,6 +277,19 @@ static int get_display_num_from_display(char *display_text) { return display_num; } +static int lsend(int fd, char *data, int bytes) { + int sent = 0; + int error; + while (sent < bytes) { + error = send(fd, data + sent, bytes - sent, 0); + if (error < 1) { + return error; + } + sent += error; + } + return sent; +} + static int data_send(struct userdata *u, pa_memchunk *chunk) { char *data; int bytes; @@ -325,7 +338,7 @@ static int data_send(struct userdata *u, pa_memchunk *chunk) { h.code = 0; h.bytes = bytes + 8; - if (send(u->fd, &h, 8, 0) != 8) { + if (lsend(u->fd, (char*)(&h), 8) != 8) { pa_log("data_send: send failed"); close(u->fd); u->fd = 0; @@ -336,7 +349,7 @@ static int data_send(struct userdata *u, pa_memchunk *chunk) { data = (char*)pa_memblock_acquire(chunk->memblock); data += chunk->index; - sent = send(u->fd, data, bytes, 0); + sent = lsend(u->fd, data, bytes); pa_memblock_release(chunk->memblock); if (sent != bytes) { @@ -358,7 +371,7 @@ static int close_send(struct userdata *u) { } h.code = 1; h.bytes = 8; - if (send(u->fd, &h, 8, 0) != 8) { + if (lsend(u->fd, (char*)(&h), 8) != 8) { pa_log("close_send: send failed"); close(u->fd); u->fd = 0;