X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fcommon%2Fruntest.c;h=60e77baac49f36046722f68e634887c83cf0544a;hb=83e2fb402916e68f213d7809e7fb1c82fbf9294a;hp=95e615e693698547879c560f942ded9d20484a9a;hpb=29ee9ad500a1bcdbe60ae16c5405c6315b0c7fa0;p=libc-test diff --git a/src/common/runtest.c b/src/common/runtest.c index 95e615e..60e77ba 100644 --- a/src/common/runtest.c +++ b/src/common/runtest.c @@ -14,51 +14,76 @@ static void handler(int s) { } -static int start(char *argv[]) +static int start(char *wrap, char *argv[]) { int pid; pid = fork(); if (pid == 0) { t_setrlim(RLIMIT_STACK, 100*1024); - t_setrlim(RLIMIT_CPU, 2); - execv(argv[0], argv); + if (*wrap) { + argv--; + argv[0] = wrap; + } + execvp(argv[0], argv); t_error("%s exec failed: %s\n", argv[0], strerror(errno)); exit(1); } - if (pid == -1) { - t_error("%s fork failed: %s\n", argv[0], strerror(errno)); - exit(-1); - } return pid; } +static void usage(char *argv[]) +{ + t_error("usage: %s [-t timeoutsec] [-w wrapcmd] cmd [args..]\n", argv[0]); + exit(-1); +} + int main(int argc, char *argv[]) { + char *wrap = ""; + int timeoutsec = 5; + int timeout = 0; int status; sigset_t set; - int timeout = 0; - int sig = 0; + int opt; int pid; - if (argc < 2) { - t_error("usage: ./runtest cmd [args..]\n"); - return -1; + while ((opt = getopt(argc, argv, "w:t:")) != -1) { + switch (opt) { + case 'w': + wrap = optarg; + break; + case 't': + timeoutsec = atoi(optarg); + break; + default: + usage(argv); + } } - argv++; + if (optind >= argc) + usage(argv); + argv += optind; sigemptyset(&set); sigaddset(&set, SIGCHLD); sigprocmask(SIG_BLOCK, &set, 0); signal(SIGCHLD, handler); - pid = start(argv); - if (sigtimedwait(&set, 0, &(struct timespec){5,0}) == -1) { + pid = start(wrap, argv); + if (pid == -1) { + t_error("%s fork failed: %s\n", argv[0], strerror(errno)); + t_printf("FAIL %s [internal]\n", argv[0]); + return -1; + } + if (sigtimedwait(&set, 0, &(struct timespec){timeoutsec,0}) == -1) { if (errno == EAGAIN) timeout = 1; + else + t_error("%s sigtimedwait failed: %s\n", argv[0], strerror(errno)); if (kill(pid, SIGKILL) == -1) t_error("%s kill failed: %s\n", argv[0], strerror(errno)); } if (waitpid(pid, &status, 0) != pid) { t_error("%s waitpid failed: %s\n", argv[0], strerror(errno)); + t_printf("FAIL %s [internal]\n", argv[0]); return -1; } if (WIFEXITED(status)) {