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