Home | History | Annotate | Download | only in testzzuf
      1 /*
      2      This file is part of libmicrohttpd
      3      Copyright (C) 2008 Christian Grothoff
      4 
      5      libmicrohttpd 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      libmicrohttpd 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 libmicrohttpd; 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 socat.c
     23  * @brief  Code to fork-exec zzuf and start the socat process
     24  * @author Christian Grothoff
     25  */
     26 
     27 #include <errno.h>
     28 #include <sys/types.h>
     29 #include <sys/wait.h>
     30 #include <signal.h>
     31 
     32 #ifdef _WIN32
     33 #ifndef WIN32_LEAN_AND_MEAN
     34 #define WIN32_LEAN_AND_MEAN 1
     35 #endif /* !WIN32_LEAN_AND_MEAN */
     36 #include <windows.h>
     37 #endif
     38 
     39 
     40 /**
     41  * A larger loop count will run more random tests --
     42  * which would be good, except that it may take too
     43  * long for most user's patience.  So this small
     44  * value is the default.
     45  */
     46 #define LOOP_COUNT 10
     47 
     48 #define CURL_TIMEOUT 50L
     49 
     50 static pid_t zzuf_pid;
     51 
     52 static void
     53 zzuf_socat_start ()
     54 {
     55   int status;
     56   char *const args[] = {
     57     "zzuf",
     58     "--ratio=0.0:0.75",
     59     "-n",
     60     "-A",
     61     "--",
     62     "socat",
     63     "-lf",
     64     "/dev/null",
     65     "TCP4-LISTEN:11081,reuseaddr,fork",
     66     "TCP4:127.0.0.1:11080",
     67     NULL,
     68   };
     69   zzuf_pid = fork ();
     70   if (zzuf_pid == -1)
     71     {
     72       fprintf (stderr, "fork failed: %s\n", strerror (errno));
     73       exit (1);
     74     }
     75   if (zzuf_pid != 0)
     76     {
     77       sleep (1);                /* allow zzuf and socat to start */
     78       status = 0;
     79       if (0 < waitpid (zzuf_pid, &status, WNOHANG))
     80         {
     81           if (WIFEXITED (status))
     82             fprintf (stderr,
     83                      "zzuf died with status code %d!\n",
     84                      WEXITSTATUS (status));
     85           if (WIFSIGNALED (status))
     86             fprintf (stderr,
     87                      "zzuf died from signal %d!\n", WTERMSIG (status));
     88           exit (1);
     89         }
     90       return;
     91     }
     92   setpgrp ();
     93   execvp ("zzuf", args);
     94   fprintf (stderr, "execution of `zzuf' failed: %s\n", strerror (errno));
     95   zzuf_pid = 0;                 /* fork failed */
     96   exit (1);
     97 }
     98 
     99 
    100 static void
    101 zzuf_socat_stop ()
    102 {
    103   int status;
    104   if (zzuf_pid != 0)
    105     {
    106       if (0 != killpg (zzuf_pid, SIGINT))
    107         fprintf (stderr, "Failed to killpg: %s\n", strerror (errno));
    108       kill (zzuf_pid, SIGINT);
    109       waitpid (zzuf_pid, &status, 0);
    110       sleep (1);                /* allow socat to also die in peace */
    111     }
    112 }
    113 
    114 /* end of socat.c */
    115