From 9c61095a30ed2b6bf051dacbbbd26ae2769d9e34 Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Tue, 16 Mar 2004 13:35:20 +0000 Subject: [PATCH] nginx-0.0.3-2004-03-16-16:35:20 import --- auto/os/freebsd | 2 +- src/core/nginx.h | 2 +- src/core/ngx_inet.c | 134 +++++++++++++++++- src/core/ngx_inet.h | 2 +- src/core/ngx_output_chain.c | 6 + src/event/ngx_event_connect.c | 4 +- .../modules/proxy/ngx_http_proxy_handler.c | 2 +- .../modules/proxy/ngx_http_proxy_upstream.c | 58 ++++---- src/http/ngx_http.c | 5 +- src/http/ngx_http_parse.c | 14 +- src/http/ngx_http_request.c | 1 + src/os/unix/ngx_errno.h | 2 +- 12 files changed, 184 insertions(+), 48 deletions(-) diff --git a/auto/os/freebsd b/auto/os/freebsd index 7ddd6dc43..82e442c56 100644 --- a/auto/os/freebsd +++ b/auto/os/freebsd @@ -53,7 +53,7 @@ fi if [ \( $version -lt 500000 -a $version -ge 430000 \) \ -o $version -ge 500018 ] then - echo " + using kqueue's NOTE_LAWAT" + echo " + using kqueue's NOTE_LOWAT" have=HAVE_LOWAT_EVENT . auto/have fi diff --git a/src/core/nginx.h b/src/core/nginx.h index 436f1e860..224605a32 100644 --- a/src/core/nginx.h +++ b/src/core/nginx.h @@ -2,7 +2,7 @@ #define _NGINX_H_INCLUDED_ -#define NGINX_VER "nginx/0.0.2" +#define NGINX_VER "nginx/0.0.3" #define NGINX_CONF (u_char *) "nginx.conf" #define NGINX_PID "nginx.pid" #define NGINX_NEW_PID_EXT ".newbin" diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c index 9f593f0a5..fd67b7642 100644 --- a/src/core/ngx_inet.c +++ b/src/core/ngx_inet.c @@ -3,14 +3,62 @@ #include +ngx_inline static size_t ngx_sprint_uchar(u_char *text, u_char c, size_t len) +{ + size_t n; + ngx_uint_t c1, c2; + + n = 0; + + if (len == n) { + return n; + } + + c1 = c / 100; + + if (c1) { + *text++ = (u_char) (c1 + '0'); + n++; + + if (len == n) { + return n; + } + } + + c2 = (c % 100) / 10; + + if (c1 || c2) { + *text++ = (u_char) (c2 + '0'); + n++; + + if (len == n) { + return n; + } + } + + c2 = c % 10; + + *text++ = (u_char) (c2 + '0'); + n++; + + return n; +} + + /* AF_INET only */ size_t ngx_sock_ntop(int family, struct sockaddr *addr, u_char *text, size_t len) { u_char *p; + size_t n; + ngx_uint_t i; struct sockaddr_in *addr_in; + if (len == 0) { + return 0; + } + if (family != AF_INET) { return 0; } @@ -18,19 +66,101 @@ size_t ngx_sock_ntop(int family, struct sockaddr *addr, u_char *text, addr_in = (struct sockaddr_in *) addr; p = (u_char *) &addr_in->sin_addr; + if (len > INET_ADDRSTRLEN) { + len = INET_ADDRSTRLEN; + } + + n = ngx_sprint_uchar(text, p[0], len); + + i = 1; + + do { + if (len == n) { + text[n - 1] = '\0'; + return n; + } + + text[n++] = '.'; + + if (len == n) { + text[n - 1] = '\0'; + return n; + } + + n += ngx_sprint_uchar(&text[n], p[i++], len - n); + + } while (i < 4); + + if (len == n) { + text[n] = '\0'; + return n; + } + + text[n] = '\0'; + + return n; + +#if 0 return ngx_snprintf((char *) text, len > INET_ADDRSTRLEN ? INET_ADDRSTRLEN : len, "%u.%u.%u.%u", p[0], p[1], p[2], p[3]); +#endif } -size_t ngx_inet_ntop(int family, u_char *addr, u_char *text, size_t len) +size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len) { + u_char *p; + size_t n; + ngx_uint_t i; + + if (len == 0) { + return 0; + } + if (family != AF_INET) { return 0; } + p = (u_char *) addr; + + if (len > INET_ADDRSTRLEN) { + len = INET_ADDRSTRLEN; + } + + n = ngx_sprint_uchar(text, p[0], len); + + i = 1; + + do { + if (len == n) { + text[n - 1] = '\0'; + return n; + } + + text[n++] = '.'; + + if (len == n) { + text[n - 1] = '\0'; + return n; + } + + n += ngx_sprint_uchar(&text[n], p[i++], len - n); + + } while (i < 4); + + if (len == n) { + text[n] = '\0'; + return n; + } + + text[n] = '\0'; + + return n; + +#if 0 return ngx_snprintf((char *) text, len > INET_ADDRSTRLEN ? INET_ADDRSTRLEN : len, - "%u.%u.%u.%u", addr[0], addr[1], addr[2], addr[3]); + "%u.%u.%u.%u", p[0], p[1], p[2], p[3]); +#endif } diff --git a/src/core/ngx_inet.h b/src/core/ngx_inet.h index f5f5e0d44..074d43c94 100644 --- a/src/core/ngx_inet.h +++ b/src/core/ngx_inet.h @@ -4,7 +4,7 @@ size_t ngx_sock_ntop(int family, struct sockaddr *addr, u_char *text, size_t len); -size_t ngx_inet_ntop(int family, u_char *addr, u_char *text, size_t len); +size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len); #endif /* _NGX_INET_H_INCLUDED_ */ diff --git a/src/core/ngx_output_chain.c b/src/core/ngx_output_chain.c index 10326bcf7..55c4a50a3 100644 --- a/src/core/ngx_output_chain.c +++ b/src/core/ngx_output_chain.c @@ -265,8 +265,14 @@ int ngx_chain_writer(void *data, ngx_chain_t *in) ctx->last = &cl->next; } + ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->connection->log, 0, + "WRITER0: %X", ctx->out); + ctx->out = ngx_write_chain(ctx->connection, ctx->out); + ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->connection->log, 0, + "WRITER1: %X", ctx->out); + if (ctx->out == NGX_CHAIN_ERROR) { return NGX_ERROR; } diff --git a/src/event/ngx_event_connect.c b/src/event/ngx_event_connect.c index 6bc238eef..586f560dc 100644 --- a/src/event/ngx_event_connect.c +++ b/src/event/ngx_event_connect.c @@ -207,8 +207,8 @@ int ngx_event_connect_peer(ngx_peer_connection_t *pc) addr.sin_port = (u_short) peer->port; addr.sin_addr.s_addr = peer->addr; - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "connect to %s", peer->addr_port_text.data); + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0, + "connect to %s, #%d", peer->addr_port_text.data, c->number); rc = connect(s, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)); diff --git a/src/http/modules/proxy/ngx_http_proxy_handler.c b/src/http/modules/proxy/ngx_http_proxy_handler.c index d36867dba..61fea1c4e 100644 --- a/src/http/modules/proxy/ngx_http_proxy_handler.c +++ b/src/http/modules/proxy/ngx_http_proxy_handler.c @@ -984,7 +984,7 @@ static char *ngx_http_proxy_set_pass(ngx_conf_t *cf, ngx_command_t *cmd, NGX_CONF_ERROR); len = ngx_inet_ntop(AF_INET, - (u_char *) &lcf->peers->peers[i].addr, + &lcf->peers->peers[i].addr, lcf->peers->peers[i].addr_port_text.data, len); diff --git a/src/http/modules/proxy/ngx_http_proxy_upstream.c b/src/http/modules/proxy/ngx_http_proxy_upstream.c index 7704cb1ce..a4b6fda3e 100644 --- a/src/http/modules/proxy/ngx_http_proxy_upstream.c +++ b/src/http/modules/proxy/ngx_http_proxy_upstream.c @@ -303,8 +303,8 @@ static void ngx_http_proxy_init_upstream(void *data) ngx_chain_t *cl; ngx_http_request_t *r; - ngx_output_chain_ctx_t *octx; - ngx_chain_writer_ctx_t *wctx; + ngx_output_chain_ctx_t *output; + ngx_chain_writer_ctx_t *writer; ngx_http_proxy_log_ctx_t *lctx; r = p->request; @@ -359,27 +359,27 @@ static void ngx_http_proxy_init_upstream(void *data) r->connection->log->handler = ngx_http_proxy_log_error; p->action = "connecting to upstream"; - if (!(octx = ngx_pcalloc(r->pool, sizeof(ngx_output_chain_ctx_t)))) { + if (!(output = ngx_pcalloc(r->pool, sizeof(ngx_output_chain_ctx_t)))) { ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } - p->upstream->output_chain_ctx = octx; + p->upstream->output_chain_ctx = output; - octx->sendfile = r->sendfile; - octx->pool = r->pool; - octx->bufs.num = 1; - octx->tag = (ngx_hunk_tag_t) &ngx_http_proxy_module; - octx->output_filter = (ngx_output_chain_filter_pt) ngx_chain_writer; + output->sendfile = r->sendfile; + output->pool = r->pool; + output->bufs.num = 1; + output->tag = (ngx_hunk_tag_t) &ngx_http_proxy_module; + output->output_filter = (ngx_output_chain_filter_pt) ngx_chain_writer; - if (!(wctx = ngx_palloc(r->pool, sizeof(ngx_chain_writer_ctx_t)))) { + if (!(writer = ngx_palloc(r->pool, sizeof(ngx_chain_writer_ctx_t)))) { ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } - octx->output_ctx = wctx; + output->output_ctx = writer; - wctx->pool = r->pool; + writer->pool = r->pool; if (p->lcf->busy_lock && !p->busy_locked) { ngx_http_proxy_upstream_busy_lock(p); @@ -392,9 +392,9 @@ static void ngx_http_proxy_init_upstream(void *data) static void ngx_http_proxy_reinit_upstream(ngx_http_proxy_ctx_t *p) { ngx_chain_t *cl; - ngx_output_chain_ctx_t *octx; + ngx_output_chain_ctx_t *output; - octx = p->upstream->output_chain_ctx; + output = p->upstream->output_chain_ctx; /* reinit the request chain */ @@ -404,10 +404,10 @@ static void ngx_http_proxy_reinit_upstream(ngx_http_proxy_ctx_t *p) /* reinit ngx_output_chain() context */ - octx->hunk = NULL; - octx->in = NULL; - octx->free = NULL; - octx->busy = NULL; + output->hunk = NULL; + output->in = NULL; + output->free = NULL; + output->busy = NULL; /* reinit r->header_in buffer */ @@ -487,7 +487,7 @@ static void ngx_http_proxy_connect(ngx_http_proxy_ctx_t *p) int rc; ngx_connection_t *c; ngx_http_request_t *r; - ngx_output_chain_ctx_t *octx; + ngx_output_chain_ctx_t *output; p->action = "connecting to upstream"; @@ -517,7 +517,7 @@ static void ngx_http_proxy_connect(ngx_http_proxy_ctx_t *p) c->pool = r->pool; c->read->log = c->write->log = c->log = r->connection->log; - octx = p->upstream->output_chain_ctx; + output = p->upstream->output_chain_ctx; if (p->upstream->peer.tries > 1 && p->request_sent) { ngx_http_proxy_reinit_upstream(p); @@ -526,14 +526,14 @@ static void ngx_http_proxy_connect(ngx_http_proxy_ctx_t *p) /* init or reinit ngx_output_chain() context */ if (r->request_body_hunk) { - if (!(octx->free = ngx_alloc_chain_link(r->pool))) { + if (!(output->free = ngx_alloc_chain_link(r->pool))) { ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } - octx->free->hunk = r->request_body_hunk; - octx->free->next = NULL; - octx->hunks = 1; + output->free->hunk = r->request_body_hunk; + output->free->next = NULL; + output->hunks = 1; r->request_body_hunk->pos = r->request_body_hunk->start; r->request_body_hunk->last = r->request_body_hunk->start; @@ -565,7 +565,7 @@ static void ngx_http_proxy_send_request(ngx_http_proxy_ctx_t *p) { int rc; ngx_connection_t *c; - ngx_chain_writer_ctx_t *wctx; + ngx_chain_writer_ctx_t *writer; c = p->upstream->peer.connection; @@ -586,10 +586,10 @@ static void ngx_http_proxy_send_request(ngx_http_proxy_ctx_t *p) p->action = "sending request to upstream"; - wctx = p->upstream->output_chain_ctx->output_ctx; - wctx->out = NULL; - wctx->last = &wctx->out; - wctx->connection = c; + writer = p->upstream->output_chain_ctx->output_ctx; + writer->out = NULL; + writer->last = &writer->out; + writer->connection = c; rc = ngx_output_chain(p->upstream->output_chain_ctx, p->request_sent ? NULL : p->request->request_hunks); diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c index 9d53d8861..4ddca787e 100644 --- a/src/http/ngx_http.c +++ b/src/http/ngx_http.c @@ -496,8 +496,7 @@ static char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) ls->addr_text.len = ngx_snprintf((char *) ls->addr_text.data + ngx_inet_ntop(AF_INET, - (u_char *) - &in_addr[a].addr, + &in_addr[a].addr, ls->addr_text.data, INET_ADDRSTRLEN), 6, ":%d", in_port[p].port); @@ -597,7 +596,7 @@ static char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) in_addr = in_port[p].addrs.elts; for (a = 0; a < in_port[p].addrs.nelts; a++) { u_char ip[20]; - ngx_inet_ntop(AF_INET, (u_char *) &in_addr[a].addr, ip, 20); + ngx_inet_ntop(AF_INET, &in_addr[a].addr, ip, 20); ngx_log_debug2(NGX_LOG_DEBUG_HTTP, cf->log, 0, "%s %08x", ip, in_addr[a].core_srv_conf); s_name = in_addr[a].names.elts; diff --git a/src/http/ngx_http_parse.c b/src/http/ngx_http_parse.c index c86024539..e1304e80f 100644 --- a/src/http/ngx_http_parse.c +++ b/src/http/ngx_http_parse.c @@ -458,7 +458,7 @@ ngx_int_t ngx_http_parse_header_line(ngx_http_request_t *r, ngx_hunk_t *h) state = sw_name; r->header_name_start = p - 1; - c = (char) (ch | 0x20); + c = (u_char) (ch | 0x20); if (c >= 'a' && c <= 'z') { break; } @@ -778,15 +778,15 @@ ngx_int_t ngx_http_parse_complex_uri(ngx_http_request_t *r) case sw_quoted: if (ch >= '0' && ch <= '9') { - decoded = (char) (ch - '0'); + decoded = (u_char) (ch - '0'); state = sw_quoted_second; ch = *p++; break; } - c = (char) (ch | 0x20); + c = (u_char) (ch | 0x20); if (c >= 'a' && c <= 'f') { - decoded = (char) (c - 'a' + 10); + decoded = (u_char) (c - 'a' + 10); state = sw_quoted_second; ch = *p++; break; @@ -796,7 +796,7 @@ ngx_int_t ngx_http_parse_complex_uri(ngx_http_request_t *r) case sw_quoted_second: if (ch >= '0' && ch <= '9') { - ch = (char) ((decoded << 4) + ch - '0'); + ch = (u_char) ((decoded << 4) + ch - '0'); if (ch == '%') { state = sw_usual; *u++ = ch; @@ -807,9 +807,9 @@ ngx_int_t ngx_http_parse_complex_uri(ngx_http_request_t *r) break; } - c = (char) (ch | 0x20); + c = (u_char) (ch | 0x20); if (c >= 'a' && c <= 'f') { - ch = (char) ((decoded << 4) + c - 'a' + 10); + ch = (u_char) ((decoded << 4) + c - 'a' + 10); if (ch == '%') { state = sw_usual; *u++ = ch; diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c index 4113279c1..b69e79082 100644 --- a/src/http/ngx_http_request.c +++ b/src/http/ngx_http_request.c @@ -64,6 +64,7 @@ void ngx_http_init_connection(ngx_connection_t *c) c->addr_text.len = ngx_sock_ntop(c->listening->family, c->sockaddr, c->addr_text.data, c->listening->addr_text_max_len); + if (c->addr_text.len == 0) { ngx_http_close_connection(c); return; diff --git a/src/os/unix/ngx_errno.h b/src/os/unix/ngx_errno.h index cbfc98bb6..e7028bb88 100644 --- a/src/os/unix/ngx_errno.h +++ b/src/os/unix/ngx_errno.h @@ -43,7 +43,7 @@ ngx_int_t ngx_strerror_r(int err, char *errstr, size_t size); #else #define ngx_strerror_r(err, errstr, size) \ - ngx_cpystrn(errstr, strerror(err), size) - (errstr) + (char *) ngx_cpystrn(errstr, strerror(err), size) - (errstr) #endif