add inet_pton (and inet_ntop) functional tests
[libc-test] / src / common / runtest.c
index 95e615e..28504c4 100644 (file)
@@ -14,44 +14,66 @@ 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;
                if (kill(pid, SIGKILL) == -1)
@@ -59,6 +81,7 @@ int main(int argc, char *argv[])
        }
        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)) {