daemon is gnu specific: --- CONFORMING TO Not in POSIX.1-2001. A similar function appears on the BSDs. The daemon() function first appeared in 4.4BSD. ---
Solaris, uclibc and other does not have it. 2012/3/8 Samuli Seppänen <sam...@openvpn.net>: > Which platforms need daemon() emulation? Only Windows? > > I think it makes sense to isolate OS compatibility functions to files > under src/compat. Better than having them in misc.c. Also, I can't see > any obvious issues with the patch, code-vise. > > ACK. > > -- > Samuli Seppänen > Community Manager > OpenVPN Technologies, Inc > > irc freenode net: mattock > > >> Signed-off-by: Alon Bar-Lev <alon.bar...@gmail.com> >> --- >> src/compat/Makefile.am | 3 +- >> src/compat/compat-daemon.c | 100 >> ++++++++++++++++++++++++++++++++++++++++++++ >> src/compat/compat.h | 4 ++ >> src/compat/compat.vcproj | 4 ++ >> src/openvpn/init.c | 2 +- >> src/openvpn/misc.c | 32 -------------- >> src/openvpn/misc.h | 4 -- >> 7 files changed, 111 insertions(+), 38 deletions(-) >> create mode 100644 src/compat/compat-daemon.c >> >> diff --git a/src/compat/Makefile.am b/src/compat/Makefile.am >> index 5e9db5f..c8a92ce 100644 >> --- a/src/compat/Makefile.am >> +++ b/src/compat/Makefile.am >> @@ -21,4 +21,5 @@ libcompat_la_SOURCES = \ >> compat.h \ >> compat-dirname.c \ >> compat-basename.c \ >> - compat-gettimeofday.c >> + compat-gettimeofday.c \ >> + compat-daemon.c >> diff --git a/src/compat/compat-daemon.c b/src/compat/compat-daemon.c >> new file mode 100644 >> index 0000000..dde96a2 >> --- /dev/null >> +++ b/src/compat/compat-daemon.c >> @@ -0,0 +1,100 @@ >> +/* >> + * OpenVPN -- An application to securely tunnel IP networks >> + * over a single UDP port, with support for SSL/TLS-based >> + * session authentication and key exchange, >> + * packet encryption, packet authentication, and >> + * packet compression. >> + * >> + * Copyright (C) 2011 - David Sommerseth <dav...@redhat.com> >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License version 2 >> + * as published by the Free Software Foundation. >> + * >> + * 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. >> + * >> + * You should have received a copy of the GNU General Public License >> + * along with this program (see the file COPYING included with this >> + * distribution); if not, write to the Free Software Foundation, Inc., >> + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA >> + */ >> + >> +#ifdef HAVE_CONFIG_H >> +#include "config.h" >> +#elif defined(_MSC_VER) >> +#include "config-msvc.h" >> +#endif >> + >> +#ifndef HAVE_DAEMON >> + >> +#ifdef HAVE_UNISTD_H >> +#include <unistd.h> >> +#endif >> + >> +#ifdef HAVE_STDLIB_H >> +#include <stdlib.h> >> +#endif >> + >> +#ifdef HAVE_SYS_TYPES_H >> +#include <sys/types.h> >> +#endif >> + >> +#ifdef HAVE_SYS_STAT_H >> +#include <sys/stat.h> >> +#endif >> + >> +#ifdef HAVE_FCNTL_H >> +#include <fcntl.h> >> +#endif >> + >> +#ifdef HAVE_ERRNO_H >> +#include <errno.h> >> +#endif >> + >> +int >> +daemon(int nochdir, int noclose) >> +{ >> +#if defined(HAVE_FORK) && defined(HAVE_SETSID) >> + switch (fork()) { >> + case -1: >> + return (-1); >> + case 0: >> + break; >> + default: >> + exit(0); >> + } >> + >> + if (setsid() == -1) >> + return (-1); >> + >> + if (!nochdir) >> + chdir("/"); >> + >> + if (!noclose) { >> +#if defined(HAVE_DUP) && defined(HAVE_DUP2) >> + int fd; >> + if ((fd = open ("/dev/null", O_RDWR, 0)) != -1) { >> + dup2 (fd, 0); >> + dup2 (fd, 1); >> + dup2 (fd, 2); >> + if (fd > 2) { >> + close (fd); >> + } >> + } >> +#endif >> + } >> + >> + return 0; >> +#else >> + (void)nochdir; >> + (void)noclose; >> + errno = EFAULT; >> + return -1; >> +#endif >> +} >> + >> +#endif >> + >> diff --git a/src/compat/compat.h b/src/compat/compat.h >> index 3f9ac31..e9d51b8 100644 >> --- a/src/compat/compat.h >> +++ b/src/compat/compat.h >> @@ -46,4 +46,8 @@ char * basename(char *str); >> int gettimeofday (struct timeval *tv, void *tz); >> #endif >> >> +#ifndef HAVE_DAEMON >> +int daemon(int nochdir, int noclose); >> +#endif >> + >> #endif /* COMPAT_H */ >> diff --git a/src/compat/compat.vcproj b/src/compat/compat.vcproj >> index 235163c..efdecb4 100644 >> --- a/src/compat/compat.vcproj >> +++ b/src/compat/compat.vcproj >> @@ -162,6 +162,10 @@ >> RelativePath=".\compat-gettimeofday.c" >> > >> </File> >> + <File >> + RelativePath=".\compat-daemon.c" >> + > >> + </File> >> </Filter> >> <Filter >> Name="Header Files" >> diff --git a/src/openvpn/init.c b/src/openvpn/init.c >> index e7edb05..bba3cf8 100644 >> --- a/src/openvpn/init.c >> +++ b/src/openvpn/init.c >> @@ -993,7 +993,7 @@ possibly_become_daemon (const struct options *options, >> const bool first_time) >> { >> ASSERT (!options->inetd); >> if (daemon (options->cd_dir != NULL, options->log) < 0) >> - msg (M_ERR, "daemon() failed"); >> + msg (M_ERR, "daemon() failed or unsupported"); >> restore_signal_state (); >> if (options->log) >> set_std_files_to_null (true); >> diff --git a/src/openvpn/misc.c b/src/openvpn/misc.c >> index 898a183..07beaf0 100644 >> --- a/src/openvpn/misc.c >> +++ b/src/openvpn/misc.c >> @@ -301,38 +301,6 @@ do_mlockall(bool print_msg) >> #endif >> } >> >> -#ifndef HAVE_DAEMON >> - >> -int >> -daemon(int nochdir, int noclose) >> -{ >> -#if defined(HAVE_FORK) && defined(HAVE_SETSID) >> - switch (fork()) >> - { >> - case -1: >> - return (-1); >> - case 0: >> - break; >> - default: >> - openvpn_exit (OPENVPN_EXIT_STATUS_GOOD); /* exit point */ >> - } >> - >> - if (setsid() == -1) >> - return (-1); >> - >> - if (!nochdir) >> - openvpn_chdir ("/"); >> - >> - if (!noclose) >> - set_std_files_to_null (false); >> -#else >> - msg (M_FATAL, "Sorry but I can't become a daemon because this operating >> system doesn't appear to support either the daemon() or fork() system >> calls"); >> -#endif >> - return (0); >> -} >> - >> -#endif >> - >> /* >> * Set standard file descriptors to /dev/null >> */ >> diff --git a/src/openvpn/misc.h b/src/openvpn/misc.h >> index 9fa8106..9bb2fa2 100644 >> --- a/src/openvpn/misc.h >> +++ b/src/openvpn/misc.h >> @@ -115,10 +115,6 @@ unsigned int openvpn_getpid (void); >> >> void do_mlockall (bool print_msg); /* Disable paging */ >> >> -#ifndef HAVE_DAEMON >> -int daemon (int nochdir, int noclose); >> -#endif >> - >> /* check file protections */ >> void warn_if_group_others_accessible(const char* filename); >> > >