Re: [Openvpn-devel] [PATCH 46/52] build: move daemon() emulation into compat

2012-03-08 Thread Alon Bar-Lev
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 :
> 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 
>> ---
>>  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 000..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 
>> + *
>> + *  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 
>> +#endif
>> +
>> +#ifdef HAVE_STDLIB_H
>> +#include 
>> +#endif
>> +
>> +#ifdef HAVE_SYS_TYPES_H
>> +#include 
>> +#endif
>> +
>> +#ifdef HAVE_SYS_STAT_H
>> +#include 
>> +#endif
>> +
>> +#ifdef HAVE_FCNTL_H
>> +#include 
>> +#endif
>> +
>> +#ifdef HAVE_ERRNO_H
>> +#include 
>> +#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 @@
>>                    

Re: [Openvpn-devel] [PATCH 46/52] build: move daemon() emulation into compat

2012-03-08 Thread Samuli Seppänen
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 
> ---
>  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 000..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 
> + *
> + *  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 
> +#endif
> +
> +#ifdef HAVE_STDLIB_H
> +#include 
> +#endif
> +
> +#ifdef HAVE_SYS_TYPES_H
> +#include 
> +#endif
> +
> +#ifdef HAVE_SYS_STAT_H
> +#include 
> +#endif
> +
> +#ifdef HAVE_FCNTL_H
> +#include 
> +#endif
> +
> +#ifdef HAVE_ERRNO_H
> +#include 
> +#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"
>   >
>   
> +  + RelativePath=".\compat-daemon.c"
> + >
> + 
>   
>  Name="Header Files"
> diff --git a/src/openvpn/init.c b/src/openvpn/init.c
> index e7edb05..bba3cf8 100644
> --- 

[Openvpn-devel] [PATCH 46/52] build: move daemon() emulation into compat

2012-02-29 Thread Alon Bar-Lev

Signed-off-by: Alon Bar-Lev 
---
 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 000..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 
+ *
+ *  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 
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include 
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include 
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include 
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include 
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include 
+#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"
>

+   
+   

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