Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 1 | |
| 2 | #include <ngx_config.h> |
| 3 | #include <ngx_core.h> |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 4 | |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 5 | |
| 6 | int ngx_daemon(ngx_log_t *log) |
| 7 | { |
| 8 | int fd; |
| 9 | |
| 10 | switch (fork()) { |
| 11 | case -1: |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 12 | ngx_log_error(NGX_LOG_EMERG, log, errno, "fork() failed"); |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 13 | return NGX_ERROR; |
| 14 | |
| 15 | case 0: |
| 16 | break; |
| 17 | |
| 18 | default: |
| 19 | exit(0); |
| 20 | } |
| 21 | |
| 22 | if (setsid() == -1) { |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 23 | ngx_log_error(NGX_LOG_EMERG, log, errno, "setsid() failed"); |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 24 | return NGX_ERROR; |
| 25 | } |
| 26 | |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 27 | umask(0); |
| 28 | |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 29 | fd = open("/dev/null", O_RDWR); |
| 30 | if (fd == -1) { |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 31 | ngx_log_error(NGX_LOG_EMERG, log, errno, "open(\"/dev/null\") failed"); |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 32 | return NGX_ERROR; |
| 33 | } |
| 34 | |
| 35 | if (dup2(fd, STDIN_FILENO) == -1) { |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 36 | ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDIN) failed"); |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 37 | return NGX_ERROR; |
| 38 | } |
| 39 | |
| 40 | if (dup2(fd, STDOUT_FILENO) == -1) { |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 41 | ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDOUT) failed"); |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 42 | return NGX_ERROR; |
| 43 | } |
| 44 | |
Igor Sysoev | be2cfc3 | 2003-06-15 18:32:13 +0000 | [diff] [blame] | 45 | #if 0 |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 46 | if (dup2(fd, STDERR_FILENO) == -1) { |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 47 | ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDERR) failed"); |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 48 | return NGX_ERROR; |
| 49 | } |
Igor Sysoev | be2cfc3 | 2003-06-15 18:32:13 +0000 | [diff] [blame] | 50 | #endif |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 51 | |
| 52 | if (fd > STDERR_FILENO) { |
| 53 | if (close(fd) == -1) { |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 54 | ngx_log_error(NGX_LOG_EMERG, log, errno, "close() failed"); |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 55 | return NGX_ERROR; |
| 56 | } |
| 57 | } |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 58 | |
| 59 | return NGX_OK; |
| 60 | } |