/* LCOV_EXCL_START */ #if defined(COVERAGE) #include #include #include #include #include #include #include #include #include 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 */