c8c339167f235fddb1f0e20e7ecc723aeba75f3a
[oweals/gnunet.git] / contrib / timeout_watchdog.c
1 /*
2      This file is part of GNUnet
3      (C) 2010 Christian Grothoff (and other contributing authors)
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 2, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21 /**
22  * @file contrib/timeout_watchdog.c
23  * @brief small tool starting a child process, waiting that it terminates or killing it after a given timeout period
24  * @author Matthias Wachs
25  */
26
27 #include "signal.h"
28 #include "stdio.h"
29 #include "stdlib.h"
30 #include <unistd.h>
31 #include <wait.h>
32
33 static int child_died;
34 static pid_t child;
35
36 void sigchld_handler(int val)
37 {
38   int status = 0;
39   int ret = 0;
40   
41   waitpid (child, &status, 0);
42   if (WIFEXITED(status) == 1)
43   {
44     ret = WEXITSTATUS(status);
45     printf("Test process exited with result %u\n", ret);
46   }
47   if (WIFSIGNALED(status) == 1)
48   {
49     printf("Test process was signaled %u\n", WTERMSIG(status));
50     ret = WTERMSIG(status);
51   }   
52   exit(ret);  
53 }
54
55 void sigint_handler(int val)
56
57   kill(0, val);
58   exit(1);
59 }
60
61
62 int main(int argc, char *argv[])
63 {
64 int timeout = 0;
65 int remain = 0;
66 int ret = 0;
67
68 if (argc < 3)
69 {  
70   printf("arg 1: timeout in sec., arg 2: executable, arg<n> arguments\n");     
71   exit(1);
72 }
73
74 timeout = atoi(argv[1]);
75
76 if (timeout == 0)
77   timeout = 600;   
78
79
80 char ** arguments = &argv[3];
81
82 pid_t gpid = getpgid(0);
83 signal(SIGCHLD, sigchld_handler);
84 signal(SIGABRT, sigint_handler);
85 signal(SIGKILL, sigint_handler);
86 signal(SIGILL,  sigint_handler);
87 signal(SIGSEGV, sigint_handler);
88 signal(SIGINT,  sigint_handler);
89 signal(SIGTERM, sigint_handler);
90
91 child = fork();
92 if (child==0)
93 {
94    setpgid(0,gpid);
95    execvp(argv[2],&argv[2]);
96    exit(1);
97 }
98 if (child > 0)
99 {
100   sleep(timeout);
101   kill(0,SIGABRT);
102   exit(1);
103 }  
104 }
105
106 /* end of timeout_watchdog.c */