citrun

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

commit f8ef48e5010f9c6d42fa0cf9a695386a5f3c48b9
parent 31178cc37868a70e5a3bcef8d57e9c73a5730911
Author: Kyle Milz <kyle@0x30.net>
Date:   Thu, 30 Jun 2016 22:05:57 -0600

lib: fork a viewer if CITRUN_SOCKET not set and default path doesn't exist

Diffstat:
Mlib/runtime.c | 23+++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/lib/runtime.c b/lib/runtime.c @@ -4,7 +4,7 @@ #include <pthread.h> /* pthread_create */ #include <stdlib.h> /* getenv */ #include <string.h> /* strlcpy */ -#include <unistd.h> /* getpid, getppid, getpgrp, read, write */ +#include <unistd.h> /* access, get{pid,ppid,pgrp}, read, write */ #include <sys/socket.h> /* socket */ #include <sys/un.h> /* sockaddr_un */ @@ -174,6 +174,20 @@ send_dynamic(int fd) warnx("tu chain is longer than before"); } +static void +fork_viewer() +{ + pid_t pid; + + pid = fork(); + if (pid < 0) + err(1, "fork"); + else if (pid == 0) + execlp("citrun-gl", "citrun-gl", NULL); + else + warnx("socket not found, forking viewer"); +} + /* * Relays line count data over a Unix domain socket. */ @@ -188,9 +202,14 @@ relay_thread(void *arg) if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) err(1, "socket"); - if ((viewer_sock = getenv("CITRUN_SOCKET")) == NULL) + if ((viewer_sock = getenv("CITRUN_SOCKET")) == NULL) { viewer_sock = "/tmp/citrun-gl.socket"; + /* Fork a viewer if the default socket path doesn't exist */ + if (access(viewer_sock, F_OK) < 0) + fork_viewer(); + } + memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strlcpy(addr.sun_path, viewer_sock, sizeof(addr.sun_path));