new solver specific test
[oweals/gnunet.git] / contrib / timeout_watchdog.c
index c8c339167f235fddb1f0e20e7ecc723aeba75f3a..a33f67adc007b6eb84335988eaeeb8556865db2e 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)
-{ 
-  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)
-{
-   setpgid(0,gpid);
-   execvp(argv[2],&argv[2]);
-   exit(1);
-}
-if (child > 0)
+int
+main (int argc, char *argv[])
 {
 {
-  sleep(timeout);
-  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);
+      if (-1 != 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 */