1/*
2 *  OpenVPN -- An application to securely tunnel IP networks
3 *             over a single UDP port, with support for SSL/TLS-based
4 *             session authentication and key exchange,
5 *             packet encryption, packet authentication, and
6 *             packet compression.
7 *
8 *  Copyright (C) 2011 - David Sommerseth <davids@redhat.com>
9 *
10 *  This program is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 2
12 *  as published by the Free Software Foundation.
13 *
14 *  This program is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this program (see the file COPYING included with this
21 *  distribution); if not, write to the Free Software Foundation, Inc.,
22 *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 */
24
25#ifdef HAVE_CONFIG_H
26#include "config.h"
27#elif defined(_MSC_VER)
28#include "config-msvc.h"
29#endif
30
31#ifndef HAVE_DAEMON
32
33#ifdef HAVE_UNISTD_H
34#include <unistd.h>
35#endif
36
37#ifdef HAVE_STDLIB_H
38#include <stdlib.h>
39#endif
40
41#ifdef HAVE_SYS_TYPES_H
42#include <sys/types.h>
43#endif
44
45#ifdef HAVE_SYS_STAT_H
46#include <sys/stat.h>
47#endif
48
49#ifdef HAVE_FCNTL_H
50#include <fcntl.h>
51#endif
52
53#ifdef HAVE_ERRNO_H
54#include <errno.h>
55#endif
56
57int
58daemon(int nochdir, int noclose)
59{
60#if defined(HAVE_FORK) && defined(HAVE_SETSID)
61	switch (fork()) {
62		case -1:
63			return (-1);
64		case 0:
65		break;
66		default:
67			exit(0);
68	}
69
70	if (setsid() == -1)
71		return (-1);
72
73	if (!nochdir)
74		chdir("/");
75
76	if (!noclose) {
77#if defined(HAVE_DUP) && defined(HAVE_DUP2)
78		int fd;
79		if ((fd = open ("/dev/null", O_RDWR, 0)) != -1) {
80			dup2 (fd, 0);
81			dup2 (fd, 1);
82			dup2 (fd, 2);
83			if (fd > 2) {
84				close (fd);
85			}
86		}
87#endif
88	}
89
90	return 0;
91#else
92	(void)nochdir;
93	(void)noclose;
94	errno = EFAULT;
95	return -1;
96#endif
97}
98
99#endif
100
101