summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2014-08-06 12:11:59 -0700
committerJay Sorg <jay.sorg@gmail.com>2014-08-06 12:11:59 -0700
commite4d054654f30ad8be900e72e1f943f93baf1809c (patch)
tree39008f0ffbeda05a5f6e7bddfbcc9616cfd8ccea
parent2e17b70fcde032cc43f8aaf5aec052cdb3efff92 (diff)
downloadxrdp-proprietary-e4d054654f30ad8be900e72e1f943f93baf1809c.tar.gz
xrdp-proprietary-e4d054654f30ad8be900e72e1f943f93baf1809c.zip
pulse sink: check for partial sends
-rw-r--r--sesman/chansrv/pulse/module-xrdp-sink.c19
1 files 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;