blob: 7d05fef9bb1cbca9e4c54206fb8590b1830dfa06 [file] [log] [blame]
Igor Sysoev6b863e32003-05-12 15:52:24 +00001
2#include <ngx_config.h>
3#include <ngx_core.h>
Igor Sysoev6b863e32003-05-12 15:52:24 +00004
Igor Sysoev6b863e32003-05-12 15:52:24 +00005
6int ngx_daemon(ngx_log_t *log)
7{
8 int fd;
9
10 switch (fork()) {
11 case -1:
Igor Sysoev1c13c662003-05-20 15:37:55 +000012 ngx_log_error(NGX_LOG_EMERG, log, errno, "fork() failed");
Igor Sysoev6b863e32003-05-12 15:52:24 +000013 return NGX_ERROR;
14
15 case 0:
16 break;
17
18 default:
19 exit(0);
20 }
21
22 if (setsid() == -1) {
Igor Sysoev1c13c662003-05-20 15:37:55 +000023 ngx_log_error(NGX_LOG_EMERG, log, errno, "setsid() failed");
Igor Sysoev6b863e32003-05-12 15:52:24 +000024 return NGX_ERROR;
25 }
26
Igor Sysoev6b863e32003-05-12 15:52:24 +000027 umask(0);
28
Igor Sysoev6b863e32003-05-12 15:52:24 +000029 fd = open("/dev/null", O_RDWR);
30 if (fd == -1) {
Igor Sysoev1c13c662003-05-20 15:37:55 +000031 ngx_log_error(NGX_LOG_EMERG, log, errno, "open(\"/dev/null\") failed");
Igor Sysoev6b863e32003-05-12 15:52:24 +000032 return NGX_ERROR;
33 }
34
35 if (dup2(fd, STDIN_FILENO) == -1) {
Igor Sysoev1c13c662003-05-20 15:37:55 +000036 ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDIN) failed");
Igor Sysoev6b863e32003-05-12 15:52:24 +000037 return NGX_ERROR;
38 }
39
40 if (dup2(fd, STDOUT_FILENO) == -1) {
Igor Sysoev1c13c662003-05-20 15:37:55 +000041 ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDOUT) failed");
Igor Sysoev6b863e32003-05-12 15:52:24 +000042 return NGX_ERROR;
43 }
44
Igor Sysoevbe2cfc32003-06-15 18:32:13 +000045#if 0
Igor Sysoev6b863e32003-05-12 15:52:24 +000046 if (dup2(fd, STDERR_FILENO) == -1) {
Igor Sysoev1c13c662003-05-20 15:37:55 +000047 ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDERR) failed");
Igor Sysoev6b863e32003-05-12 15:52:24 +000048 return NGX_ERROR;
49 }
Igor Sysoevbe2cfc32003-06-15 18:32:13 +000050#endif
Igor Sysoev6b863e32003-05-12 15:52:24 +000051
52 if (fd > STDERR_FILENO) {
53 if (close(fd) == -1) {
Igor Sysoev1c13c662003-05-20 15:37:55 +000054 ngx_log_error(NGX_LOG_EMERG, log, errno, "close() failed");
Igor Sysoev6b863e32003-05-12 15:52:24 +000055 return NGX_ERROR;
56 }
57 }
Igor Sysoev6b863e32003-05-12 15:52:24 +000058
59 return NGX_OK;
60}