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:
Alon Bar-Lev 2012-02-29 22:12:16 +02:00 committed by David Sommerseth
parent 3d163bc544
commit 7b49c16761
7 changed files with 111 additions and 38 deletions

View 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

100
src/compat/compat-daemon.c Normal file
View 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

View 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 */

View file

@ -162,6 +162,10 @@
RelativePath=".\compat-gettimeofday.c"
>
</File>
<File
RelativePath=".\compat-daemon.c"
>
</File>
</Filter>
<Filter
Name="Header Files"

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

View 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
*/

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