new solver specific test
[oweals/gnunet.git] / contrib / timeout_watchdog.c
index 2fb4cd20bf9b8b20cbdd39a4abd294445dd76229..a33f67adc007b6eb84335988eaeeb8556865db2e 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet
 /*
      This file is part of GNUnet
-     (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors)
+     (C) 2010 Christian Grothoff (and other contributing authors)
 
      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);
   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));
-  }   
-  exit(ret);  
+  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);
 }
 
 }
 
-void sigint_handler(int val)
-{ 
-  printf("Killing test process\n");
-  kill(0, SIGINT);
-  exit(0);
+static void
+sigint_handler (int val)
+{
+  kill (0, val);
+  exit (val);
 }
 
 }
 
-
-int main(int argc, char *argv[])
+int
+main (int argc, char *argv[])
 {
 {
-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);
-}
+  int timeout = 0;
+  pid_t gpid = 0;
 
 
-timeout = atoi(argv[1]);
+  if (argc < 3)
+    {
+      printf
+       ("arg 1: timeout in sec., arg 2: executable, arg<n> arguments\n");
+      exit (1);
+    }
 
 
-if (timeout == 0)
-  timeout = 600;   
+  timeout = atoi (argv[1]);
 
 
+  if (timeout == 0)
+    timeout = 600;
 
 
-char ** arguments = &argv[3];
+/* with getpgid() it does not compile, but getpgrp is the BSD version and working */
+  gpid = getpgrp ();
 
 
-pid_t gpid = getpgid(0);
+  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)
-{ 
-  signal(SIGCHLD, sigchld_handler);  
-  signal(SIGINT, sigint_handler);
-}
-for (;;)
-{
-  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[1]); 
-     exit(1);
-  }
+  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)
   if (child > 0)
-  {
-    sleep(1);    
-    remain++;
-    if (timeout == remain)
     {
     {
-      printf("Timeout, killing all test processes\n");        
-      kill(0,SIGABRT);
-      exit(1);
+      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 */
\ No newline at end of file
+/* end of timeout_watchdog.c */