Re: [Openvpn-devel] [PATCH 46/52] build: move daemon() emulation into compat
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
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
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) -