Mercurial > hg > nginx
diff src/core/nginx.c @ 2758:77264e0157ad
-p and --prefix=
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 27 Apr 2009 11:32:33 +0000 |
parents | a65976a205a5 |
children | caa4f7dcf1e3 |
line wrap: on
line diff
--- a/src/core/nginx.c Mon Apr 27 11:20:55 2009 +0000 +++ b/src/core/nginx.c Mon Apr 27 11:32:33 2009 +0000 @@ -11,7 +11,7 @@ static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle); static ngx_int_t ngx_get_options(int argc, char *const *argv); -static void ngx_process_options(ngx_cycle_t *cycle); +static ngx_int_t ngx_process_options(ngx_cycle_t *cycle); static ngx_int_t ngx_save_argv(ngx_cycle_t *cycle, int argc, char *const *argv); static void *ngx_core_module_create_conf(ngx_cycle_t *cycle); static char *ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf); @@ -186,6 +186,7 @@ static ngx_uint_t ngx_show_help; static ngx_uint_t ngx_show_version; static ngx_uint_t ngx_show_configure; +static u_char *ngx_prefix; static u_char *ngx_conf_file; static u_char *ngx_conf_params; static char *ngx_signal; @@ -221,6 +222,12 @@ " -t : test configuration and exit" CRLF " -s signal : send signal to a master process: " "stop, quit, reopen, reload" CRLF +#ifdef NGX_PREFIX + " -p prefix : set prefix path (default: " + NGX_PREFIX ")" CRLF +#else + " -p prefix : set prefix path (default: NONE)" CRLF +#endif " -c filename : set configuration file (default: " NGX_CONF_PATH ")" CRLF " -g directives : set global directives out of configuration " @@ -254,7 +261,7 @@ ngx_pid = ngx_getpid(); - log = ngx_log_init(); + log = ngx_log_init(ngx_prefix); if (log == NULL) { return 1; } @@ -282,7 +289,9 @@ return 1; } - ngx_process_options(&init_cycle); + if (ngx_process_options(&init_cycle) != NGX_OK) { + return 1; + } if (ngx_os_init(log) != NGX_OK) { return 1; @@ -662,6 +671,20 @@ ngx_test_config = 1; break; + case 'p': + if (*p) { + ngx_prefix = p; + goto next; + } + + if (argv[++i]) { + ngx_prefix = (u_char *) argv[i]; + goto next; + } + + ngx_log_stderr(0, "option \"-p\" requires directory name"); + return NGX_ERROR; + case 'c': if (*p) { ngx_conf_file = p; @@ -771,9 +794,69 @@ } -static void +static ngx_int_t ngx_process_options(ngx_cycle_t *cycle) { + u_char *p; + size_t len; + + if (ngx_prefix) { + len = ngx_strlen(ngx_prefix); + p = ngx_prefix; + + if (!ngx_path_separator(*p)) { + p = ngx_pnalloc(cycle->pool, len + 1); + if (p == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(p, ngx_prefix, len); + p[len++] = '/'; + } + + cycle->conf_prefix.len = len; + cycle->conf_prefix.data = p; + cycle->prefix.len = len; + cycle->prefix.data = p; + + } else { + +#ifndef NGX_PREFIX + + p = ngx_pnalloc(cycle->pool, NGX_MAX_PATH); + if (p == NULL) { + return NGX_ERROR; + } + + if (ngx_getcwd(p, NGX_MAX_PATH) == 0) { + ngx_log_stderr(ngx_errno, "[emerg]: " ngx_getcwd_n " failed"); + return NGX_ERROR; + } + + len = ngx_strlen(p); + + p[len++] = '/'; + + cycle->conf_prefix.len = len; + cycle->conf_prefix.data = p; + cycle->prefix.len = len; + cycle->prefix.data = p; + +#else + +#ifdef NGX_CONF_PREFIX + cycle->conf_prefix.len = sizeof(NGX_CONF_PREFIX) - 1; + cycle->conf_prefix.data = (u_char *) NGX_CONF_PREFIX; +#else + cycle->conf_prefix.len = sizeof(NGX_PREFIX) - 1; + cycle->conf_prefix.data = (u_char *) NGX_PREFIX; +#endif + cycle->prefix.len = sizeof(NGX_PREFIX) - 1; + cycle->prefix.data = (u_char *) NGX_PREFIX; + +#endif + } + if (ngx_conf_file) { cycle->conf_file.len = ngx_strlen(ngx_conf_file); cycle->conf_file.data = ngx_conf_file; @@ -783,6 +866,21 @@ cycle->conf_file.data = (u_char *) NGX_CONF_PATH; } + if (ngx_conf_full_name(cycle, &cycle->conf_file, 0) != NGX_OK) { + return NGX_ERROR; + } + + for (p = cycle->conf_file.data + cycle->conf_file.len - 1; + p > cycle->conf_file.data; + p--) + { + if (ngx_path_separator(*p)) { + cycle->conf_prefix.len = p - ngx_cycle->conf_file.data + 1; + cycle->conf_prefix.data = ngx_cycle->conf_file.data; + break; + } + } + if (ngx_conf_params) { cycle->conf_param.len = ngx_strlen(ngx_conf_params); cycle->conf_param.data = ngx_conf_params; @@ -791,6 +889,8 @@ if (ngx_test_config) { cycle->log->log_level = NGX_LOG_INFO; } + + return NGX_OK; }