nginx源码解析-ngx_get_options()
/*
* 解析者 : wenpeng_lu
* 时间 :2017/4/8
* 功能 : 获取命令行参数
* 参数 : main()传递过来的参数
* 返回值 : NGX_OK(0) 成功
* NGX_ERROR(-1) 失败
*/
static ngx_int_t
ngx_get_options(int argc, char *const *argv)
{
u_char *p;
ngx_int_t i;
// 命令行参数解析
for (i = 1; i < argc; i++)
{
p = (u_char *) argv[i];
if (*p++ != '-')
{
ngx_log_stderr(0, "invalid option: \"%s\"", argv[i]);
return NGX_ERROR;
}
while (*p)
{
// 注意*p++
switch (*p++)
{
case '?':
case 'h':
ngx_show_version = 1;
ngx_show_help = 1;
break;
case 'v':
ngx_show_version = 1;
break;
case 'V':
ngx_show_version = 1;
ngx_show_configure = 1;
break;
case 't':
ngx_test_config = 1;
break;
case 'T':
ngx_test_config = 1;
ngx_dump_config = 1;
break;
case 'q':
// 在测试配置阶段不输出信息
ngx_quiet_mode = 1;
break;
case 'p':
// 安装路径
if (*p)
{
// 形如-p/usr/local/nginx/
ngx_prefix = p;
goto next;
}
if (argv[++i])
{
// 形如-p /usr/local/nginx/
ngx_prefix = (u_char *) argv[i];
goto next;
}
// 错误信息显示到控制台
ngx_log_stderr(0, "option \"-p\" requires directory name");
return NGX_ERROR;
case 'c':
// 配置文件路径(相对于安装路径)
if (*p)
{
// 形如-c/conf/nginx.conf
ngx_conf_file = p;
goto next;
}
if (argv[++i])
{
// 形如-c /conf/nginx.conf
ngx_conf_file = (u_char *) argv[i];
goto next;
}
ngx_log_stderr(0, "option \"-c\" requires file name");
return NGX_ERROR;
case 'g':
/*
* 另行指定全局配置项的启动方式
* -g参数的约束条件是指定的配置项不能与默认路径下的nginx.conf中的配置项相冲突,否则无法启动
* 另一个约束条件是, 以-g方式启动的Nginx服务执行其他命令行时,需要把-g参数也带上,否则可能出现配置项不匹配的情形
*/
if (*p)
{
// 形如-gpid/var/nginx/test.pid;
ngx_conf_params = p;
goto next;
}
if (argv[++i])
{
// 形如-g pid/var/nginx/test.pid;
ngx_conf_params = (u_char *) argv[i];
goto next;
}
ngx_log_stderr(0, "option \"-g\" requires parameter");
return NGX_ERROR;
case 's':
// 发送信号给管理进程
if (*p)
{
// 形如-sstop
ngx_signal = (char *) p;
}
else if (argv[++i])
{
// 形如-s stop
ngx_signal = argv[i];
}
else
{
// 显示到控制台
ngx_log_stderr(0, "option \"-s\" requires parameter");
return NGX_ERROR;
}
if (ngx_strcmp(ngx_signal, "stop") == 0
|| ngx_strcmp(ngx_signal, "quit") == 0
|| ngx_strcmp(ngx_signal, "reopen") == 0
|| ngx_strcmp(ngx_signal, "reload") == 0)
{
// 设置信号
ngx_process = NGX_PROCESS_SIGNALLER;
goto next;
}
// 无效的信号
ngx_log_stderr(0, "invalid option: \"-s %s\"", ngx_signal);
return NGX_ERROR;
default:
ngx_log_stderr(0, "invalid option: \"%c\"", *(p - 1));
return NGX_ERROR;
}
}
next:
continue;
}
return NGX_OK;
}