nginx-0.0.1-2004-01-08-11:47:17 import
diff --git a/src/core/nginx.c b/src/core/nginx.c
index 312c69d..0d87d00 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -5,6 +5,7 @@
#include <nginx.h>
+static void ngx_master_process_cycle(ngx_cycle_t *cycle);
static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data);
static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle, char **envp);
static void ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv);
@@ -66,8 +67,7 @@
u_int ngx_connection_counter;
-ngx_int_t ngx_master;
-ngx_int_t ngx_single;
+ngx_int_t ngx_process;
ngx_int_t ngx_respawn;
@@ -80,10 +80,8 @@
int main(int argc, char *const *argv, char **envp)
{
- struct timeval tv;
ngx_fd_t fd;
ngx_int_t i;
- ngx_err_t err;
ngx_log_t *log;
ngx_cycle_t *cycle, init_cycle;
ngx_open_file_t *file;
@@ -140,16 +138,23 @@
ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
- if (ccf->single == 1) {
- ngx_master = 0;
- ngx_single = 1;
+ ngx_process = (ccf->single == 1) ? NGX_PROCESS_SINGLE : NGX_PROCESS_MASTER;
- } else {
- ngx_master = 1;
- ngx_single = 0;
+#if (WIN32)
+
+#if 0
+
+ if (run_as_service) {
+ if (ngx_servie(cycle->log) == NGX_ERROR) {
+ return 1;
+ }
+
+ return 0;
}
-#if !(WIN32)
+#endif
+
+#else
/* STUB */
if (ccf->user.len) {
@@ -205,12 +210,22 @@
#endif
- /* a life cycle */
+ ngx_master_process_cycle(cycle);
+
+ return 0;
+}
+
+
+static void ngx_master_process_cycle(ngx_cycle_t *cycle)
+{
+ struct timeval tv;
+ ngx_int_t i;
+ ngx_err_t err;
for ( ;; ) {
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "new cycle");
- if (ngx_master) {
+ if (ngx_process == NGX_PROCESS_MASTER) {
ngx_spawn_process(cycle, ngx_worker_process_cycle, NULL,
"worker process", NGX_PROCESS_RESPAWN);
@@ -227,10 +242,6 @@
}
}
-#if 0
- reconfigure = 0;
- reopen = 0;
-#endif
/* a cycle with the same configuration */
@@ -242,7 +253,7 @@
err = 0;
- if (ngx_single) {
+ if (ngx_process == NGX_PROCESS_SINGLE) {
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"worker cycle");
@@ -264,16 +275,18 @@
if (ngx_quit || ngx_terminate) {
#if !(WIN32)
+#if 0
if (ngx_delete_file(pidfile.name.data) == NGX_FILE_ERROR) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
ngx_delete_file_n " \"%s\" failed",
pidfile.name.data);
}
#endif
+#endif
ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
- if (ngx_master) {
+ if (ngx_process == NGX_PROCESS_MASTER) {
ngx_signal_processes(cycle,
ngx_signal_value(NGX_SHUTDOWN_SIGNAL));
@@ -293,6 +306,7 @@
ngx_respawn_processes(cycle);
}
+#if 0
if (ngx_change_binary) {
ngx_change_binary = 0;
ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
@@ -300,6 +314,7 @@
ngx_exec_new_binary(cycle, argv);
/* TODO: quit workers */
}
+#endif
if (ngx_reconfigure) {
ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reconfiguring");
@@ -334,6 +349,8 @@
ngx_int_t i;
ngx_listening_t *ls;
+ ngx_process = NGX_PROCESS_WORKER;
+
if (user) {
if (setuid(user) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
diff --git a/src/core/nginx.h b/src/core/nginx.h
index 238512f..b1d7744 100644
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -13,8 +13,7 @@
extern ngx_uint_t ngx_connection_counter;
-extern ngx_int_t ngx_master;
-extern ngx_int_t ngx_single;
+extern ngx_int_t ngx_process;
#endif /* _NGINX_H_INCLUDED_ */
diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c
index 2ca69d4..debcca8 100644
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -309,7 +309,7 @@
return cycle;
}
- if (ngx_master) {
+ if (ngx_process == NGX_PROCESS_MASTER) {
ngx_destroy_pool(old_cycle->pool);
return cycle;
}
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index a8dfe0e..a6fb08a 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -277,6 +277,7 @@
static void ngx_http_process_request_line(ngx_event_t *rev)
{
+ char *p;
ssize_t n;
ngx_int_t rc, offset;
ngx_connection_t *c;
@@ -307,11 +308,13 @@
/* the request line has been parsed successfully */
- /* TODO: we need to handle such URIs */
+ /* TODO: we need to handle proxy URIs */
if (r->unusual_uri) {
r->request_line.len = r->request_end - r->request_start;
r->request_line.data = r->request_start;
+#if 0
r->request_line.data[r->request_line.len] = '\0';
+#endif
ngx_http_client_error(r, NGX_HTTP_PARSE_INVALID_REQUEST,
NGX_HTTP_BAD_REQUEST);
@@ -372,7 +375,6 @@
if (rc != NGX_OK) {
r->request_line.len = r->request_end - r->request_start;
r->request_line.data = r->request_start;
- r->request_line.data[r->request_line.len] = '\0';
ngx_http_client_error(r, rc, NGX_HTTP_BAD_REQUEST);
return;
@@ -482,6 +484,15 @@
/* there was error while a request line parsing */
+ for (p = r->request_start; p < r->header_in->last; p++) {
+ if (*p == CR || *p == LF) {
+ break;
+ }
+ }
+
+ r->request_line.len = p - r->request_start;
+ r->request_line.data = r->request_start;
+
ngx_http_client_error(r, rc, NGX_HTTP_BAD_REQUEST);
return;
@@ -1564,6 +1575,11 @@
ctx->client, ctx->url);
} else {
+ if (error == NGX_HTTP_REQUEST_URI_TOO_LARGE) {
+ r->request_line.len = r->header_in->end - r->request_start;
+ r->request_line.data = r->request_start;
+ }
+
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
client_header_errors[client_error - NGX_HTTP_CLIENT_ERROR],
ctx->client);
diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c
index e500408..e9de91e 100644
--- a/src/os/unix/ngx_process.c
+++ b/src/os/unix/ngx_process.c
@@ -8,6 +8,14 @@
ngx_uint_t ngx_last_process;
ngx_process_t ngx_processes[NGX_MAX_PROCESSES];
+sigset_t ngx_sigmask;
+
+
+void ngx_wait_events()
+{
+ sigsuspend(&ngx_sigmask);
+}
+
ngx_int_t ngx_spawn_process(ngx_cycle_t *cycle,
ngx_spawn_proc_pt proc, void *data,
diff --git a/src/os/unix/ngx_process.h b/src/os/unix/ngx_process.h
index 5b7e37c..c63ff52 100644
--- a/src/os/unix/ngx_process.h
+++ b/src/os/unix/ngx_process.h
@@ -29,7 +29,9 @@
} ngx_exec_ctx_t;
-#define ngx_getpid getpid
+#define NGX_PROCESS_SINGLE 0
+#define NGX_PROCESS_MASTER 1
+#define NGX_PROCESS_WORKER 2
#define NGX_MAX_PROCESSES 1024
@@ -38,6 +40,8 @@
#define NGX_PROCESS_DETACHED -3
+#define ngx_getpid getpid
+
ngx_int_t ngx_spawn_process(ngx_cycle_t *cycle,
ngx_spawn_proc_pt proc, void *data,
char *name, ngx_int_t respawn);
diff --git a/src/os/win32/ngx_service.c b/src/os/win32/ngx_service.c
new file mode 100644
index 0000000..64a54ee
--- /dev/null
+++ b/src/os/win32/ngx_service.c
@@ -0,0 +1,124 @@
+
+#define NGX_SERVICE_CONTROL_SHUTDOWN 128
+#define NGX_SERVICE_CONTROL_REOPEN 129
+
+
+SERVICE_TABLE_ENTRY st[] = {
+ { "nginx", service_main },
+ { NULL, NULL }
+};
+
+
+ngx_int_t ngx_service(ngx_log_t *log)
+{
+ /* primary thread */
+
+ /* StartServiceCtrlDispatcher() shouxpdl be called within 30 seconds */
+
+ if (StartServiceCtrlDispatcher(st) == 0) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+ "StartServiceCtrlDispatcher() failed");
+ return NGX_ERROR;
+ }
+
+ return NGX_OK;
+}
+
+
+void service_main(u_int argc, char **argv)
+{
+ SERVICE_STATUS status;
+ SERVICE_STATUS_HANDLE service;
+
+ /* thread spawned by SCM */
+
+ service = RegisterServiceCtrlHandlerEx("nginx", service_handler, ctx);
+ if (service == INVALID_HANDLE_VALUE) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+ "RegisterServiceCtrlHandlerEx() failed");
+ return;
+ }
+
+ status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+ status.dwCurrentState = SERVICE_START_PENDING;
+ status.dwControlsAccepted = SERVICE_ACCEPT_STOP
+ |SERVICE_ACCEPT_PARAMCHANGE;
+ status.dwWin32ExitCode = NO_ERROR;
+ status.dwServiceSpecificExitCode = 0;
+ status.dwCheckPoint = 1;
+ status.dwWaitHint = 2000;
+
+ /* SetServiceStatus() should be called within 80 seconds */
+
+ if (SetServiceStatus(service, &status) == 0) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+ "SetServiceStatus() failed");
+ return;
+ }
+
+ /* init */
+
+ status.dwCurrentState = SERVICE_RUNNING;
+ status.dwCheckPoint = 0;
+ status.dwWaitHint = 0;
+
+ if (SetServiceStatus(service, &status) == 0) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+ "SetServiceStatus() failed");
+ return;
+ }
+
+ /* call master or worker loop */
+
+ /*
+ * master should use event notification and look status
+ * single should use iocp to get notifications from service handler
+ */
+
+}
+
+
+u_int service_handler(u_int control, u_int type, void *data, void *ctx)
+{
+ /* primary thread */
+
+ switch(control) {
+
+ case SERVICE_CONTROL_INTERROGATE:
+ status = NGX_IOCP_INTERROGATE;
+ break;
+
+ case SERVICE_CONTROL_STOP:
+ status = NGX_IOCP_STOP;
+ break;
+
+ case SERVICE_CONTROL_PARAMCHANGE:
+ status = NGX_IOCP_RECONFIGURE;
+ break;
+
+ case NGX_SERVICE_CONTROL_SHUTDOWN:
+ status = NGX_IOCP_REOPEN;
+ break;
+
+ case NGX_SERVICE_CONTROL_REOPEN:
+ status = NGX_IOCP_REOPEN;
+ break;
+
+ default:
+ return ERROR_CALL_NOT_IMPLEMENTED;
+ }
+
+ if (ngx_single) {
+ if (PostQueuedCompletionStatus(iocp, ... status, ...) == 0) {
+ err = ngx_errno;
+ ngx_log_error(NGX_LOG_ALERT, log, err,
+ "PostQueuedCompletionStatus() failed");
+ return err;
+ }
+
+ } else {
+ Event
+ }
+
+ return NO_ERROR;
+}