mirror of
https://github.com/OpenVPN/openvpn.git
synced 2026-05-28 04:03:29 -04:00
build: move daemon() emulation into compat
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>
This commit is contained in:
parent
3d163bc544
commit
7b49c16761
7 changed files with 111 additions and 38 deletions
|
|
@ -21,4 +21,5 @@ libcompat_la_SOURCES = \
|
|||
compat.h \
|
||||
compat-dirname.c \
|
||||
compat-basename.c \
|
||||
compat-gettimeofday.c
|
||||
compat-gettimeofday.c \
|
||||
compat-daemon.c
|
||||
|
|
|
|||
100
src/compat/compat-daemon.c
Normal file
100
src/compat/compat-daemon.c
Normal file
|
|
@ -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
|
||||
|
||||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -162,6 +162,10 @@
|
|||
RelativePath=".\compat-gettimeofday.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\compat-daemon.c"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue