nginx-0.0.1-2003-11-19-19:26:41 import
diff --git a/src/core/nginx.c b/src/core/nginx.c
index b5e4392..ca056bd 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -50,18 +50,19 @@
};
-int ngx_max_module;
-ngx_os_io_t ngx_io;
+int ngx_max_module;
+ngx_os_io_t ngx_io;
-ngx_cycle_t *ngx_cycle;
-ngx_pool_t *ngx_temp_pool;
-ngx_array_t ngx_old_cycles;
-ngx_event_t ngx_cleaner_event;
+volatile ngx_cycle_t *ngx_cycle;
+ngx_array_t ngx_old_cycles;
+
+static ngx_pool_t *ngx_temp_pool;
+static ngx_event_t ngx_cleaner_event;
/* STUB NAME */
-ngx_connection_t dumb;
+static ngx_connection_t dumb;
-int ngx_connection_counter;
+u_int ngx_connection_counter;
int restart;
@@ -112,17 +113,16 @@
#if !(WIN32)
- ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,
- ngx_core_module);
+ ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
if (ccf->daemon != 0) {
- if (ngx_daemon(ngx_cycle->log) == NGX_ERROR) {
+ if (ngx_daemon(cycle->log) == NGX_ERROR) {
return 1;
}
}
- if (dup2(ngx_cycle->log->file->fd, STDERR_FILENO) == -1) {
- ngx_log_error(NGX_LOG_EMERG, ngx_cycle->log, ngx_errno,
+ if (dup2(cycle->log->file->fd, STDERR_FILENO) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
"dup2(STDERR) failed");
return 1;
}
@@ -132,22 +132,31 @@
/* life cycle */
for ( ;; ) {
- /* STUB */ ngx_cycle->log->log_level = NGX_LOG_DEBUG;
+ /* STUB */ cycle->log->log_level = NGX_LOG_DEBUG;
- /* forks */
+#if 0
+
+#if !(WIN32)
+ ngx_spawn_process(cycle->log);
+#endif
+
+ stub_init(cycle);
+#endif
+
+ /* TODO: forks */
ngx_init_temp_number();
for (i = 0; ngx_modules[i]; i++) {
if (ngx_modules[i]->init_child) {
- if (ngx_modules[i]->init_child(ngx_cycle) == NGX_ERROR) {
+ if (ngx_modules[i]->init_child(cycle) == NGX_ERROR) {
/* fatal */
exit(1);
}
}
}
- /* threads */
+ /* TODO: threads */
restart = 0;
rotate = 0;
@@ -155,12 +164,12 @@
for ( ;; ) {
for ( ;; ) {
- ngx_log_debug(ngx_cycle->log, "worker cycle");
+ ngx_log_debug(cycle->log, "worker cycle");
- ngx_process_events(ngx_cycle->log);
+ ngx_process_events(cycle->log);
if (rotate) {
- ngx_log_debug(ngx_cycle->log, "rotate");
+ ngx_log_debug(cycle->log, "rotate");
file = cycle->open_files.elts;
for (i = 0; i < cycle->open_files.nelts; i++) {
@@ -176,7 +185,7 @@
if (fd == NGX_INVALID_FILE) {
ngx_log_error(NGX_LOG_EMERG,
- ngx_cycle->log, ngx_errno,
+ cycle->log, ngx_errno,
ngx_open_file_n " \"%s\" failed",
file[i].name.data);
continue;
@@ -185,14 +194,14 @@
#if (WIN32)
if (ngx_file_append_mode(fd) == NGX_ERROR) {
ngx_log_error(NGX_LOG_EMERG,
- ngx_cycle->log, ngx_errno,
+ cycle->log, ngx_errno,
ngx_file_append_mode_n
" \"%s\" failed",
file[i].name.data);
if (ngx_close_file(fd) == NGX_FILE_ERROR) {
ngx_log_error(NGX_LOG_EMERG,
- ngx_cycle->log, ngx_errno,
+ cycle->log, ngx_errno,
ngx_close_file_n " \"%s\" failed",
file[i].name.data);
}
@@ -203,7 +212,7 @@
if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {
ngx_log_error(NGX_LOG_EMERG,
- ngx_cycle->log, ngx_errno,
+ cycle->log, ngx_errno,
ngx_close_file_n " \"%s\" failed",
file[i].name.data);
}
@@ -213,14 +222,15 @@
}
if (restart) {
- ngx_log_debug(ngx_cycle->log, "restart");
+ ngx_log_debug(cycle->log, "restart");
break;
}
}
- cycle = ngx_init_cycle(ngx_cycle, ngx_cycle->log);
+ cycle = ngx_init_cycle(cycle, cycle->log);
if (cycle == NULL) {
+ cycle = (ngx_cycle_t*) ngx_cycle;
continue;
}
@@ -464,8 +474,6 @@
}
}
- stub_init(cycle);
-
if (old_cycle == NULL) {
return cycle;
}
@@ -681,11 +689,13 @@
static void ngx_clean_old_cycles(ngx_event_t *ev)
{
int i, n, found, live;
+ ngx_log_t *log;
ngx_cycle_t **cycle;
- ngx_temp_pool->log = ngx_cycle->log;
+ log = ngx_cycle->log;
+ ngx_temp_pool->log = log;
- ngx_log_debug(ngx_cycle->log, "clean old cycles");
+ ngx_log_debug(log, "clean old cycles");
live = 0;
@@ -701,7 +711,7 @@
for (n = 0; n < cycle[i]->connection_n; n++) {
if (cycle[i]->connections[n].fd != -1) {
found = 1;
- ngx_log_debug(ngx_cycle->log, "live fd: %d" _ n);
+ ngx_log_debug(log, "live fd: %d" _ n);
break;
}
}
@@ -711,15 +721,15 @@
continue;
}
- ngx_log_debug(ngx_cycle->log, "clean old cycle: %d" _ i);
+ ngx_log_debug(log, "clean old cycle: %d" _ i);
ngx_destroy_pool(cycle[i]->pool);
cycle[i] = NULL;
}
- ngx_log_debug(ngx_cycle->log, "old cycles status: %d" _ live);
+ ngx_log_debug(log, "old cycles status: %d" _ live);
if (live) {
- ngx_log_debug(ngx_cycle->log, "TIMER");
+ ngx_log_debug(log, "TIMER");
ngx_add_timer(ev, 30000);
} else {
diff --git a/src/core/nginx.h b/src/core/nginx.h
index f58df7c..6a9fd49 100644
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -6,10 +6,10 @@
#define NGINX_CONF "nginx.conf"
-extern int ngx_max_module;
-extern int ngx_connection_counter;
+extern int ngx_max_module;
+extern u_int ngx_connection_counter;
-extern ngx_module_t ngx_core_module;
+extern ngx_module_t ngx_core_module;
diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h
index 23f436e..8a473bf 100644
--- a/src/core/ngx_conf_file.h
+++ b/src/core/ngx_conf_file.h
@@ -264,9 +264,9 @@
void *conf);
-extern ngx_module_t *ngx_modules[];
-extern ngx_cycle_t *ngx_cycle;
-extern ngx_array_t ngx_old_cycles;
+extern ngx_module_t *ngx_modules[];
+extern volatile ngx_cycle_t *ngx_cycle;
+extern ngx_array_t ngx_old_cycles;
#endif /* _NGX_HTTP_CONF_FILE_H_INCLUDED_ */
diff --git a/src/core/ngx_core.h b/src/core/ngx_core.h
index ec8182b..0dc45bb 100644
--- a/src/core/ngx_core.h
+++ b/src/core/ngx_core.h
@@ -5,6 +5,7 @@
typedef struct ngx_module_s ngx_module_t;
typedef struct ngx_conf_s ngx_conf_t;
typedef struct ngx_cycle_s ngx_cycle_t;
+typedef struct ngx_log_s ngx_log_t;
typedef struct ngx_open_file_s ngx_open_file_t;
typedef struct ngx_command_s ngx_command_t;
diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c
index 61d49c7..a9ca9c3 100644
--- a/src/core/ngx_log.c
+++ b/src/core/ngx_log.c
@@ -91,12 +91,21 @@
len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1,
PID_FMT "#%d: ", ngx_getpid(), 0);
+ if (log->data) {
+ len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1,
+ "*%u ", * (u_int *) log->data);
+ }
+
#if (HAVE_VARIADIC_MACROS)
+
va_start(args, fmt);
len += ngx_vsnprintf(errstr + len, sizeof(errstr) - len - 1, fmt, args);
va_end(args);
+
#else
+
len += ngx_vsnprintf(errstr + len, sizeof(errstr) - len - 1, fmt, args);
+
#endif
if (err) {
diff --git a/src/core/ngx_log.h b/src/core/ngx_log.h
index 3eedfff..290b11c 100644
--- a/src/core/ngx_log.h
+++ b/src/core/ngx_log.h
@@ -66,7 +66,7 @@
typedef size_t (*ngx_log_handler_pt) (void *ctx, char *buf, size_t len);
-typedef struct {
+struct ngx_log_s {
int log_level;
ngx_open_file_t *file;
void *data;
@@ -78,7 +78,7 @@
char *context;
/* */
#endif
-} ngx_log_t;
+};
#define MAX_ERROR_STR 2048
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index a4f7436..17f8899 100644
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -5,62 +5,74 @@
#include <nginx.h>
+static size_t ngx_accept_log_error(void *data, char *buf, size_t len);
+
+
void ngx_event_accept(ngx_event_t *ev)
{
- int instance;
- socklen_t len;
- struct sockaddr *sa;
- ngx_err_t err;
- ngx_pool_t *pool;
- ngx_socket_t s;
- ngx_event_t *rev, *wev;
- ngx_connection_t *c, *ls;
- ngx_event_conf_t *ecf;
+ int instance, accepted;
+ socklen_t len;
+ struct sockaddr *sa;
+ ngx_err_t err;
+ ngx_log_t *log;
+ ngx_pool_t *pool;
+ ngx_socket_t s;
+ ngx_event_t *rev, *wev;
+ ngx_connection_t *c, *ls;
+ ngx_event_conf_t *ecf;
ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);
ls = ev->data;
- ngx_log_debug(ev->log, "ngx_event_accept: accept ready: %d" _
+ ngx_log_debug(ev->log, "accept on %s ready: %d" _
+ ls->listening->addr_text.data _
ev->available);
ev->ready = 0;
+ accepted = 0;
do {
/*
* Create the pool before accept() to avoid copy the sockaddr.
* Although accept() can fail it's an uncommon case
- * and the pool can be got from the free pool list
+ * and besides the pool can be got from the free pool list
*/
- pool = ngx_create_pool(ls->listening->pool_size, ev->log);
- if (pool == NULL) {
+ if (!(pool = ngx_create_pool(ls->listening->pool_size, ev->log))) {
return;
}
- sa = ngx_palloc(pool, ls->listening->socklen);
- if (sa == NULL) {
+ if (!(sa = ngx_palloc(pool, ls->listening->socklen))) {
return;
}
+ if (!(log = ngx_palloc(pool, sizeof(ngx_log_t)))) {
+ return;
+ }
+ ngx_memcpy(log, ls->log, sizeof(ngx_log_t));
+ pool->log = log;
+
+ log->data = ls->listening->addr_text.data;
+ log->handler = ngx_accept_log_error;
+
len = ls->listening->socklen;
-ngx_log_debug(ev->log, "ADDR %s" _ ls->listening->addr_text.data);
-
s = accept(ls->fd, sa, &len);
if (s == -1) {
err = ngx_socket_errno;
if (err == NGX_EAGAIN) {
- ngx_log_error(NGX_LOG_NOTICE, ev->log, err,
- "EAGAIN while accept() %s",
- ls->listening->addr_text.data);
+ ngx_log_error(NGX_LOG_NOTICE, log, err,
+ "EAGAIN after %d accepted connection(s)",
+ accepted);
return;
}
ngx_log_error(NGX_LOG_ALERT, ev->log, err,
- "accept() %s failed", ls->listening->addr_text.data);
+ "accept() on %s failed",
+ ls->listening->addr_text.data);
ngx_destroy_pool(pool);
return;
@@ -71,15 +83,14 @@
if ((unsigned) s >= (unsigned) ecf->connections) {
ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
- "accept() %s returned socket #%d while "
+ "accept() on %s returned socket #%d while "
"only %d connections was configured, "
"sleeping for 1 second",
ls->listening->addr_text.data, s, ecf->connections);
if (ngx_close_socket(s) == -1) {
- ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
- ngx_close_socket_n " %s failed",
- ls->listening->addr_text.data);
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
+ ngx_close_socket_n "failed");
}
ngx_msleep(1000);
@@ -93,14 +104,12 @@
if (ngx_inherited_nonblocking) {
if ((ngx_event_flags & NGX_USE_AIO_EVENT)) {
if (ngx_blocking(s) == -1) {
- ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
- ngx_blocking_n " %s failed",
- ls->listening->addr_text.data);
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
+ ngx_blocking_n " failed");
if (ngx_close_socket(s) == -1) {
- ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
- ngx_close_socket_n " %s failed",
- ls->listening->addr_text.data);
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
+ ngx_close_socket_n " failed");
}
ngx_destroy_pool(pool);
@@ -111,14 +120,12 @@
} else {
if ((ngx_event_flags & NGX_USE_AIO_EVENT) == 0) {
if (ngx_nonblocking(s) == -1) {
- ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
- ngx_nonblocking_n " %s failed",
- ls->listening->addr_text.data);
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
+ ngx_nonblocking_n " failed");
if (ngx_close_socket(s) == -1) {
- ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
- ngx_close_socket_n " %s failed",
- ls->listening->addr_text.data);
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
+ ngx_close_socket_n " failed");
}
ngx_destroy_pool(pool);
@@ -134,9 +141,10 @@
*/
if (s % 4) {
- ngx_log_error(NGX_LOG_EMERG, ls->log, 0,
- ngx_socket_n
- " created socket %d, not divisible by 4", s);
+ ngx_log_error(NGX_LOG_EMERG, ev->log, 0,
+ "accept() on %s returned socket #%d, "
+ "not divisible by 4",
+ ls->listening->addr_text.data, s);
exit(1);
}
@@ -161,16 +169,21 @@
c->sockaddr = sa;
c->socklen = len;
- rev->instance = wev->instance = !instance;
+ rev->instance = !instance;
+ wev->instance = !instance;
- rev->index = wev->index = NGX_INVALID_INDEX;
+ rev->index = NGX_INVALID_INDEX;
+ wev->index = NGX_INVALID_INDEX;
- rev->data = wev->data = c;
+ rev->data = c;
+ wev->data = c;
+
c->read = rev;
c->write = wev;
c->fd = s;
c->unexpected_eof = 1;
+
wev->write = 1;
wev->ready = 1;
@@ -182,12 +195,9 @@
c->ctx = ls->ctx;
c->servers = ls->servers;
- c->log = ngx_palloc(c->pool, sizeof(ngx_log_t));
- if (c->log == NULL) {
- return;
- }
- ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t));
- rev->log = wev->log = c->log;
+ c->log = log;
+ rev->log = log;
+ wev->log = log;
/* TODO: x86: MT: lock xadd, MP: lock xadd, shared */
c->number = ngx_connection_counter++;
@@ -202,8 +212,7 @@
if (ngx_add_conn(c) == NGX_ERROR) {
if (ngx_close_socket(s) == -1) {
ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
- ngx_close_socket_n " %s failed",
- ls->listening->addr_text.data);
+ ngx_close_socket_n " failed");
}
ngx_destroy_pool(pool);
@@ -211,13 +220,28 @@
}
}
+ log->data = NULL;
+ log->handler = NULL;
+
ls->listening->handler(c);
+#if 0
if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
ev->available--;
}
+#endif
+
+ accepted++;
} while (ev->available);
return;
}
+
+
+static size_t ngx_accept_log_error(void *data, char *buf, size_t len)
+{
+ char *sock = data;
+
+ return ngx_snprintf(buf, len, " while accept() on %s", sock);
+}
diff --git a/src/event/ngx_event_connect.c b/src/event/ngx_event_connect.c
index 717a4a4..1a61ef7 100644
--- a/src/event/ngx_event_connect.c
+++ b/src/event/ngx_event_connect.c
@@ -158,15 +158,23 @@
ngx_memzero(rev, sizeof(ngx_event_t));
ngx_memzero(wev, sizeof(ngx_event_t));
- rev->index = wev->index = NGX_INVALID_INDEX;
- rev->data = wev->data = c;
+ rev->index = NGX_INVALID_INDEX;
+ wev->index = NGX_INVALID_INDEX;
+
+ rev->data = c;
+ wev->data = c;
+
c->read = rev;
c->write = wev;
wev->write = 1;
- rev->instance = wev->instance = !instance;
+ rev->instance = !instance;
+ wev->instance = !instance;
- rev->log = wev->log = c->log = pc->log;
+ c->log = pc->log;
+ rev->log = pc->log;
+ wev->log = pc->log;
+
c->fd = s;
pc->connection = c;
diff --git a/src/http/modules/proxy/ngx_http_proxy_handler.c b/src/http/modules/proxy/ngx_http_proxy_handler.c
index 7a012c8..b7487f8 100644
--- a/src/http/modules/proxy/ngx_http_proxy_handler.c
+++ b/src/http/modules/proxy/ngx_http_proxy_handler.c
@@ -524,22 +524,22 @@
size_t ngx_http_proxy_log_error(void *data, char *buf, size_t len)
{
- ngx_http_proxy_ctx_t *p = data;
+ ngx_http_proxy_log_ctx_t *ctx = data;
ngx_http_request_t *r;
ngx_peer_connection_t *peer;
- r = p->request;
- peer = &p->upstream->peer;
+ r = ctx->proxy->request;
+ peer = &ctx->proxy->upstream->peer;
return ngx_snprintf(buf, len,
" while %s, client: %s, URL: %s, upstream: %s%s%s%s%s",
- p->action,
+ ctx->proxy->action,
r->connection->addr_text.data,
r->unparsed_uri.data,
peer->peers->peers[peer->cur_peer].addr_port_text.data,
- p->lcf->upstream->uri.data,
- r->uri.data + p->lcf->upstream->location->len,
+ ctx->proxy->lcf->upstream->uri.data,
+ r->uri.data + ctx->proxy->lcf->upstream->location->len,
r->args.len ? "?" : "",
r->args.len ? r->args.data : "");
}
@@ -934,7 +934,9 @@
clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];
lcf->upstream->location = &clcf->name;
clcf->handler = ngx_http_proxy_handler;
- clcf->auto_redirect = 1;
+ if (clcf->name.data[clcf->name.len - 1] == '/') {
+ clcf->auto_redirect = 1;
+ }
return NULL;
}
diff --git a/src/http/modules/proxy/ngx_http_proxy_handler.h b/src/http/modules/proxy/ngx_http_proxy_handler.h
index 0258de5..43eb5ef 100644
--- a/src/http/modules/proxy/ngx_http_proxy_handler.h
+++ b/src/http/modules/proxy/ngx_http_proxy_handler.h
@@ -185,6 +185,12 @@
};
+typedef struct {
+ u_int connection;
+ ngx_http_proxy_ctx_t *proxy;
+} ngx_http_proxy_log_ctx_t;
+
+
#define NGX_HTTP_PROXY_PARSE_NO_HEADER 20
diff --git a/src/http/modules/proxy/ngx_http_proxy_upstream.c b/src/http/modules/proxy/ngx_http_proxy_upstream.c
index 12a4c62..9d442cd 100644
--- a/src/http/modules/proxy/ngx_http_proxy_upstream.c
+++ b/src/http/modules/proxy/ngx_http_proxy_upstream.c
@@ -210,10 +210,11 @@
{
ngx_http_proxy_ctx_t *p = data;
- ngx_chain_t *cl;
- ngx_http_request_t *r;
- ngx_output_chain_ctx_t *octx;
- ngx_chain_writer_ctx_t *wctx;
+ ngx_chain_t *cl;
+ ngx_http_request_t *r;
+ ngx_output_chain_ctx_t *octx;
+ ngx_chain_writer_ctx_t *wctx;
+ ngx_http_proxy_log_ctx_t *lctx;
r = p->request;
@@ -252,10 +253,17 @@
r->request_hunks = cl;
+ if (!(lctx = ngx_pcalloc(r->pool, sizeof(ngx_http_proxy_log_ctx_t)))) {
+ ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR);
+ return;
+ }
+ lctx->connection = r->connection->number;
+ lctx->proxy = p;
+
p->upstream->peer.log = r->connection->log;
p->saved_ctx = r->connection->log->data;
p->saved_handler = r->connection->log->handler;
- r->connection->log->data = p;
+ r->connection->log->data = lctx;
r->connection->log->handler = ngx_http_proxy_log_error;
p->action = "connecting to upstream";
diff --git a/src/http/ngx_http.h b/src/http/ngx_http.h
index f4f68ff..4271da3 100644
--- a/src/http/ngx_http.h
+++ b/src/http/ngx_http.h
@@ -16,9 +16,10 @@
typedef struct {
- char *action;
- char *client;
- char *url;
+ u_int connection;
+ char *action;
+ char *client;
+ char *url;
} ngx_http_log_ctx_t;
@@ -52,6 +53,7 @@
void ngx_http_finalize_request(ngx_http_request_t *r, int error);
void ngx_http_writer(ngx_event_t *wev);
+void ngx_http_empty_handler(ngx_event_t *wev);
int ngx_http_send_last(ngx_http_request_t *r);
void ngx_http_close_request(ngx_http_request_t *r, int error);
diff --git a/src/http/ngx_http_cache.c b/src/http/ngx_http_cache.c
index 8eb62eb..fd1a9d0 100644
--- a/src/http/ngx_http_cache.c
+++ b/src/http/ngx_http_cache.c
@@ -107,7 +107,7 @@
ctx->date = h->date;
ctx->length = h->length;
- if (h->key_len > (size_t) (ctx->buf->last - ctx->buf->pos)) {
+ if (h->key_len > (size_t) (ctx->buf->end - ctx->buf->pos)) {
ngx_log_error(NGX_LOG_ALERT, ctx->log, 0,
"cache file \"%s\" is probably invalid",
ctx->file.name.data);
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index f4f5d4f..e06198e 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -355,7 +355,7 @@
}
if (r->content_handler) {
- r->connection->write->event_handler = ngx_http_writer;
+ r->connection->write->event_handler = ngx_http_empty_handler;
rc = r->content_handler(r);
ngx_http_finalize_request(r, rc);
return;
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index a59b12a..62c9a66 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -21,7 +21,6 @@
static void ngx_http_keepalive_handler(ngx_event_t *ev);
static void ngx_http_set_lingering_close(ngx_http_request_t *r);
static void ngx_http_lingering_close_handler(ngx_event_t *ev);
-static void ngx_http_empty_handler(ngx_event_t *wev);
static void ngx_http_client_error(ngx_http_request_t *r,
int client_error, int error);
@@ -52,7 +51,7 @@
void ngx_http_init_connection(ngx_connection_t *c)
{
ngx_event_t *rev;
- ngx_http_log_ctx_t *lctx;
+ ngx_http_log_ctx_t *ctx;
c->addr_text.data = ngx_palloc(c->pool, c->listening->addr_text_max_len);
if (c->addr_text.data == NULL) {
@@ -68,14 +67,15 @@
return;
}
- if (!(lctx = ngx_pcalloc(c->pool, sizeof(ngx_http_log_ctx_t)))) {
+ if (!(ctx = ngx_pcalloc(c->pool, sizeof(ngx_http_log_ctx_t)))) {
ngx_http_close_connection(c);
return;
}
- lctx->client = c->addr_text.data;
- lctx->action = "reading client request line";
- c->log->data = lctx;
+ ctx->connection = c->number;
+ ctx->client = c->addr_text.data;
+ ctx->action = "reading client request line";
+ c->log->data = ctx;
c->log->handler = ngx_http_log_error;
rev = c->read;
@@ -263,7 +263,7 @@
ssize_t n;
ngx_connection_t *c;
ngx_http_request_t *r;
- ngx_http_log_ctx_t *lctx;
+ ngx_http_log_ctx_t *ctx;
ngx_http_core_srv_conf_t *cscf;
c = rev->data;
@@ -414,9 +414,9 @@
return;
}
- lctx = c->log->data;
- lctx->action = "reading client request headers";
- lctx->url = r->unparsed_uri.data;
+ ctx = c->log->data;
+ ctx->action = "reading client request headers";
+ ctx->url = r->unparsed_uri.data;
/* TODO: ngx_init_table */
r->headers_in.headers = ngx_create_table(r->pool, 20);
@@ -874,6 +874,8 @@
ngx_http_request_t *r;
ngx_http_core_loc_conf_t *clcf;
+ ngx_log_debug(wev->log, "http writer handler");
+
c = wev->data;
r = c->data;
@@ -1138,7 +1140,7 @@
{
ssize_t n;
ngx_connection_t *c;
- ngx_http_log_ctx_t *lctx;
+ ngx_http_log_ctx_t *ctx;
c = (ngx_connection_t *) rev->data;
@@ -1168,19 +1170,19 @@
return;
}
- lctx = (ngx_http_log_ctx_t *) rev->log->data;
+ ctx = (ngx_http_log_ctx_t *) rev->log->data;
rev->log->handler = NULL;
if (n == 0) {
ngx_log_error(NGX_LOG_INFO, c->log, ngx_socket_errno,
- "client %s closed keepalive connection", lctx->client);
+ "client %s closed keepalive connection", ctx->client);
ngx_http_close_connection(c);
return;
}
c->buffer->last += n;
rev->log->handler = ngx_http_log_error;
- lctx->action = "reading client request line";
+ ctx->action = "reading client request line";
ngx_http_init_request(rev);
}
@@ -1306,7 +1308,7 @@
}
-static void ngx_http_empty_handler(ngx_event_t *wev)
+void ngx_http_empty_handler(ngx_event_t *wev)
{
ngx_log_debug(wev->log, "http EMPTY handler");
@@ -1442,7 +1444,7 @@
static size_t ngx_http_log_error(void *data, char *buf, size_t len)
{
- ngx_http_log_ctx_t *ctx = (ngx_http_log_ctx_t *) data;
+ ngx_http_log_ctx_t *ctx = data;
if (ctx->action && ctx->url) {
return ngx_snprintf(buf, len, " while %s, client: %s, URL: %s",
diff --git a/src/os/unix/ngx_daemon.c b/src/os/unix/ngx_daemon.c
index 7d05fef..b2a37c1 100644
--- a/src/os/unix/ngx_daemon.c
+++ b/src/os/unix/ngx_daemon.c
@@ -9,7 +9,7 @@
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 @@
}
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 @@
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 d0f255a..a7326b6 100644
--- a/src/os/unix/ngx_errno.h
+++ b/src/os/unix/ngx_errno.h
@@ -19,6 +19,7 @@
#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 7b9d4e4..651113d 100644
--- a/src/os/unix/ngx_files.c
+++ b/src/os/unix/ngx_files.c
@@ -30,9 +30,9 @@
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 @@
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 @@
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 0493b3b..a045a1d 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 c970833..7462dcf 100644
--- a/src/os/unix/ngx_posix_init.c
+++ b/src/os/unix/ngx_posix_init.c
@@ -13,8 +13,8 @@
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 @@
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 0000000..e487151
--- /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 60689ba..15d9c0d 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_ */