1
2 /*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
5 */
6
7
8 #include <ngx_config.h>
9 #include <ngx_core.h>
10
11
12 ngx_int_t
ngx_daemon(ngx_log_t * log)13 ngx_daemon(ngx_log_t *log)
14 {
15 int fd;
16
17 switch (fork()) {
18 case -1:
19 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");
20 return NGX_ERROR;
21
22 case 0:
23 break;
24
25 default:
26 exit(0);
27 }
28
29 ngx_parent = ngx_pid;
30 ngx_pid = ngx_getpid();
31
32 if (setsid() == -1) {
33 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed");
34 return NGX_ERROR;
35 }
36
37 umask(0);
38
39 fd = open("/dev/null", O_RDWR);
40 if (fd == -1) {
41 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
42 "open(\"/dev/null\") failed");
43 return NGX_ERROR;
44 }
45
46 if (dup2(fd, STDIN_FILENO) == -1) {
47 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");
48 return NGX_ERROR;
49 }
50
51 if (dup2(fd, STDOUT_FILENO) == -1) {
52 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");
53 return NGX_ERROR;
54 }
55
56 #if 0
57 if (dup2(fd, STDERR_FILENO) == -1) {
58 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed");
59 return NGX_ERROR;
60 }
61 #endif
62
63 if (fd > STDERR_FILENO) {
64 if (close(fd) == -1) {
65 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");
66 return NGX_ERROR;
67 }
68 }
69
70 return NGX_OK;
71 }
72