citrun

watch C/C++ source code execute
Log | Files | Refs | LICENSE

commit 9d0017c5ff1956ed9ae07e33eeacd935925a5317
parent 905acde2827edb88249aacf2fc24c48eeda85a46
Author: Kyle Milz <kyle@0x30.net>
Date:   Thu, 28 Jul 2016 21:40:49 -0600

lib: reconnect when current connection fails

Diffstat:
Mlib/runtime.c | 29++++++++++++++++++-----------
1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/lib/runtime.c b/lib/runtime.c @@ -91,9 +91,11 @@ xread(int d, const void *buf, size_t bytes_total) while (bytes_left > 0) { n = read(d, (uint8_t *)buf + bytes_read, bytes_left); - if (n == 0) + if (n == 0) { /* Disconnect */ - errx(1, "read 0 bytes on socket"); + warnx("citrun: viewer disconnected, reconnecting.."); + return 0; + } if (n < 0) err(1, "read()"); @@ -241,9 +243,6 @@ relay_thread(void *arg) int fd; uint8_t response; - if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) - err(1, "socket"); - if ((viewer_sock = getenv("CITRUN_SOCKET")) == NULL) { viewer_sock = "/tmp/citrun.socket"; @@ -252,11 +251,14 @@ relay_thread(void *arg) fork_viewer(); } - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_UNIX; - strlcpy(addr.sun_path, viewer_sock, sizeof(addr.sun_path)); - while (1) { + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) + err(1, "socket"); + + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strlcpy(addr.sun_path, viewer_sock, sizeof(addr.sun_path)); + if (connect(fd, (struct sockaddr *)&addr, sizeof(addr))) { /* warn("connect"); */ sleep(1); @@ -266,10 +268,15 @@ relay_thread(void *arg) /* Send static information first. */ send_static(fd); + /* Synchronously send changing data. */ while (1) { - /* Synchronously send changing data. */ send_dynamic(fd); - xread(fd, &response, 1); + if (xread(fd, &response, 1) == 0) + /* Viewer disconnected, go back to connect. */ + break; } + + shutdown(fd, SHUT_RDWR); + close(fd); } }