#define _GNU_SOURCE #include <errno.h> #include <error.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include "contain.h" char *append(char **destination, const char *format, ...) { char *extra, *result; va_list args; va_start(args, format); if (vasprintf(&extra, format, args) < 0) error(1, errno, "asprintf"); va_end(args); if (*destination == NULL) { *destination = extra; return extra; } if (asprintf(&result, "%s%s", *destination, extra) < 0) error(1, errno, "asprintf"); free(*destination); free(extra); *destination = result; return result; } char *string(const char *format, ...) { char *result; va_list args; va_start(args, format); if (vasprintf(&result, format, args) < 0) error(1, errno, "asprintf"); va_end(args); return result; } char *tmpdir(void) { char *dir; if (!(dir = strdup("/tmp/XXXXXX"))) error(1, errno, "strdup"); else if (!mkdtemp(dir)) error(1, 0, "Failed to create temporary directory"); return dir; } void waitforexit(pid_t child) { int status; if (waitpid(child, &status, 0) < 0) error(1, errno, "waitpid"); else if (WEXITSTATUS(status) != EXIT_SUCCESS) exit(WEXITSTATUS(status)); } void waitforstop(pid_t child) { int status; if (waitpid(child, &status, WUNTRACED) < 0) error(1, errno, "waitpid"); if (!WIFSTOPPED(status)) exit(WEXITSTATUS(status)); }