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
zzuf_socat_start()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
zzuf_socat_stop()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