Fix a compiler warning about a %d mismatch.
[rsync/rsync.git] / testrun.c
1 /* Run a testsuite script with a timeout. */
2
3 #include "rsync.h"
4
5 #define MAX_TEST_SECONDS (3*60)
6
7  int main(int argc, char *argv[])
8 {
9         pid_t pid;
10         int status, slept = 0;
11
12         if (argc < 2) {
13                 fprintf(stderr, "Usage: testrun [SHELL_OPTIONS] TESTSUITE_SCRIPT [ARGS]\n");
14                 exit(1);
15         }
16
17         if ((pid = fork()) < 0) {
18                 fprintf(stderr, "TESTRUN ERROR: fork failed: %s\n", strerror(errno));
19                 exit(1);
20         }
21
22         if (pid == 0) {
23                 argv[0] = "sh";
24                 execvp(argv[0], argv);
25                 fprintf(stderr, "TESTRUN ERROR: failed to exec %s: %s\n", argv[0], strerror(errno));
26                 _exit(1);
27         }
28
29         while (1) {
30                 int ret = waitpid(pid, &status, WNOHANG);
31                 if (ret > 0)
32                         break;
33                 if (ret < 0) {
34                         if (errno == EINTR)
35                                 continue;
36                         fprintf(stderr, "TESTRUN ERROR: waitpid failed: %s\n", strerror(errno));
37                         exit(1);
38                 }
39                 if (slept++ > MAX_TEST_SECONDS) {
40                         fprintf(stderr, "TESTRUN TIMEOUT: test took over %d seconds.\n", MAX_TEST_SECONDS);
41                         if (kill(pid, SIGTERM) < 0)
42                                 fprintf(stderr, "TESTRUN ERROR: failed to kill pid %ld: %s\n", (long)pid, strerror(errno));
43                         else
44                                 fprintf(stderr, "TESTRUN INFO: killed pid %ld\n", (long)pid);
45                         exit(1);
46                 }
47                 sleep(1);
48         }
49
50         if (!WIFEXITED(status))
51                 exit(255);
52
53         return WEXITSTATUS(status);
54 }