aboutsummaryrefslogtreecommitdiff
path: root/src/core/nginx.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2002-08-20 14:48:28 +0000
committerIgor Sysoev <igor@sysoev.ru>2002-08-20 14:48:28 +0000
commit2b54238a5f2edcca568c0676a779ef79ba152c91 (patch)
tree2cb7eb660e691eaab2c4f031adf881b7c88bffc9 /src/core/nginx.c
parente0af1b89dcd100462a3195534b2f78a838ca85b5 (diff)
downloadnginx-2b54238a5f2edcca568c0676a779ef79ba152c91.tar.gz
nginx-2b54238a5f2edcca568c0676a779ef79ba152c91.zip
nginx-0.0.1-2002-08-20-18:48:28 import
Diffstat (limited to 'src/core/nginx.c')
-rw-r--r--src/core/nginx.c148
1 files changed, 102 insertions, 46 deletions
diff --git a/src/core/nginx.c b/src/core/nginx.c
index a90b21ed3..bf737827f 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -3,6 +3,8 @@
#include <ngx_config.h>
#include <ngx_string.h>
+#include <ngx_errno.h>
+#include <ngx_time.h>
#include <ngx_log.h>
#include <ngx_alloc.h>
#include <ngx_array.h>
@@ -16,80 +18,134 @@
/* */
+static void ngx_open_listening_sockets(ngx_log_t *log);
+
+/* STUB */
int ngx_max_conn = 512;
-ngx_pool_t ngx_pool;
-ngx_log_t ngx_log;
-ngx_server_t ngx_server;
+ngx_server_t ngx_server;
+/* */
+
+ngx_log_t ngx_log;
+ngx_pool_t *ngx_pool;
-ngx_array_t ngx_listening_sockets;
+ngx_array_t *ngx_listening_sockets;
int main(int argc, char *const *argv)
{
int i;
- ngx_socket_t s;
- ngx_listen_t *ls;
-
- int reuseaddr = 1;
+ /* STUB */
ngx_log.log_level = NGX_LOG_DEBUG;
- ngx_pool.log = &ngx_log;
+
+ ngx_pool = ngx_create_pool(16 * 1024, &ngx_log);
+ /* */
ngx_init_sockets(&ngx_log);
/* TODO: read config */
+ ngx_test_null(ngx_listening_sockets,
+ ngx_create_array(ngx_pool, 10, sizeof(ngx_listen_t)), 1);
+
/* STUB */
/* TODO: init chain of global modules (like ngx_http.c),
they would init its modules and ngx_listening_sockets */
- ngx_http_init();
-
- /* for each listening socket */
- ls = (ngx_listen_t *) ngx_listening_sockets.elts;
- for (i = 0; i < ngx_listening_sockets.nelts; i++) {
- s = socket(ls->family, ls->type, ls->protocol);
- if (s == -1)
- ngx_log_error(NGX_LOG_EMERG, &(ngx_log), ngx_socket_errno,
- "nginx: socket %s falied", ls->addr_text);
-
- if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
- (const void *) &reuseaddr, sizeof(int)) == -1)
- ngx_log_error(NGX_LOG_EMERG, &(ngx_log), ngx_socket_errno,
- "nginx: setsockopt (SO_REUSEADDR) %s failed",
- ls->addr_text);
-
- /* TODO: close on exit */
+ ngx_http_init(ngx_pool, &ngx_log);
- if (ngx_nonblocking(s) == -1)
- ngx_log_error(NGX_LOG_EMERG, &(ngx_log), ngx_socket_errno,
- ngx_nonblocking_n " %s failed", ls->addr_text);
-
- if (bind(s, (struct sockaddr *) ls->addr, ls->addr_len) == -1)
- ngx_log_error(NGX_LOG_EMERG, &(ngx_log), ngx_socket_errno,
- "bind to %s failed", ls->addr_text);
-
- if (listen(s, ls->backlog) == -1)
- ngx_log_error(NGX_LOG_EMERG, &(ngx_log), ngx_socket_errno,
- "listen to %s failed", ls->addr_text);
-
- /* TODO: deferred accept */
-
- ls->fd = s;
- ls->server = &ngx_http_server;
- ls->log = &ngx_log;
- }
+ ngx_open_listening_sockets(&ngx_log);
/* TODO: daemon */
/* TODO: fork */
- /* TODO: events: init ngx_connections and listen slots */
+ ngx_pre_thread(ngx_listening_sockets, ngx_pool, &ngx_log);
/* TODO: threads */
/* STUB */
- ngx_worker(&ls, 1, &ngx_pool, &ngx_log);
+ ngx_worker(&ngx_log);
+}
+
+static void ngx_open_listening_sockets(ngx_log_t *log)
+{
+ int times, failed, reuseaddr, i;
+ ngx_err_t err;
+ ngx_socket_t s;
+ ngx_listen_t *ls;
+
+ reuseaddr = 1;
+
+ for (times = 10; times; times--) {
+ failed = 0;
+
+ /* for each listening socket */
+ ls = (ngx_listen_t *) ngx_listening_sockets->elts;
+ for (i = 0; i < ngx_listening_sockets->nelts; i++) {
+ if (ls[i].done)
+ continue;
+
+#if (WIN32)
+ s = WSASocket(ls[i].family, ls[i].type, ls[i].protocol, NULL, 0, 0);
+#else
+ s = socket(ls[i].family, ls[i].type, ls[i].protocol);
+#endif
+ if (s == -1)
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
+ "nginx: socket %s falied", ls[i].addr_text);
+
+ if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
+ (const void *) &reuseaddr, sizeof(int)) == -1)
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
+ "nginx: setsockopt (SO_REUSEADDR) %s failed",
+ ls[i].addr_text);
+
+ /* TODO: close on exit */
+
+ if (ls[i].nonblocking) {
+ if (ngx_nonblocking(s) == -1)
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
+ ngx_nonblocking_n " %s failed",
+ ls[i].addr_text);
+ }
+
+ if (bind(s, (struct sockaddr *) ls[i].addr, ls[i].addr_len) == -1) {
+ err = ngx_socket_errno;
+ ngx_log_error(NGX_LOG_ALERT, log, err,
+ "bind to %s failed", ls[i].addr_text);
+
+ if (err != NGX_EADDRINUSE)
+ exit(1);
+
+ if (ngx_close_socket(s) == -1)
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
+ ngx_close_socket_n " %s failed",
+ ls[i].addr_text);
+
+ failed = 1;
+ continue;
+ }
+
+ if (listen(s, ls[i].backlog) == -1)
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
+ "listen to %s failed", ls[i].addr_text);
+
+ /* TODO: deferred accept */
+
+ ls[i].fd = s;
+ ls[i].done = 1;
+ }
+
+ if (!failed)
+ break;
+
+ ngx_log_error(NGX_LOG_NOTICE, log, 0, "try to bind again after 500ms");
+ ngx_msleep(500);
+ }
+
+ if (failed)
+ ngx_log_error(NGX_LOG_EMERG, log, 0, "can't bind");
}