Avoid a compiler warnings about a signed/unsigned mismatch.
[rsync/rsync.git] / testrun.c
CommitLineData
45426a76
WD
1/* Run a testsuite script with a timeout. */
2
3#include "rsync.h"
4
e9ad7bb1 5#define MAX_TEST_SECONDS (5*60)
45426a76
WD
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}