{
}
-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;
if (kill(pid, SIGKILL) == -1)
}
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)) {