]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/lib/daemon.c
35b42f2da1a0b3a61823d7da6f114f23d1e4a1eb
[bacula/bacula] / bacula / src / lib / daemon.c
1 /*
2  *  daemon.c by Kern Sibbald
3  *
4  *   Version $Id$
5  *
6  *   this code is inspired by the Prentice Hall book
7  *   "Unix Network Programming" by W. Richard Stevens
8  *   and later updated from his book "Advanced Programming
9  *   in the UNIX Environment"
10  *
11  * Initialize a daemon process completely detaching us from
12  * any terminal processes. 
13  *
14  */ 
15
16 /*
17    Copyright (C) 2000-2004 Kern Sibbald and John Walker
18
19    This program is free software; you can redistribute it and/or
20    modify it under the terms of the GNU General Public License as
21    published by the Free Software Foundation; either version 2 of
22    the License, or (at your option) any later version.
23
24    This program is distributed in the hope that it will be useful,
25    but WITHOUT ANY WARRANTY; without even the implied warranty of
26    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27    General Public License for more details.
28
29    You should have received a copy of the GNU General Public
30    License along with this program; if not, write to the Free
31    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
32    MA 02111-1307, USA.
33
34  */
35
36
37 #include "bacula.h"
38 extern int debug_level;
39
40 void 
41 daemon_start()
42 {
43 #if !defined(HAVE_CYGWIN) && !defined(HAVE_WIN32)
44    int i;
45    pid_t cpid;
46    mode_t oldmask;
47    int low_fd = 0;
48    /*
49     *  Become a daemon.
50     */
51
52    Dmsg0(200, "Enter daemon_start\n");
53    if ( (cpid = fork() ) < 0)
54       Emsg1(M_ABORT, 0, "Cannot fork to become daemon: %s\n", strerror(errno));
55    else if (cpid > 0)
56       exit(0);              /* parent exits */
57    /* Child continues */
58       
59    setsid();
60
61    /* In the PRODUCTION system, we close ALL
62     * file descriptors except stdin, stdout, and stderr.
63     */
64    if (debug_level > 0) {
65       low_fd = 2;                     /* don't close debug output */
66    }
67    for (i=sysconf(_SC_OPEN_MAX)-1; i > low_fd; i--) {
68       close(i);
69    }
70
71    /* Move to root directory. For debug we stay
72     * in current directory so dumps go there.
73     */
74 #ifndef DEBUG
75    chdir("/");
76 #endif
77
78    /* 
79     * Avoid creating files 666 but don't override any
80     * more restrictive mask set by the user.
81     */
82    oldmask = umask(026);
83    oldmask |= 026;
84    umask(oldmask);
85
86
87    /*
88     * Make sure we have fd's 0, 1, 2 open
89     *  If we don't do this one of our sockets may open
90     *  there and if we then use stdout, it could
91     *  send total garbage to our socket.
92     *
93     */
94    int fd;
95    fd = open("/dev/null", O_RDONLY, 0644);
96    if (fd > 2) {
97       close(fd);
98    } else {
99       for(i=1; fd + i <= 2; i++) {
100          dup2(fd, fd+i);
101       }
102    }
103
104 #endif /* HAVE_CYGWIN */
105    Dmsg0(200, "Exit daemon_start\n");
106 }