From 2ee61db6afc88fcea904d0905df0dd920616eb54 Mon Sep 17 00:00:00 2001 From: Robert James Kaes Date: Thu, 23 May 2002 04:39:32 +0000 Subject: Initial addition into CVS. Moves various functions relating the daemon processes. Added a portable signal handler setting function. --- src/daemon.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/daemon.c (limited to 'src/daemon.c') diff --git a/src/daemon.c b/src/daemon.c new file mode 100644 index 0000000..ec553da --- /dev/null +++ b/src/daemon.c @@ -0,0 +1,74 @@ +/* $Id: daemon.c,v 1.1 2002-05-23 04:39:32 rjkaes Exp $ + * + * This file contains functions which are useful when writing a + * daemon process. The functions include a "makedaemon" function and + * a function to portably set a signal handler. + * + * Copyright (C) 2002 Robert James Kaes (rjkaes@flarenet.com) + * + * This program 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 option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include "tinyproxy.h" + +#include "daemon.h" + +/* + * Fork a child process and then kill the parent so make the calling + * program a daemon process. + */ +void +makedaemon(void) +{ + if (fork() != 0) + exit(0); + + setsid(); + set_signal_handler(SIGHUP, SIG_IGN); + + if (fork() != 0) + exit(0); + + chdir("/"); + umask(077); + + close(0); + close(1); + close(2); +} + +/* + * Pass a signal number and a signal handling function into this function + * to handle signals sent to the process. + */ +signal_func * +set_signal_handler(int signo, signal_func *func) +{ + struct sigaction act, oact; + + act.sa_handler = func; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + if (signo == SIGALRM) { +#ifdef SA_INTERRUPT + act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */ +#endif + } else { +#ifdef SA_RESTART + act.sa_flags |= SA_RESTART; /* SVR4, 4.4BSD */ +#endif + } + + if (sigaction(signo, &act, &oact) < 0) + return SIG_ERR; + + return oact.sa_handler; +} -- cgit v1.2.3