nginx源码解析-ngx_get_options()

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值