aboutsummaryrefslogtreecommitdiff
path: root/src/os/unix
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2003-11-19 16:26:41 +0000
committerIgor Sysoev <igor@sysoev.ru>2003-11-19 16:26:41 +0000
commit160d774afcf3cdd4f999489211eb9d78bf82439a (patch)
tree59227d2698d9c531808a9f3edb708f36707a37f9 /src/os/unix
parent1b138ed141c0bdb0c9944c1ae70e53682ed2d035 (diff)
downloadnginx-160d774afcf3cdd4f999489211eb9d78bf82439a.tar.gz
nginx-160d774afcf3cdd4f999489211eb9d78bf82439a.zip
nginx-0.0.1-2003-11-19-19:26:41 import
Diffstat (limited to 'src/os/unix')
-rw-r--r--src/os/unix/ngx_daemon.c15
-rw-r--r--src/os/unix/ngx_errno.h1
-rw-r--r--src/os/unix/ngx_files.c14
-rw-r--r--src/os/unix/ngx_freebsd_config.h1
-rw-r--r--src/os/unix/ngx_posix_init.c13
-rw-r--r--src/os/unix/ngx_process.c112
-rw-r--r--src/os/unix/ngx_process.h6
7 files changed, 146 insertions, 16 deletions
diff --git a/src/os/unix/ngx_daemon.c b/src/os/unix/ngx_daemon.c
index 7d05fef9b..b2a37c100 100644
--- a/src/os/unix/ngx_daemon.c
+++ b/src/os/unix/ngx_daemon.c
@@ -9,7 +9,7 @@ int ngx_daemon(ngx_log_t *log)
switch (fork()) {
case -1:
- ngx_log_error(NGX_LOG_EMERG, log, errno, "fork() failed");
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");
return NGX_ERROR;
case 0:
@@ -20,7 +20,7 @@ int ngx_daemon(ngx_log_t *log)
}
if (setsid() == -1) {
- ngx_log_error(NGX_LOG_EMERG, log, errno, "setsid() failed");
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed");
return NGX_ERROR;
}
@@ -28,30 +28,31 @@ int ngx_daemon(ngx_log_t *log)
fd = open("/dev/null", O_RDWR);
if (fd == -1) {
- ngx_log_error(NGX_LOG_EMERG, log, errno, "open(\"/dev/null\") failed");
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+ "open(\"/dev/null\") failed");
return NGX_ERROR;
}
if (dup2(fd, STDIN_FILENO) == -1) {
- ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDIN) failed");
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");
return NGX_ERROR;
}
if (dup2(fd, STDOUT_FILENO) == -1) {
- ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDOUT) failed");
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");
return NGX_ERROR;
}
#if 0
if (dup2(fd, STDERR_FILENO) == -1) {
- ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDERR) failed");
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed");
return NGX_ERROR;
}
#endif
if (fd > STDERR_FILENO) {
if (close(fd) == -1) {
- ngx_log_error(NGX_LOG_EMERG, log, errno, "close() failed");
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");
return NGX_ERROR;
}
}
diff --git a/src/os/unix/ngx_errno.h b/src/os/unix/ngx_errno.h
index d0f255a4e..a7326b613 100644
--- a/src/os/unix/ngx_errno.h
+++ b/src/os/unix/ngx_errno.h
@@ -19,6 +19,7 @@ typedef int ngx_err_t;
#define NGX_ECONNRESET ECONNRESET
#define NGX_ETIMEDOUT ETIMEDOUT
#define NGX_ECANCELED ECANCELED
+#define NGX_ECHILD ECHILD
#define NGX_ENOMOREFILES 0
diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c
index 7b9d4e440..651113d91 100644
--- a/src/os/unix/ngx_files.c
+++ b/src/os/unix/ngx_files.c
@@ -30,9 +30,9 @@ ssize_t ngx_read_file(ngx_file_t *file, char *buf, size_t size, off_t offset)
ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed");
return NGX_ERROR;
}
- }
- file->sys_offset = offset;
+ file->sys_offset = offset;
+ }
n = read(file->fd, buf, size);
@@ -77,9 +77,9 @@ ssize_t ngx_write_file(ngx_file_t *file, char *buf, size_t size, off_t offset)
ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed");
return NGX_ERROR;
}
- }
- file->sys_offset = offset;
+ file->sys_offset = offset;
+ }
n = write(file->fd, buf, size);
@@ -151,14 +151,14 @@ ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl,
return ngx_write_file(file, iov[0].iov_base, iov[0].iov_len, offset);
}
- if (file->offset != offset) {
+ if (file->sys_offset != offset) {
if (lseek(file->fd, offset, SEEK_SET) == -1) {
ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed");
return NGX_ERROR;
}
- }
- file->sys_offset = offset;
+ file->sys_offset = offset;
+ }
n = writev(file->fd, io.elts, io.nelts);
diff --git a/src/os/unix/ngx_freebsd_config.h b/src/os/unix/ngx_freebsd_config.h
index 0493b3b88..a045a1d07 100644
--- a/src/os/unix/ngx_freebsd_config.h
+++ b/src/os/unix/ngx_freebsd_config.h
@@ -16,6 +16,7 @@
#include <sys/ioctl.h>
#include <sys/resource.h>
#include <sys/sysctl.h>
+#include <sys/wait.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <netinet/in.h>
diff --git a/src/os/unix/ngx_posix_init.c b/src/os/unix/ngx_posix_init.c
index c97083333..7462dcfc4 100644
--- a/src/os/unix/ngx_posix_init.c
+++ b/src/os/unix/ngx_posix_init.c
@@ -13,8 +13,8 @@ void ngx_rotate_signal_handler(int signo);
int ngx_posix_init(ngx_log_t *log)
{
- struct sigaction sa;
- struct rlimit rlmt;
+ struct rlimit rlmt;
+ struct sigaction sa;
ngx_memzero(&sa, sizeof(struct sigaction));
sa.sa_handler = SIG_IGN;
@@ -25,6 +25,15 @@ int ngx_posix_init(ngx_log_t *log)
return NGX_ERROR;
}
+ ngx_memzero(&sa, sizeof(struct sigaction));
+ sa.sa_handler = ngx_sigchld_handler;
+ sigemptyset(&sa.sa_mask);
+ if (sigaction(SIGCHLD, &sa, NULL) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+ "sigaction(SIGCHLD) failed");
+ return NGX_ERROR;
+ }
+
sa.sa_handler = ngx_restart_signal_handler;
if (sigaction(ngx_signal_value(NGX_RESTART_SIGNAL), &sa, NULL) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c
new file mode 100644
index 000000000..e487151ef
--- /dev/null
+++ b/src/os/unix/ngx_process.c
@@ -0,0 +1,112 @@
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+void testone(ngx_log_t *log)
+{
+ ngx_log_debug(log, "child process");
+ ngx_msleep(5000);
+ exit(0);
+}
+
+
+int ngx_spawn_process(ngx_log_t *log)
+{
+ pid_t pid;
+ sigset_t set, oset;
+
+ sigemptyset(&set);
+ sigaddset(&set, SIGCHLD);
+ if (sigprocmask(SIG_BLOCK, &set, &oset) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "sigprocmask() failed");
+ }
+
+ pid = fork();
+
+ if (pid == -1 || pid == 0) {
+ if (sigprocmask(SIG_SETMASK, &oset, &set) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
+ "sigprocmask() failed");
+ }
+ }
+
+ switch (pid) {
+ case -1:
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "fork() failed");
+ return NGX_ERROR;
+
+ case 0:
+ testone(log);
+ break;
+
+ default:
+ }
+
+ngx_log_debug(log, "parent process, child: " PID_FMT _ pid);
+
+ /* book keeping */
+
+ if (sigprocmask(SIG_SETMASK, &oset, &set) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "sigprocmask() failed");
+ }
+
+ return NGX_OK;
+}
+
+
+void ngx_sigchld_handler(int signo)
+{
+ int status, one;
+ pid_t pid;
+ ngx_err_t err;
+ struct timeval tv;
+
+ ngx_gettimeofday(&tv);
+
+ if (ngx_cached_time != tv.tv_sec) {
+ ngx_cached_time = tv.tv_sec;
+ ngx_time_update();
+ }
+
+ one = 0;
+
+ for ( ;; ) {
+ pid = waitpid(-1, &status, WNOHANG);
+
+ if (pid == 0) {
+ return;
+ }
+
+ if (pid == -1) {
+ err = ngx_errno;
+
+ if (err == NGX_EINTR) {
+ continue;
+ }
+
+ if (err == NGX_ECHILD && one) {
+ return;
+ }
+
+ ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, errno,
+ "waitpid() failed");
+ return;
+ }
+
+ one = 1;
+
+ ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,
+ "process " PID_FMT " exited with code %d", pid, status);
+
+ /* TODO: restart handler */
+
+#if 0
+ ngx_msleep(2000);
+#endif
+
+#if 0
+ ngx_spawn_process(ngx_cycle->log);
+#endif
+ }
+}
diff --git a/src/os/unix/ngx_process.h b/src/os/unix/ngx_process.h
index 60689ba9b..15d9c0d1d 100644
--- a/src/os/unix/ngx_process.h
+++ b/src/os/unix/ngx_process.h
@@ -2,7 +2,13 @@
#define _NGX_PROCESS_H_INCLUDED_
+typedef pid_t ngx_pid_t;
+
#define ngx_getpid getpid
+int ngx_spawn_process(ngx_log_t *log);
+void ngx_sigchld_handler(int signo);
+
+
#endif /* _NGX_PROCESS_H_INCLUDED_ */