diff options
Diffstat (limited to 'src/os/unix/ngx_daemon.c')
-rw-r--r-- | src/os/unix/ngx_daemon.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/os/unix/ngx_daemon.c b/src/os/unix/ngx_daemon.c new file mode 100644 index 000000000..6faf85b06 --- /dev/null +++ b/src/os/unix/ngx_daemon.c @@ -0,0 +1,80 @@ + +#include <ngx_config.h> +#include <ngx_core.h> +#include <ngx_log.h> + +/* daemon in Linux */ + +int ngx_daemon(ngx_log_t *log) +{ + int fd; + + switch (fork()) { + case -1: + ngx_log_error(NGX_LOG_ALERT, log, errno, "fork() failed"); + return NGX_ERROR; + + case 0: + break; + + default: + exit(0); + } + + if (setsid() == -1) { + ngx_log_error(NGX_LOG_ALERT, log, errno, "setsid() failed"); + return NGX_ERROR; + } + +#if (__SVR4 || linux) + + /* need HUP IGN ? check in Solaris and Linux */ + + switch (fork()) { + case -1: + ngx_log_error(NGX_LOG_ALERT, log, errno, "fork() failed"); + return NGX_ERROR; + + case 0: + break; + + default: + exit(0); + } + +#endif + + umask(0); + +#if 0 + fd = open("/dev/null", O_RDWR); + if (fd == -1) { + ngx_log_error(NGX_LOG_ALERT, log, errno, "open(\"/dev/null\") failed"); + return NGX_ERROR; + } + + if (dup2(fd, STDIN_FILENO) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, errno, "dup2(STDIN) failed"); + return NGX_ERROR; + } + + if (dup2(fd, STDOUT_FILENO) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, errno, "dup2(STDOUT) failed"); + return NGX_ERROR; + } + + if (dup2(fd, STDERR_FILENO) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, errno, "dup2(STDERR) failed"); + return NGX_ERROR; + } + + if (fd > STDERR_FILENO) { + if (close(fd) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, errno, "close() failed"); + return NGX_ERROR; + } + } +#endif + + return NGX_OK; +} |