diff --git a/config.h.in b/config.h.in index f3b24a448..7e5a64595 100644 --- a/config.h.in +++ b/config.h.in @@ -24,6 +24,9 @@ /* Define to 1 if you have the `chroot' function. */ #undef HAVE_CHROOT +/* Define to 1 if you have the `daemon' function. */ +#undef HAVE_DAEMON + /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H diff --git a/configure b/configure index c6cdeaf2e..bd0afe6d4 100755 --- a/configure +++ b/configure @@ -24666,7 +24666,8 @@ fi -for ac_func in tzset sigprocmask fcntl getpwnam getrlimit setsid sbrk chroot kill sleep usleep random srandom recvmsg sendmsg writev setresuid setreuid setresgid setregid + +for ac_func in tzset sigprocmask fcntl getpwnam getrlimit setsid sbrk chroot kill sleep usleep random srandom recvmsg sendmsg writev setresuid setreuid setresgid setregid daemon do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 diff --git a/configure.ac b/configure.ac index 676c96cf6..6e008ebe7 100644 --- a/configure.ac +++ b/configure.ac @@ -781,7 +781,7 @@ AC_CHECK_GETADDRINFO_WITH_INCLUDES if test $ac_cv_func_getaddrinfo = no; then AC_LIBOBJ([fake-rfc2553]) fi -AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam getrlimit setsid sbrk chroot kill sleep usleep random srandom recvmsg sendmsg writev setresuid setreuid setresgid setregid]) +AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam getrlimit setsid sbrk chroot kill sleep usleep random srandom recvmsg sendmsg writev setresuid setreuid setresgid setregid daemon]) # check mkdir AC_MSG_CHECKING([whether mkdir has one arg]) diff --git a/daemon/unbound.c b/daemon/unbound.c index d8eef1d8a..b286a7212 100644 --- a/daemon/unbound.c +++ b/daemon/unbound.c @@ -287,15 +287,24 @@ checkoldpid(struct config_file* cfg) static void detach(struct config_file* cfg) { +#ifdef HAVE_DAEMON + int err; + if(daemon(1,0)!=0) { + err=errno; + unlink(cfg->pidfile); + fatal_exit("daemon(3) failed: %s", strerror(err)); + } +#else /* !HAVE_DAEMON */ #ifdef HAVE_WORKING_FORK - int fd; + int fd, err; /* Take off... */ switch (fork()) { case 0: break; case -1: + err=errno; unlink(cfg->pidfile); - fatal_exit("fork failed: %s", strerror(errno)); + fatal_exit("fork failed: %s", strerror(err)); default: /* exit interactive session */ exit(0); @@ -315,6 +324,7 @@ detach(struct config_file* cfg) #else (void)cfg; #endif /* HAVE_WORKING_FORK */ +#endif /* HAVE_DAEMON */ } /** daemonize, drop user priviliges and chroot if needed */ diff --git a/doc/Changelog b/doc/Changelog index e6aeb864e..ef062a297 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -5,6 +5,7 @@ - added scrub filter for overreaching NSEC records and unit test. - iana portlist update - use of setresuid or setreuid when available. + - use daemon(3) if available. 25 August 2008: Wouter - realclean patch from Robert Edmonds.