use daemon() when the C library provides it

For systems that cannot support fork() (like no-mmu Linux), use daemon() if
it is available for the daemonizing code.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
Mike Frysinger 2009-08-12 21:03:02 -04:00 committed by Max Kellermann
parent c3e02bec3b
commit 499ed62dd7
2 changed files with 19 additions and 7 deletions

View File

@ -100,7 +100,7 @@ dnl
dnl libc features
dnl
AC_CHECK_FUNCS(syslog)
AC_CHECK_FUNCS(daemon fork syslog)
if test $ac_cv_func_syslog = no; then
# syslog is not in the default libraries. See if it's in some other.
for lib in bsd socket inet; do

View File

@ -17,6 +17,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include "daemon.h"
#include <glib.h>
@ -128,21 +129,28 @@ daemonize_set_user(void)
static void
daemonize_detach(void)
{
pid_t pid;
/* flush all file handles before duplicating the buffers */
fflush(NULL);
#ifdef HAVE_DAEMON
if (daemon(0, 1))
g_error("daemon() failed: %s", g_strerror(errno));
#elif defined(HAVE_FORK)
/* detach from parent process */
pid = fork();
if (pid < 0)
switch (fork()) {
case -1:
g_error("fork() failed: %s", g_strerror(errno));
if (pid > 0)
case 0:
break;
default:
/* exit the parent process */
_exit(EXIT_SUCCESS);
}
/* release the current working directory */
@ -153,6 +161,10 @@ daemonize_detach(void)
setsid();
#else
g_error("no support for daemonizing");
#endif
g_debug("daemonized!");
}