OpenVPN
compat-daemon.c
Go to the documentation of this file.
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 along
20  * with this program; if not, write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22  */
23 
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #elif defined(_MSC_VER)
27 #include "config-msvc.h"
28 #endif
29 
30 #ifndef HAVE_DAEMON
31 
32 #ifdef HAVE_UNISTD_H
33 #include <unistd.h>
34 #endif
35 
36 #include <stdlib.h>
37 
38 #ifdef HAVE_SYS_TYPES_H
39 #include <sys/types.h>
40 #endif
41 
42 #ifdef HAVE_SYS_STAT_H
43 #include <sys/stat.h>
44 #endif
45 
46 #ifdef HAVE_FCNTL_H
47 #include <fcntl.h>
48 #endif
49 
50 #include <errno.h>
51 
52 int
53 daemon(int nochdir, int noclose)
54 {
55 #if defined(HAVE_FORK) && defined(HAVE_SETSID)
56  switch (fork())
57  {
58  case -1:
59  return (-1);
60 
61  case 0:
62  break;
63 
64  default:
65  exit(0);
66  }
67 
68  if (setsid() == -1)
69  {
70  return (-1);
71  }
72 
73  if (!nochdir)
74  {
75  chdir("/");
76  }
77 
78  if (!noclose)
79  {
80 #if defined(HAVE_DUP) && defined(HAVE_DUP2)
81  int fd;
82  if ((fd = open("/dev/null", O_RDWR, 0)) != -1)
83  {
84  dup2(fd, 0);
85  dup2(fd, 1);
86  dup2(fd, 2);
87  if (fd > 2)
88  {
89  close(fd);
90  }
91  }
92 #endif
93  }
94 
95  return 0;
96 #else /* if defined(HAVE_FORK) && defined(HAVE_SETSID) */
97  (void)nochdir;
98  (void)noclose;
99  errno = EFAULT;
100  return -1;
101 #endif /* if defined(HAVE_FORK) && defined(HAVE_SETSID) */
102 }
103 
104 #endif /* ifndef HAVE_DAEMON */
105 
int daemon(int nochdir, int noclose)
Definition: compat-daemon.c:53