diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-06-09 18:54:58 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-06-09 18:54:58 +0300 |
commit | c4dbd40477bb658cdc5c5e01b8f80057e587cd88 (patch) | |
tree | 73534b2cd2fff99e16c26ed4be8cf115cf4b3960 /tests/to.c | |
parent | c33922f128403f5d05d24f19abeaad2368ce5467 (diff) | |
download | pies-c4dbd40477bb658cdc5c5e01b8f80057e587cd88.tar.gz pies-c4dbd40477bb658cdc5c5e01b8f80057e587cd88.tar.bz2 |
Test inetd components.
* lib/Makefile.am: Add urlconn.c
* lib/libpies.h (url_connect): New proto.
* lib/urlconn.c: New file.
* src/piesctl.c (shttp_connect): Use url_connect.
* tests/.gitignore: Update.
* tests/Makefile.am: New auxtool: aux/in.test
New test: inet.at
* tests/aux/in.test: New file.
* tests/inet.at: New file.
* tests/iobuf.h: New file.
* tests/nt.c: New file.
* tests/testsuite.at: Add new test.
* tests/to.c: explicitly terminate the child process on timeout.
Diffstat (limited to 'tests/to.c')
-rw-r--r-- | tests/to.c | 50 |
1 files changed, 41 insertions, 9 deletions
@@ -1,74 +1,106 @@ +#include <config.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> +#include <signal.h> + +int volatile got_sigchld, got_sigalrm; + +void +sighan (int sig) +{ + switch (sig) + { + case SIGCHLD: + got_sigchld = 1; + break; + + case SIGALRM: + got_sigalrm = 1; + break; + } +} int main (int argc, char **argv) { char *progname = argv[0]; unsigned long n; char *p; pid_t pid, ret; int status; - + if (argc < 3) { fprintf (stderr, "usage: %s TIMEOUT COMMAND ...\n", progname); exit (1); } errno = 0; n = strtoul (argv[1], &p, 10); if (errno || *p || n == 0) { fprintf (stderr, "%s: %s is not a valid timeout\n", progname, argv[1]); exit (1); } argc -= 2; argv += 2; + signal (SIGALRM, sighan); + signal (SIGCHLD, sighan); + pid = fork (); if (pid == -1) { perror ("fork"); exit (127); } - + if (pid == 0) { execvp (argv[0], argv); perror (argv[0]); exit (127); } alarm (n); + while (1) + { + pause (); + if (got_sigchld) + { + alarm (0); + break; + } + if (got_sigalrm) + { + fprintf (stderr, "%s: timed out\n", progname); + kill (pid, SIGKILL); + exit (127); + } + } + ret = wait (&status); - alarm (0); if (ret != pid) { perror ("wait"); exit (127); } if (WIFEXITED (status)) return WEXITSTATUS (status); - + if (WIFSIGNALED (status)) fprintf (stderr, "%s: %s terminated on signal %d\n", progname, argv[0], WTERMSIG (status)); else if (WIFSTOPPED (status)) fprintf (stderr, "%s: %s stopped\n", progname, argv[0]); else fprintf (stderr, "%s: %s exited with unrecognized status %d\n", progname, argv[0], status); return 127; } - - - - - |