]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
build: move daemon() emulation into compat
authorAlon Bar-Lev <alon.barlev@gmail.com>
Wed, 29 Feb 2012 20:12:16 +0000 (22:12 +0200)
committerDavid Sommerseth <davids@redhat.com>
Thu, 22 Mar 2012 21:53:39 +0000 (22:53 +0100)
Signed-off-by: Alon Bar-Lev <alon.barlev@gmail.com>
Acked-by: Samuli Seppänen <samuli@openvpn.net>
Acked-by: David Sommerseth <davids@redhat.com>
Signed-off-by: David Sommerseth <davids@redhat.com>
src/compat/Makefile.am
src/compat/compat-daemon.c [new file with mode: 0644]
src/compat/compat.h
src/compat/compat.vcproj
src/openvpn/init.c
src/openvpn/misc.c
src/openvpn/misc.h

index 5e9db5f2165b21db1ce2fa4901e97b4e1ce746d9..c8a92ceb6defc5768d9937bdfaed2caa28c9d9d0 100644 (file)
@@ -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 (file)
index 0000000..dde96a2
--- /dev/null
@@ -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 <davids@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
+
index 3f9ac31a02c1037dcf0ad2094c59e41aed40ca84..e9d51b8ea0619d2ebb3294dd1f6d06d63ae8eca6 100644 (file)
@@ -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 */
index 235163caf2b699a2c8841fd13d38b6d8642fcca6..efdecb41a39c1a465d4f7633b78111ad6e4757a9 100644 (file)
                                RelativePath=".\compat-gettimeofday.c"
                                >
                        </File>
+                       <File
+                               RelativePath=".\compat-daemon.c"
+                               >
+                       </File>
                </Filter>
                <Filter
                        Name="Header Files"
index e7edb05acb722d0fbb6b5fca7f720bb146a946c6..bba3cf89a01c1c44c38b8dffee8a5eab28bf193c 100644 (file)
@@ -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);
index 898a183806b9ba2409146cd347c94076ae8f21eb..07beaf00366037d285de72ad1e7ee564a2507b22 100644 (file)
@@ -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
  */
index 9fa8106e1ba5249382df523a78717a68f56d612d..9bb2fa2937c810911ca6717a5dd301a713f7e4f9 100644 (file)
@@ -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);