diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/nginx.c | 55 | ||||
-rw-r--r-- | src/core/ngx_cycle.c | 5 | ||||
-rw-r--r-- | src/core/ngx_cycle.h | 2 | ||||
-rw-r--r-- | src/event/ngx_event.c | 35 |
4 files changed, 88 insertions, 9 deletions
diff --git a/src/core/nginx.c b/src/core/nginx.c index fe78ab4e6..34f204f43 100644 --- a/src/core/nginx.c +++ b/src/core/nginx.c @@ -19,6 +19,7 @@ typedef struct { typedef struct { ngx_file_t pid; char *name; + int argc; char *const *argv; } ngx_master_ctx_t; @@ -28,6 +29,7 @@ static void ngx_master_exit(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx); 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 ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv); +static ngx_int_t ngx_getopt(ngx_master_ctx_t *ctx, ngx_cycle_t *cycle); static ngx_int_t ngx_core_module_init(ngx_cycle_t *cycle); static char *ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); @@ -57,6 +59,13 @@ static ngx_command_t ngx_core_commands[] = { offsetof(ngx_core_conf_t, master), NULL }, + { ngx_string("pid"), + NGX_MAIN_CONF|NGX_CONF_TAKE1, + ngx_conf_set_core_str_slot, + 0, + offsetof(ngx_core_conf_t, pid), + NULL }, + { ngx_string("worker_reopen"), NGX_MAIN_CONF|NGX_CONF_TAKE1, ngx_conf_set_core_flag_slot, @@ -125,12 +134,20 @@ int main(int argc, char *const *argv, char **envp) log = ngx_log_init_errlog(); ngx_pid = ngx_getpid(); - /* init_cycle->log is required for signal handlers */ + /* init_cycle->log is required for signal handlers and ngx_getopt() */ ngx_memzero(&init_cycle, sizeof(ngx_cycle_t)); init_cycle.log = log; ngx_cycle = &init_cycle; + ngx_memzero(&ctx, sizeof(ngx_master_ctx_t)); + ctx.argc = argc; + ctx.argv = argv; + + if (ngx_getopt(&ctx, &init_cycle) == NGX_ERROR) { + return 1; + } + if (ngx_os_init(log) == NGX_ERROR) { return 1; } @@ -213,8 +230,6 @@ int main(int argc, char *const *argv, char **envp) #endif - ctx.argv = argv; - ngx_master_process_cycle(cycle, &ctx); return 0; @@ -745,6 +760,40 @@ static ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv) } +static ngx_int_t ngx_getopt(ngx_master_ctx_t *ctx, ngx_cycle_t *cycle) +{ + ngx_int_t i; + + for (i = 1; i < ctx->argc; i++) { + if (ctx->argv[i][0] != '-') { + ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, + "invalid option: \"%s\"", ctx->argv[i]); + return NGX_ERROR; + } + + switch (ctx->argv[i][1]) { + + case 'c': + cycle->conf_file.data = ctx->argv[++i]; + cycle->conf_file.len = ngx_strlen(cycle->conf_file.data); + break; + + default: + ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, + "invalid option: \"%s\"", ctx->argv[i]); + return NGX_ERROR; + } + } + + if (cycle->conf_file.len == NULL) { + cycle->conf_file.len = sizeof(NGINX_CONF) - 1; + cycle->conf_file.data = NGINX_CONF; + } + + return NGX_OK; +} + + static ngx_int_t ngx_core_module_init(ngx_cycle_t *cycle) { ngx_core_conf_t *ccf; diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c index 845099814..f80271d24 100644 --- a/src/core/ngx_cycle.c +++ b/src/core/ngx_cycle.c @@ -46,6 +46,7 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle) cycle->pool = pool; cycle->old_cycle = old_cycle; + cycle->conf_file = old_cycle->conf_file; n = old_cycle->pathes.nelts ? old_cycle->pathes.nelts : 10; @@ -117,10 +118,8 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle) conf.module_type = NGX_CORE_MODULE; conf.cmd_type = NGX_MAIN_CONF; - conf_file.len = sizeof(NGINX_CONF) - 1; - conf_file.data = NGINX_CONF; - if (ngx_conf_parse(&conf, &conf_file) != NGX_CONF_OK) { + if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) { ngx_destroy_pool(pool); return NULL; } diff --git a/src/core/ngx_cycle.h b/src/core/ngx_cycle.h index ef311a8f9..d9f1a607b 100644 --- a/src/core/ngx_cycle.h +++ b/src/core/ngx_cycle.h @@ -21,7 +21,7 @@ struct ngx_cycle_s { ngx_cycle_t *old_cycle; - unsigned one_process:1; + ngx_str_t conf_file; }; diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index 704492468..c2d24e55b 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -369,7 +369,7 @@ static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_event_conf_t *ecf = conf; - int m; + ngx_int_t m; ngx_str_t *value; ngx_event_conf_t *old_ecf; ngx_event_module_t *module; @@ -465,7 +465,7 @@ static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf) ngx_conf_init_value(ecf->use, ngx_epoll_module.ctx_index); ngx_conf_init_ptr_value(ecf->name, ngx_epoll_module_ctx.name->data); -#else /* HAVE_SELECT */ +#elif (HAVE_SELECT) ngx_conf_init_value(ecf->connections, FD_SETSIZE < DEFAULT_CONNECTIONS ? FD_SETSIZE : DEFAULT_CONNECTIONS); @@ -473,6 +473,37 @@ static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf) ngx_conf_init_value(ecf->use, ngx_select_module.ctx_index); ngx_conf_init_ptr_value(ecf->name, ngx_select_module_ctx.name->data); +#else + + ngx_int_t i, m; + ngx_event_module_t *module; + + m = -1; + module = NULL; + + for (i = 0; ngx_modules[i]; i++) { + if (ngx_modules[i]->type == NGX_EVENT_MODULE) { + module = ngx_modules[i]->ctx; + + if (ngx_strcmp(module->name->data, event_core_name.data) == 0) { + continue; + } + + m = ngx_modules[i]->ctx_index; + break; + } + } + + if (m == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "no events module found"); + return NGX_CONF_ERROR; + } + + ngx_conf_init_value(ecf->connections, DEFAULT_CONNECTIONS); + + ngx_conf_init_value(ecf->use, m); + ngx_conf_init_ptr_value(ecf->name, module->name->data); + #endif cycle->connection_n = ecf->connections; |