Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/gen/daemon.c
39476 views
1
/*-
2
* SPDX-License-Identifier: BSD-3-Clause
3
*
4
* Copyright (c) 1990, 1993 The Regents of the University of California.
5
* Copyright (c) 2017 Mariusz Zaborski <[email protected]>
6
* All rights reserved.
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
10
* are met:
11
* 1. Redistributions of source code must retain the above copyright
12
* notice, this list of conditions and the following disclaimer.
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
16
* 3. Neither the name of the University nor the names of its contributors
17
* may be used to endorse or promote products derived from this software
18
* without specific prior written permission.
19
*
20
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30
* SUCH DAMAGE.
31
*/
32
33
#include "namespace.h"
34
#include <errno.h>
35
#include <fcntl.h>
36
#include <paths.h>
37
#include <stdlib.h>
38
#include <signal.h>
39
#include <unistd.h>
40
#include "un-namespace.h"
41
#include "libc_private.h"
42
43
int
44
daemonfd(int chdirfd, int nullfd)
45
{
46
struct sigaction osa, sa;
47
pid_t newgrp;
48
int oerrno;
49
int osa_ok;
50
51
/* A SIGHUP may be thrown when the parent exits below. */
52
sigemptyset(&sa.sa_mask);
53
sa.sa_handler = SIG_IGN;
54
sa.sa_flags = 0;
55
osa_ok = __libc_sigaction(SIGHUP, &sa, &osa);
56
57
switch (fork()) {
58
case -1:
59
return (-1);
60
case 0:
61
break;
62
default:
63
/*
64
* A fine point: _exit(0), not exit(0), to avoid triggering
65
* atexit(3) processing
66
*/
67
_exit(0);
68
}
69
70
newgrp = setsid();
71
oerrno = errno;
72
if (osa_ok != -1)
73
__libc_sigaction(SIGHUP, &osa, NULL);
74
75
if (newgrp == -1) {
76
errno = oerrno;
77
return (-1);
78
}
79
80
if (chdirfd != -1)
81
(void)fchdir(chdirfd);
82
83
if (nullfd != -1) {
84
(void)_dup2(nullfd, STDIN_FILENO);
85
(void)_dup2(nullfd, STDOUT_FILENO);
86
(void)_dup2(nullfd, STDERR_FILENO);
87
}
88
return (0);
89
}
90
91
int
92
daemon(int nochdir, int noclose)
93
{
94
int chdirfd, nullfd, ret;
95
96
if (!noclose)
97
nullfd = _open(_PATH_DEVNULL, O_RDWR, 0);
98
else
99
nullfd = -1;
100
101
if (!nochdir)
102
chdirfd = _open("/", O_EXEC);
103
else
104
chdirfd = -1;
105
106
ret = daemonfd(chdirfd, nullfd);
107
108
if (chdirfd != -1)
109
_close(chdirfd);
110
111
if (nullfd > 2)
112
_close(nullfd);
113
114
return (ret);
115
}
116
117