c0299e1868
I re-indented the source code using indent with the following options: indent -kr -bad -bap -nut -i8 -l80 -psl -sob -ss -ncs There are now _no_ tabs in the source files, and all indentation is eight spaces. Lines are 80 characters long, and the procedure type is on it's own line. Read the indent manual for more information about what each option means.
81 lines
2.0 KiB
C
81 lines
2.0 KiB
C
/* $Id: daemon.c,v 1.5 2005-08-15 03:54:31 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@users.sourceforge.net)
|
|
*
|
|
* 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);
|
|
|
|
#if NDEBUG
|
|
/*
|
|
* When not in debugging mode, close the standard file
|
|
* descriptors.
|
|
*/
|
|
close(0);
|
|
close(1);
|
|
close(2);
|
|
#endif
|
|
}
|
|
|
|
/*
|
|
* 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;
|
|
}
|