blob: 7ba14db005e8cefa9cc5e0dcec3c7390c3920848 [file] [log] [blame]
/**
* @file daemon.c Daemonize process
*
* Copyright (C) 2010 Creytiv.com
*/
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
#include <re_types.h>
#include <re_mbuf.h>
#include <re_sys.h>
/**
* Daemonize process
*
* @return 0 if success, otherwise errorcode
*/
int sys_daemon(void)
{
#ifdef HAVE_FORK
pid_t pid;
pid = fork();
if (-1 == pid)
return errno;
else if (pid > 0)
exit(0);
if (-1 == setsid())
return errno;
(void)signal(SIGHUP, SIG_IGN);
pid = fork();
if (-1 == pid)
return errno;
else if (pid > 0)
exit(0);
if (-1 == chdir("/"))
return errno;
(void)umask(0);
/* Redirect standard files to /dev/null */
if (freopen("/dev/null", "r", stdin) == NULL)
return errno;
if (freopen("/dev/null", "w", stdout) == NULL)
return errno;
if (freopen("/dev/null", "w", stderr) == NULL)
return errno;
return 0;
#else
return ENOSYS;
#endif
}