Mercurial > hg > nginx
diff src/os/unix/ngx_daemon.c @ 86:3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 12 May 2003 15:52:24 +0000 |
parents | |
children | 19cc647ecd91 |
line wrap: on
line diff
new file mode 100644 --- /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; +}