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);
>>
>
>

Reply via email to