From: Andreas Ă–man Date: Mon, 5 Nov 2012 12:05:43 +0000 (+0100) Subject: HTSP: Handle partial write()s X-Git-Tag: v3.5~294^2~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d5deb9d19d57feef8acf25df2877539b4af0d39a;p=thirdparty%2Ftvheadend.git HTSP: Handle partial write()s --- diff --git a/src/htsp_server.c b/src/htsp_server.c index d1f65f602..8fcbdd415 100644 --- a/src/htsp_server.c +++ b/src/htsp_server.c @@ -1469,24 +1469,30 @@ htsp_write_scheduler(void *aux) r = htsmsg_binary_serialize(hm->hm_msg, &dptr, &dlen, INT32_MAX); -#if 0 - if(hm->hm_pktref) { - usleep(hm->hm_payloadsize * 3); - } -#endif htsp_msg_destroy(hm); - - /* ignore return value */ - r = write(htsp->htsp_fd, dptr, dlen); - if(r != dlen) - tvhlog(LOG_INFO, "htsp", "%s: Write error -- %s", - htsp->htsp_logname, strerror(errno)); - free(dptr); + + void *freeme = dptr; + + while(dlen > 0) { + r = write(htsp->htsp_fd, dptr, dlen); + if(r < 1) { + tvhlog(LOG_INFO, "htsp", "%s: Write error -- %s", + htsp->htsp_logname, strerror(errno)); + break; + } + + dptr += r; + dlen -= r; + } + + free(freeme); pthread_mutex_lock(&htsp->htsp_out_mutex); - if(r != dlen) + if(dlen) break; } + // Shutdown socket to make receive thread terminate entire HTSP connection + shutdown(htsp->htsp_fd, SHUT_RDWR); pthread_mutex_unlock(&htsp->htsp_out_mutex); return NULL; }