diff --git a/src/source.c b/src/source.c index 4c8df193..d4dba06b 100644 --- a/src/source.c +++ b/src/source.c @@ -217,14 +217,21 @@ void *source_main(void *arg) bytes = abuf->len; sbytes = sock_write_bytes(client->con->sock, &abuf->data[client->pos], bytes); - if (sbytes >= 0) client->con->sent_bytes += sbytes; + if (sbytes >= 0) { + client->con->sent_bytes += sbytes; + if(sbytes != bytes) { + client->pos += sbytes; + refbuf_queue_insert(&client->queue, abuf); + data_done = 1; + break; + } + } if (sbytes < 0) { if (!sock_recoverable(sock_error())) { printf("SOURCE: Client had unrecoverable error catching up (%ld/%ld)\n", sbytes, bytes); client->con->error = 1; } else { printf("SOURCE: client had recoverable error...\n"); - client->pos += sbytes>0?sbytes:0; /* put the refbuf back on top of the queue, since we didn't finish with it */ refbuf_queue_insert(&client->queue, abuf); } @@ -246,7 +253,14 @@ void *source_main(void *arg) refbuf_queue_add(&client->queue, refbuf); } else { sbytes = sock_write_bytes(client->con->sock, refbuf->data, refbuf->len); - if (sbytes >= 0) client->con->sent_bytes += sbytes; + if (sbytes >= 0) { + client->con->sent_bytes += sbytes; + if(sbytes != bytes) { + client->pos = sbytes; + refbuf_addref(refbuf); + refbuf_queue_insert(&client->queue, abuf); + } + } if (sbytes < 0) { bytes = sock_error(); if (!sock_recoverable(bytes)) { @@ -254,7 +268,7 @@ void *source_main(void *arg) client->con->error = 1; } else { printf("SOURCE: recoverable error %ld\n", bytes); - client->pos = sbytes > 0 ? sbytes : 0; + client->pos = 0; refbuf_addref(refbuf); refbuf_queue_insert(&client->queue, refbuf); }