diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/nginx.c | 28 | ||||
-rw-r--r-- | src/core/ngx_alloc.h | 2 | ||||
-rw-r--r-- | src/core/ngx_array.c | 33 | ||||
-rw-r--r-- | src/core/ngx_array.h | 5 | ||||
-rw-r--r-- | src/core/ngx_conf_file.c | 158 | ||||
-rw-r--r-- | src/core/ngx_conf_file.h | 22 | ||||
-rw-r--r-- | src/core/ngx_connection.h | 8 | ||||
-rw-r--r-- | src/core/ngx_listen.h | 44 | ||||
-rw-r--r-- | src/core/ngx_string.h | 4 |
9 files changed, 163 insertions, 141 deletions
diff --git a/src/core/nginx.c b/src/core/nginx.c index 0a0233f49..ead14530a 100644 --- a/src/core/nginx.c +++ b/src/core/nginx.c @@ -36,7 +36,7 @@ ngx_pool_t *ngx_pool; int ngx_connection_counter; -ngx_array_t *ngx_listening_sockets; +ngx_array_t ngx_listening_sockets; int main(int argc, char *const *argv) @@ -56,9 +56,9 @@ int main(int argc, char *const *argv) ngx_init_sockets(&ngx_log); - /* TODO: read config */ + ngx_init_array(ngx_listening_sockets, ngx_pool, 10, sizeof(ngx_listen_t), + 1); -#if 1 ngx_memzero(&conf, sizeof(ngx_conf_t)); ngx_test_null(conf.args, ngx_create_array(ngx_pool, 10, sizeof(ngx_str_t)), 1); @@ -69,16 +69,16 @@ int main(int argc, char *const *argv) conf_file.len = sizeof("nginx.conf") - 1; conf_file.data = "nginx.conf"; - ngx_conf_parse(&conf, &conf_file); -#endif - - ngx_test_null(ngx_listening_sockets, - ngx_create_array(ngx_pool, 10, sizeof(ngx_listen_t)), 1); + if (ngx_conf_parse(&conf, &conf_file) != NGX_CONF_OK) { + exit(1); + } +#if 0 /* STUB */ /* TODO: init chain of global modules (like ngx_http.c), they would init its modules and ngx_listening_sockets */ ngx_http_init(ngx_pool, &ngx_log); +#endif ngx_open_listening_sockets(&ngx_log); @@ -86,7 +86,7 @@ int main(int argc, char *const *argv) /* TODO: fork */ - ngx_pre_thread(ngx_listening_sockets, ngx_pool, &ngx_log); + ngx_pre_thread(&ngx_listening_sockets, ngx_pool, &ngx_log); /* TODO: threads */ @@ -125,10 +125,10 @@ static void ngx_open_listening_sockets(ngx_log_t *log) failed = 0; /* for each listening socket */ - ls = (ngx_listen_t *) ngx_listening_sockets->elts; - for (i = 0; i < ngx_listening_sockets->nelts; i++) { + ls = (ngx_listen_t *) ngx_listening_sockets.elts; + for (i = 0; i < ngx_listening_sockets.nelts; i++) { - if (ls[i].done) + if (ls[i].bound) continue; if (ls[i].inherited) { @@ -137,7 +137,7 @@ static void ngx_open_listening_sockets(ngx_log_t *log) /* TODO: nonblocking */ /* TODO: deferred accept */ - ls[i].done = 1; + ls[i].bound = 1; continue; } @@ -194,7 +194,7 @@ static void ngx_open_listening_sockets(ngx_log_t *log) /* TODO: deferred accept */ ls[i].fd = s; - ls[i].done = 1; + ls[i].bound = 1; } if (!failed) diff --git a/src/core/ngx_alloc.h b/src/core/ngx_alloc.h index 1d1ad8425..7fef65b7c 100644 --- a/src/core/ngx_alloc.h +++ b/src/core/ngx_alloc.h @@ -10,7 +10,7 @@ #define NGX_MAX_ALLOC_FROM_POOL (8192 - sizeof(ngx_pool_t)) #define NGX_DEFAULT_POOL_SIZE (16 * 1024) -#define ngx_test_null(p, alloc, rc) if ((p = alloc) == NULL) return rc +#define ngx_test_null(p, alloc, rc) if ((p = alloc) == NULL) { return rc; } typedef struct ngx_pool_large_s ngx_pool_large_t; diff --git a/src/core/ngx_array.c b/src/core/ngx_array.c index 08ad5887b..0043929e9 100644 --- a/src/core/ngx_array.c +++ b/src/core/ngx_array.c @@ -2,19 +2,17 @@ #include <ngx_config.h> #include <ngx_alloc.h> +#include <ngx_string.h> #include <ngx_array.h> + ngx_array_t *ngx_create_array(ngx_pool_t *p, int n, size_t size) { ngx_array_t *a; - a = ngx_palloc(p, sizeof(ngx_array_t)); - if (a == NULL) - return NULL; + ngx_test_null(a, ngx_palloc(p, sizeof(ngx_array_t)), NULL); - a->elts = ngx_palloc(p, n * size); - if (a->elts == NULL) - return NULL; + ngx_test_null(a->elts, ngx_palloc(p, n * size), NULL); a->pool = p; a->nelts = 0; @@ -24,24 +22,31 @@ ngx_array_t *ngx_create_array(ngx_pool_t *p, int n, size_t size) return a; } + void ngx_destroy_array(ngx_array_t *a) { - ngx_pool_t *p = a->pool; + ngx_pool_t *p; + + p = a->pool; - if (a->elts + a->size * a->nalloc == p->last) + if (a->elts + a->size * a->nalloc == p->last) { p->last -= a->size * a->nalloc; + } - if ((char *) a + sizeof(ngx_array_t) == p->last) + if ((char *) a + sizeof(ngx_array_t) == p->last) { p->last = (char *) a; + } } + void *ngx_push_array(ngx_array_t *a) { - void *elt; + void *elt, *new; + ngx_pool_t *p; /* array is full */ if (a->nelts == a->nalloc) { - ngx_pool_t *p = a->pool; + p = a->pool; /* array allocation is the last in the pool */ if (a->elts + a->size * a->nelts == p->last @@ -52,11 +57,9 @@ void *ngx_push_array(ngx_array_t *a) /* allocate new array */ } else { - void *new = ngx_palloc(p, 2 * a->nalloc * a->size); - if (new == NULL) - return NULL; + ngx_test_null(new, ngx_palloc(p, 2 * a->nalloc * a->size), NULL); - memcpy(new, a->elts, a->nalloc * a->size); + ngx_memcpy(new, a->elts, a->nalloc * a->size); a->elts = new; a->nalloc *= 2; } diff --git a/src/core/ngx_array.h b/src/core/ngx_array.h index d110b7688..22c7c4b0f 100644 --- a/src/core/ngx_array.h +++ b/src/core/ngx_array.h @@ -20,4 +20,9 @@ void ngx_destroy_array(ngx_array_t *a); void *ngx_push_array(ngx_array_t *a); +#define ngx_init_array(a, p, n, s, rc) \ + ngx_test_null(a.elts, ngx_palloc(p, n * s), rc); \ + a.nelts = 0; a.size = s; a.nalloc = n; a.pool = p; + + #endif /* _NGX_ARRAY_H_INCLUDED_ */ diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c index 6b77121a4..70cb551dc 100644 --- a/src/core/ngx_conf_file.c +++ b/src/core/ngx_conf_file.c @@ -13,10 +13,11 @@ static int argument_number[] = { static int ngx_conf_read_token(ngx_conf_t *cf); -int ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename) +char *ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename) { - int rc, i; - char *error; + int i, rc, found; + char *rv; + void *conf, **pconf; ngx_str_t *name; ngx_fd_t fd; ngx_conf_file_t *prev; @@ -29,13 +30,13 @@ int ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename) ngx_log_error(NGX_LOG_EMERG, cf->log, ngx_errno, "ngx_conf_file: " ngx_open_file_n " %s failed", filename->data); - return NGX_ERROR; + return NGX_CONF_ERROR; } prev = cf->conf_file; ngx_test_null(cf->conf_file, ngx_palloc(cf->pool, sizeof(ngx_conf_file_t)), - NGX_ERROR); + NGX_CONF_ERROR); if (ngx_stat_fd(fd, &cf->conf_file->file.info) == -1) { ngx_log_error(NGX_LOG_EMERG, cf->log, ngx_errno, @@ -45,7 +46,7 @@ int ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename) ngx_test_null(cf->conf_file->hunk, ngx_create_temp_hunk(cf->pool, 1024, 0, 0), - NGX_ERROR); + NGX_CONF_ERROR); cf->conf_file->file.fd = fd; cf->conf_file->file.name.len = filename->len; @@ -59,22 +60,29 @@ int ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename) /* NGX_OK, NGX_ERROR, NGX_CONF_FILE_DONE, NGX_CONF_BLOCK_DONE */ - if (rc == NGX_ERROR || rc == NGX_CONF_FILE_DONE) { - return rc; +ngx_log_debug(cf->log, "token %d" _ rc); + + if (rc == NGX_ERROR) { + return NGX_CONF_ERROR; + } + + if (rc != NGX_OK) { + return NGX_CONF_OK; } if (cf->handler) { - if ((*cf->handler)(cf) == NGX_ERROR) { - return NGX_ERROR; + if ((*cf->handler)(cf) == NGX_CONF_ERROR) { + return NGX_CONF_ERROR; } continue; } name = (ngx_str_t *) cf->args->elts; + found = 0; - for (i = 0; ngx_modules[i]; i++) { + for (i = 0; !found && ngx_modules[i]; i++) { if (ngx_modules[i]->type != NULL && ngx_modules[i]->type != cf->type) { @@ -93,86 +101,56 @@ int ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename) ngx_log_debug(cf->log, "command '%s'" _ cmd->name.data); - cmd->set(cf, cmd, NULL); - } - - cmd++; - } - } - -#if 0 - cmd = ngx_conf_find_token(cf); - if (cmd == NULL) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "unknown directive \"%s\" in %s:%d", - cf->name, cf->file->name, cf->file->line); - return NGX_ERROR; - } - - if (cmd->type & argument_number[cf->args->nelts - 1]) { - error = cmd->set(cf, cmd->offset, cf->args); + if (!(cmd->type & argument_number[cf->args->nelts - 1])) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "invalid number arguments in " + "directive \"%s\" in %s:%d", + name->data, + cf->conf_file->file.name.data, + cf->conf_file->line); + return NGX_CONF_ERROR; + } - if (error) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "%s in directive \"%s\" in %s:%d", - error, cf->name, cf->file->name, cf->file->line); - return NGX_ERROR; - } - } -#endif + conf = NULL; + if (cf->ctx) { + pconf = *(void **) ((char *) cf->ctx + cmd->conf); -#if 0 - if (cmd->type == NGX_CONF_CONTAINER) { - ngx_conf_parse(cf, cmd->container, NULL); + if (pconf) { + conf = pconf[ngx_modules[i]->index]; + } + } - } else if (cmd->type == NGX_CONF_FLAG) { + rv = cmd->set(cf, cmd, conf); - if (cf->args->nelts != 1) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "invalid number of arguments " - "in directive \"%s\" in %s:%d", - cf->name, cf->file->name, cf->file->line); - return NGX_ERROR; - } +ngx_log_debug(cf->log, "rv: %d" _ rv); - if (ngx_strcasecmp(cf->args->elts[0], "on") == 0) { - flag = 1; + if (rv == NGX_CONF_OK) { + found = 1; + break; - } else if (ngx_strcasecmp(cf->args->elts[0], "off") == 0) { - flag = 0; + } else if (rv == NGX_CONF_ERROR) { + return NGX_CONF_ERROR; - } else { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "invalid flag in directive \"%s\" in %s:%d", - cf->name, cf->file->name, cf->file->line); - return NGX_ERROR; - } - - rv = cmd->set(cf, cmd->offset, flag); - if (rv) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "%s in directive \"%s\" in %s:%d", - rv, cf->name, cf->file->name, cf->file->line); - return NGX_ERROR; - } + } else { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "%s", rv); + return NGX_CONF_ERROR; + } + } - } else if (cmd->type & argument_number[args->nelts]) { - rv = cmd->set(cf, cmd->offset, cf->args); - if (rv) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "%s in directive \"%s\" in %s:%d", - rv, cf->name, cf->file->name, cf->file->line); - return NGX_ERROR; + cmd++; } + } - } else { + if (!found) { ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "invalid number of arguments " - "in directive \"%s\" in %s:%d", - cf->name, cf->file->name, cf->file->line); - return NGX_ERROR; + "unknown directive \"%s\" in %s:%d", + name->data, + cf->conf_file->file.name.data, + cf->conf_file->line); + + return NGX_CONF_ERROR; } -#endif } if (filename) { @@ -182,11 +160,11 @@ ngx_log_debug(cf->log, "command '%s'" _ cmd->name.data); ngx_log_error(NGX_LOG_ERR, cf->log, ngx_errno, ngx_close_file_n " %s failed", cf->conf_file->file.name.data); - return NGX_ERROR; + return NGX_CONF_ERROR; } } - return NGX_OK; + return NGX_CONF_OK; } @@ -391,6 +369,20 @@ ngx_log_debug(cf->log, "FOUND %d:'%s'" _ word->len _ word->data); } +char *ngx_conf_set_str_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf) +{ + ngx_str_t *field, *value; + + field = (ngx_str_t *) conf + cmd->offset; + value = (ngx_str_t *) cf->args->elts; + + field->len = value->len; + field->data = value->data; + + return NGX_CONF_OK; +} + + char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf) { int size; @@ -405,7 +397,7 @@ char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf) *(int *) (conf + cmd->offset) = size; - return NULL; + return NGX_CONF_OK; } @@ -423,5 +415,5 @@ char *ngx_conf_set_time_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf) *(int *) (conf + cmd->offset) = size; - return NULL; + return NGX_CONF_OK; } diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h index cab61a351..77f6b4086 100644 --- a/src/core/ngx_conf_file.h +++ b/src/core/ngx_conf_file.h @@ -15,15 +15,16 @@ #define NGX_CONF_NOARGS 1 #define NGX_CONF_TAKE1 2 #define NGX_CONF_TAKE2 4 -#define NGX_CONF_ARGS_NUMBER 0x0ffff -#define NGX_CONF_ANY 0x10000 -#define NGX_CONF_BLOCK 0x20000 +#define NGX_CONF_ARGS_NUMBER 0x00ffff +#define NGX_CONF_ANY 0x010000 +#define NGX_CONF_BLOCK 0x020000 #define NGX_CONF_UNSET -1 -#define NGX_CONF_ERROR (char *) -1 +#define NGX_CONF_OK NULL +#define NGX_CONF_ERROR (void *) -1 #define NGX_CONF_BLOCK_DONE 1 #define NGX_CONF_FILE_DONE 2 @@ -46,6 +47,7 @@ struct ngx_command_s { typedef struct { + int index; void *ctx; ngx_command_t *commands; int type; @@ -70,13 +72,21 @@ struct ngx_conf_s { void *ctx; int type; - int (*handler)(ngx_conf_t *cf); + char *(*handler)(ngx_conf_t *cf); }; -int ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename); +#define ngx_conf_merge(conf, prev, default) \ + if (conf == NGX_CONF_UNSET) { \ + conf = (prev == NGX_CONF_UNSET) ? default : prev; \ + } + +char *ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename); + + +char *ngx_conf_set_str_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf); char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf); char *ngx_conf_set_time_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf); diff --git a/src/core/ngx_connection.h b/src/core/ngx_connection.h index 1c19aa374..a94640d74 100644 --- a/src/core/ngx_connection.h +++ b/src/core/ngx_connection.h @@ -30,16 +30,18 @@ struct ngx_connection_s { off_t sent; - ngx_log_t *log; int (*handler)(ngx_connection_t *c); - ngx_server_t *server; + void *ctx; ngx_server_t *servers; + ngx_pool_t *pool; + ngx_log_t *log; int family; struct sockaddr *sockaddr; socklen_t socklen; - size_t addr; + int addr; + int addr_text_max_len; ngx_str_t addr_text; ngx_hunk_t *buffer; diff --git a/src/core/ngx_listen.h b/src/core/ngx_listen.h index cf4a2ad0f..91f39ad74 100644 --- a/src/core/ngx_listen.h +++ b/src/core/ngx_listen.h @@ -9,36 +9,44 @@ #include <ngx_connection.h> typedef struct { - ngx_socket_t fd; + ngx_socket_t fd; struct sockaddr *sockaddr; - socklen_t socklen; - size_t addr; + socklen_t socklen; /* size of sockaddr */ + int addr; /* offset to address in sockaddr */ + int addr_text_max_len; ngx_str_t addr_text; - int family; - int type; - int protocol; - int flags; + int family; + int type; + int protocol; + int flags; /* Winsock2 flags */ - ngx_log_t *log; - void *server; - int (*handler)(ngx_connection_t *c); + int (*handler)(ngx_connection_t *c); /* handler of accepted + connection */ + void *ctx; /* ngx_http_conf_ctx_t, for example */ + void *servers; /* array of ngx_http_in_addr_t, for example */ - int backlog; - time_t post_accept_timeout; + ngx_log_t *log; - unsigned done:1; - unsigned inherited:1; - unsigned nonblocking:1; + int backlog; + time_t post_accept_timeout; /* should be here because + of the deferred accept */ + + unsigned bound:1; /* already bound */ + unsigned inherited:1; /* inherited from previous process */ + unsigned nonblocking:1; #if 0 - unsigned overlapped:1; + unsigned overlapped:1; /* Winsock2 overlapped */ #endif - unsigned shared:1; /* shared between threads or processes */ + unsigned shared:1; /* shared between threads or processes */ #if (HAVE_DEFERRED_ACCEPT) - unsigned deferred_accept:1; + unsigned deferred_accept:1; #endif } ngx_listen_t; +extern ngx_array_t ngx_listening_sockets; + + #endif /* _NGX_LISTEN_H_INCLUDED_ */ diff --git a/src/core/ngx_string.h b/src/core/ngx_string.h index 9ee3e5e29..503ffad43 100644 --- a/src/core/ngx_string.h +++ b/src/core/ngx_string.h @@ -18,7 +18,8 @@ typedef struct { #define ngx_memzero ZeroMemory -#define strcasecmp stricmp +#define ngx_strcasecmp stricmp +#define ngx_strncmp strncmp #define ngx_strcmp strcmp #define ngx_snprintf _snprintf @@ -28,6 +29,7 @@ typedef struct { #define ngx_memzero bzero +#define ngx_strncmp strncmp #define ngx_strcmp strcmp #define ngx_snprintf snprintf |