def
[oweals/gnunet.git] / contrib / timeout_watchdog.c
index dfeed6782b18722a5df18d5ff7667e976906bf2c..b28e8e833b7bf380040a5e42392757a669c4a81e 100644 (file)
@@ -4,7 +4,7 @@
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
  * @author Matthias Wachs
  */
 
  * @author Matthias Wachs
  */
 
-#include "signal.h"
-#include "stdio.h"
-#include "stdlib.h"
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <unistd.h>
 #include <unistd.h>
-#include <wait.h>
 
 
-static int child_died;
 static pid_t child;
 
 static pid_t child;
 
-void sigchld_handler(int val)
+static void
+sigchld_handler (int val)
 {
   int status = 0;
   int ret = 0;
 {
   int status = 0;
   int ret = 0;
-  
-  waitpid (child, &status, 0);
-  if (WIFEXITED(status) == 1)
-  {
-    ret = WEXITSTATUS(status);
-    printf("Test process exited with result %u\n", ret);
-  }
-  if (WIFSIGNALED(status) == 1)
-  {
-    printf("Test process was signaled %u\n", WTERMSIG(status));
-    ret = WTERMSIG(status);
-  }   
-  exit(ret);  
-}
 
 
-void sigint_handler(int val)
-{ 
-  printf("Killing test process\n");
-  kill(0, val);
-  exit(1);
+  waitpid (child, &status, 0);
+  if (WIFEXITED (status) != 0)
+    {
+      ret = WEXITSTATUS (status);
+      printf ("Test process exited with result %u\n", ret);
+    }
+  if (WIFSIGNALED (status) != 0)
+    {
+      ret = WTERMSIG (status);
+      printf ("Test process was signaled %u\n", ret);
+    }
+  exit (ret);
 }
 
 }
 
-
-int main(int argc, char *argv[])
+static void
+sigint_handler (int val)
 {
 {
-int timeout = 0;
-int remain = 0;
-int ret = 0;
-
-if (argc < 3)
-{  
-  printf("arg 1: timeout in sec., arg 2: executable, arg<n> arguments\n");     
-  exit(1);
+  kill (0, val);
+  exit (val);
 }
 
 }
 
-timeout = atoi(argv[1]);
-
-if (timeout == 0)
-  timeout = 600;   
-
-
-char ** arguments = &argv[3];
-
-pid_t gpid = getpgid(0);
-signal(SIGCHLD, sigchld_handler);
-signal(SIGABRT, sigint_handler);
-signal(SIGKILL, sigint_handler);
-signal(SIGILL,  sigint_handler);
-signal(SIGSEGV, sigint_handler);
-signal(SIGINT,  sigint_handler);
-signal(SIGTERM, sigint_handler);
-
-child = fork();
-if (child==0)
-{
-   printf("Starting test process `%s'\n",argv[2],arguments);
-   setpgid(0,gpid);
-   execvp(argv[2],&argv[2]);
-   printf("Test process `%s' could not be started\n",argv[2]);
-   exit(1);
-}
-if (child > 0)
+int
+main (int argc, char *argv[])
 {
 {
-  sleep(timeout);
-  printf("Timeout, killing all test processes\n");
-  kill(0,SIGABRT);
-  exit(1);
-}  
+  int timeout = 0;
+  pid_t gpid = 0;
+
+  if (argc < 3)
+    {
+      printf
+       ("arg 1: timeout in sec., arg 2: executable, arg<n> arguments\n");
+      exit (1);
+    }
+
+  timeout = atoi (argv[1]);
+
+  if (timeout == 0)
+    timeout = 600;
+
+/* with getpgid() it does not compile, but getpgrp is the BSD version and working */
+  gpid = getpgrp ();
+
+  signal (SIGCHLD, sigchld_handler);
+  signal (SIGABRT, sigint_handler);
+  signal (SIGFPE, sigint_handler);
+  signal (SIGILL, sigint_handler);
+  signal (SIGINT, sigint_handler);
+  signal (SIGSEGV, sigint_handler);
+  signal (SIGTERM, sigint_handler);
+
+  child = fork ();
+  if (child == 0)
+    {
+      /*  int setpgrp(pid_t pid, pid_t pgid); is not working on this machine */
+      //setpgrp (0, pid_t gpid);
+      setpgid (0, gpid);
+      execvp (argv[2], &argv[2]);
+      exit (1);
+    }
+  if (child > 0)
+    {
+      sleep (timeout);
+      printf ("Child processes were killed after timeout of %u seconds\n",
+             timeout);
+      kill (0, SIGTERM);
+      exit (1);
+    }
+  exit (1);
 }
 
 /* end of timeout_watchdog.c */
 }
 
 /* end of timeout_watchdog.c */