summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert James Kaes <rjkaes@users.sourceforge.net>2002-05-23 18:27:01 +0000
committerRobert James Kaes <rjkaes@users.sourceforge.net>2002-05-23 18:27:01 +0000
commit16386fbb70b848a810a43a96eb8b1968610c652e (patch)
tree05ea2ec3e8c3e161a3d929a5b7c323f404d59b1c
parent478030c6ff6089c71d9ea7d4a4f04fbd63d53fb4 (diff)
downloadtinyproxy-16386fbb70b848a810a43a96eb8b1968610c652e.tar.gz
tinyproxy-16386fbb70b848a810a43a96eb8b1968610c652e.zip
Added a new signal handler to handle SIGCHLD signals because of the new
dnsserver child process. Changed the set signal calls to use our new set_signal_handler() function. Added code to start the "dnsserver" child process.
-rw-r--r--src/tinyproxy.c57
1 files changed, 50 insertions, 7 deletions
diff --git a/src/tinyproxy.c b/src/tinyproxy.c
index 0f0bf7b..d2ea00b 100644
--- a/src/tinyproxy.c
+++ b/src/tinyproxy.c
@@ -1,4 +1,4 @@
-/* $Id: tinyproxy.c,v 1.29 2002-04-24 16:45:45 rjkaes Exp $
+/* $Id: tinyproxy.c,v 1.30 2002-05-23 18:27:01 rjkaes Exp $
*
* The initialise routine. Basically sets up all the initial stuff (logfile,
* listening socket, config options, etc.) and then sits there and loops
@@ -26,6 +26,9 @@
#include "anonymous.h"
#include "buffer.h"
+#include "daemon.h"
+#include "dnsclient.h"
+#include "heap.h"
#include "filter.h"
#include "log.h"
#include "reqs.h"
@@ -53,6 +56,9 @@ bool_t processed_config_file = FALSE;
void
takesig(int sig)
{
+ pid_t pid;
+ int status;
+
switch (sig) {
case SIGHUP:
log_rotation_request = TRUE;
@@ -61,11 +67,14 @@ takesig(int sig)
case SIGTERM:
config.quit = TRUE;
break;
+
+ case SIGCHLD:
+ while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
+ ;
+ break;
}
- if (sig != SIGTERM)
- signal(sig, takesig);
- signal(SIGPIPE, SIG_IGN);
+ return;
}
/*
@@ -292,11 +301,17 @@ main(int argc, char **argv)
pidfile_create(config.pidpath);
}
- if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
+ if (set_signal_handler(SIGPIPE, SIG_IGN) == SIG_ERR) {
fprintf(stderr, "%s: Could not set the \"SIGPIPE\" signal.\n",
argv[0]);
exit(EX_OSERR);
}
+ if (set_signal_handler(SIGCHLD, takesig) == SIG_ERR) {
+ fprintf(stderr, "%s: Could not set the \"SIGCHLD\" signal.\n",
+ argv[0]);
+ exit(EX_OSERR);
+ }
+
#ifdef FILTER_ENABLE
if (config.filter)
filter_init();
@@ -354,6 +369,29 @@ main(int argc, char **argv)
"Not running as root, so not changing UID/GID.");
}
+ /*
+ * Start the "dnsserver" child process.
+ */
+ if (config.dnsserver_location && config.dnsserver_socket) {
+ struct stat stat_buf;
+ if (lstat(config.dnsserver_socket, &stat_buf) == 0 || errno != ENOENT) {
+ fprintf(stderr, "%s:\nThere was a problem creating the dnsserver socket.\nPlease remove '%s'.\n",
+ argv[0], config.dnsserver_socket);
+ exit(EX_OSERR);
+ }
+
+ start_dnsserver(config.dnsserver_location,
+ config.dnsserver_socket);
+ } else {
+ if (!config.dnsserver_location) {
+ fprintf(stderr, "%s: You must provide a location for the 'dnsserver' program.\n", argv[0]);
+ }
+ if (!config.dnsserver_socket) {
+ fprintf(stderr, "%s: You must provide a path for the 'dnsserver' socket.\n", argv[0]);
+ }
+ exit(EX_SOFTWARE);
+ }
+
if (thread_pool_create() < 0) {
fprintf(stderr, "%s: Could not create the pool of threads.",
argv[0]);
@@ -364,12 +402,12 @@ main(int argc, char **argv)
* These signals are only for the main thread.
*/
log_message(LOG_INFO, "Setting the various signals.");
- if (signal(SIGTERM, takesig) == SIG_ERR) {
+ if (set_signal_handler(SIGTERM, takesig) == SIG_ERR) {
fprintf(stderr, "%s: Could not set the \"SIGTERM\" signal.\n",
argv[0]);
exit(EX_OSERR);
}
- if (signal(SIGHUP, takesig) == SIG_ERR) {
+ if (set_signal_handler(SIGHUP, takesig) == SIG_ERR) {
fprintf(stderr, "%s: Could not set the \"SIGHUP\" signal.\n",
argv[0]);
exit(EX_OSERR);
@@ -393,6 +431,11 @@ main(int argc, char **argv)
thread_close_sock();
/*
+ * Stop the "dnsserver" child process.
+ */
+ stop_dnsserver();
+
+ /*
* Remove the PID file.
*/
if (unlink(config.pidpath) < 0) {