#include <unistd.h>
#include <syslog.h>
#include <fcntl.h>
#include <signal.h>#define MAXFD 64extern int daemon_proc; /* defined in error.c */int daemon_init(const char *pname, int facility)
{
int i;
pid_t pid; if ( (pid = fork()) < )
return (-);
else if (pid)
_exit(); /* parent terminates */ /* child 1 continues... */ if (setsid() < ) /* become session leader */
return (-); signal(SIGHUP, SIG_IGN);
if ( (pid = fork()) < )
return (-);
else if (pid)
_exit(); /* child 1 terminates */ /* child 2 continues... */ daemon_proc = ; /* for err_XXX() functions */ chdir("/"); /* change working directory */ /* close off file descriptors */
for (i = ; i < MAXFD; i++)
close(i); /* redirect stdin, stdout, and stderr to /dev/null */
open("/dev/null", O_RDONLY);
open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR); openlog(pname, LOG_PID, facility); return (); /* success */
}