diff options
Diffstat (limited to 'src/client.c')
-rw-r--r-- | src/client.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/client.c b/src/client.c new file mode 100644 index 0000000..e95bb0f --- /dev/null +++ b/src/client.c @@ -0,0 +1,97 @@ +/* LCOV_EXCL_START */ +#if defined(COVERAGE) + +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <assert.h> + +#include <sys/socket.h> +#include <sys/un.h> + +#include <covsrv/covsrv.h> + +int sock = -1; + +int covsrv_init() +{ + char *name = getenv("COVSRV_SOCKET"); + if (!name) { + fprintf(stderr, "\tCOVSRV: SOCK -- COVSRV_SOCKET not defined\n"); + return -1; + } + + sock = socket(AF_UNIX, SOCK_SEQPACKET, 0); + if (sock == -1) { + fprintf(stderr, "\tCOVSRV: SOCK -- failed opening %s: %s\n", + name, strerror(errno)); + return -1; + } + + struct sockaddr_un addr; + memset(&addr, 0, sizeof(addr)); + + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, name, sizeof(addr.sun_path) - 1); + + if (connect(sock, (const struct sockaddr *)&addr, sizeof(addr)) == -1) { + fprintf(stderr, "\tCOVSRV: SOCK -- failed opening connection to %s: %s\n", + name, strerror(errno)); + close(sock); + sock = -1; + return -1; + } + + return 0; +} + +int covsrv_die2(const char *id) +{ + assert(sock != -1); + ssize_t len = (ssize_t)strlen(id); + ssize_t w = write(sock, id, len); + if (w == -1) { + fprintf(stderr, "\tCOVSRV: WRITE -- write failed: %s\n", + strerror(errno)); + + abort(); + return 0; + } + + /* could try to send the rest instead of printing a warning? */ + if (w != len) + fprintf(stderr, "\tCOVSRV: WRITE -- partial write\n"); + + int seen = 0; + ssize_t r = read(sock, &seen, sizeof(seen)); + if (r == -1) { + fprintf(stderr, "\tCOVSRV: READ -- read failed: %s\n", + strerror(errno)); + abort(); + return 0; + } + + if (r != sizeof(seen)) { + fprintf(stderr, "\tCOVSRV: READ -- partial read\n"); + abort(); + return 0; + } + + if (seen) + return 0; + + printf("\tCOVSRV: DIE @ %s\n", id); + return 1; +} + +void covsrv_destroy() +{ + assert(sock != -1); + close(sock); + printf("\tCOVSRV: EXIT\n"); +} + +#endif /* COVERAGE */ +/* LCOV_EXCL_STOP */ |