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