diff options
Diffstat (limited to 'test')
-rwxr-xr-x | test/runtest | 26 | ||||
-rw-r--r-- | test/src/server.c | 14 |
2 files changed, 34 insertions, 6 deletions
diff --git a/test/runtest b/test/runtest index 7fc658a20..f0a633d61 100755 --- a/test/runtest +++ b/test/runtest @@ -1926,7 +1926,8 @@ if (/^(ln|ls|du|mkdir|mkfifo|touch|cp|cat)\s/ || if (/^server\s+(.*)$/) { - $cmd = "./bin/server $server_opts $1 >>test-stdout-server"; + $pidfile = "$parm_cwd/aux-var/server-daemon.pid"; + $cmd = "./bin/server $server_opts -oP $pidfile $1 >>test-stdout-server"; print ">> $cmd\n" if ($debug); $server_pid = open SERVERCMD, "|$cmd" || tests_exit(-1, "Failed to run $cmd"); SERVERCMD->autoflush(1); @@ -1940,10 +1941,9 @@ if (/^server\s+(.*)$/) print SERVERCMD "++++\n"; # Send end to server; can't send EOF yet # because close() waits for the process. - # This gives the server time to get started; otherwise the next + # Interlock the server startup; otherwise the next # process may not find it there when it expects it. - - select(undef, undef, undef, 0.5); + while (! stat("$pidfile") ) { select(undef, undef, undef, 0.3); } return 3; } @@ -2119,6 +2119,7 @@ elsif (/^([A-Z_]+=\S+\s+)?(\d+)?\s*(sudo\s+)?exim(_\S+)?\s+(.*)$/) if ($cmd =~ /\s-DSERVER=server\s/ && $cmd !~ /\s-DNOTDAEMON\s/) { + $pidfile = "$parm_cwd/spool/exim-daemon.pid"; if ($debug) { printf ">> daemon: $cmd\n"; } run_system("sudo mkdir spool/log 2>/dev/null"); run_system("sudo chown $parm_eximuser:$parm_eximgroup spool/log"); @@ -2129,12 +2130,23 @@ elsif (/^([A-Z_]+=\S+\s+)?(\d+)?\s*(sudo\s+)?exim(_\S+)?\s+(.*)$/) # file is written to the spool directory, in case the Exim binary was # built with PID_FILE_PATH pointing somewhere else. - $cmd =~ s!\s-bd\s! -bdf -oP $parm_cwd/spool/exim-daemon.pid !; + if ($cmd =~ /\s-oP\s/) + { + ($pidfile = $cmd) =~ s/^.*-oP ([^ ]+).*$/$1/; + $cmd =~ s!\s-bd\s! -bdf !; + } + else + { + $pidfile = "$parm_cwd/spool/exim-daemon.pid"; + $cmd =~ s!\s-bd\s! -bdf -oP $pidfile !; + } print ">> |${cmd}-server\n" if ($debug); open DAEMONCMD, "|${cmd}-server" || tests_exit(-1, "Failed to run $cmd"); DAEMONCMD->autoflush(1); while (<SCRIPT>) { $lineno++; last if /^\*{4}\s*$/; } # Ignore any input - select(undef, undef, undef, 0.3); # Let the daemon get going + + # Interlock with daemon startup + while (! stat("$pidfile") ) { select(undef, undef, undef, 0.3); } return 3; # Don't wait } elsif ($cmd =~ /\s-DSERVER=wait:(\d+)\s/) @@ -3591,6 +3603,8 @@ foreach $test (@test_list) my($rc, $run_extra) = run_command($testno, \$subtestno, \$expectrc, \$commandname, $TEST_STATE); my($cmdrc) = $?; +$0 = "[runtest $testno]"; + if ($debug) { print ">> rc=$rc cmdrc=$cmdrc\n"; if (defined $run_extra) { diff --git a/test/src/server.c b/test/src/server.c index e425880a8..b94da5e68 100644 --- a/test/src/server.c +++ b/test/src/server.c @@ -173,6 +173,7 @@ line *last = NULL; line *s; FILE *in, *out; int linebuf = 1; +char *pidfile = NULL; char *sockname = NULL; unsigned char buffer[10240]; @@ -205,6 +206,7 @@ while (na < argc && argv[na][0] == '-') else if (strcmp(argv[na], "-i") == 0) initial_pause = atoi(argv[++na]); else if (strcmp(argv[na], "-noipv4") == 0) use_ipv4 = 0; else if (strcmp(argv[na], "-noipv6") == 0) use_ipv6 = 0; + else if (strcmp(argv[na], "-oP") == 0) pidfile = argv[++na]; else { printf("server: unknown option %s\n", argv[na]); @@ -409,6 +411,18 @@ for (i = 0; i <= skn; i++) } +if (pidfile) + { + FILE * p; + if (!(p = fopen(pidfile, "w"))) + { + fprintf(stderr, "pidfile create failed: %s\n", strerror(errno)); + exit(1); + } + fprintf(p, "%ld\n", (long)getpid()); + fclose(p); + } + /* This program handles only a fixed number of connections, in sequence. Before waiting for the first connection, read the standard input, which contains the script of things to do. A line containing "++++" is treated as end of file. |