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 <[email protected]>:
> 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 <[email protected]>
>> ---
>> 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 <[email protected]>
>> + *
>> + * 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);
>>
>
>