上一篇讲的ngx_conf_read_token用于从配置文件内容中提取token,通常在一个配置行结束或者一个配置块开始时返回。
提取了这些token后,我们还需要找到对应的选项并且进行赋值,这就是ngx_conf_parse的作用。
/* core/ngx_conf_file.c */
/* The ten fixed arguments */
static int argument_number[] = {
NGX_CONF_NOARGS,
NGX_CONF_TAKE1,
NGX_CONF_TAKE2,
NGX_CONF_TAKE3,
NGX_CONF_TAKE4,
NGX_CONF_TAKE5,
NGX_CONF_TAKE6,
NGX_CONF_TAKE7
};
char *ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename)
{
int m, rc, found, valid;
char *rv;
void *conf, **confp;
ngx_fd_t fd;
ngx_str_t *name;
ngx_conf_file_t *prev;
ngx_command_t *cmd;
#if (NGX_SUPPRESS_WARN)
fd = NGX_INVALID_FILE;
prev = NULL;
#endif
if (filename) {
// 以只读模式打开配置文件
fd = ngx_open_file(filename->data, NGX_FILE_RDONLY, NGX_FILE_OPEN);
if (fd == NGX_INVALID_FILE) {
// 如果打开失败, 直接返回NGX_CONF_ERROR
ngx_log_error(NGX_LOG_EMERG, cf->log, ngx_errno,
ngx_open_file_n " %s failed", filename->data);
return NGX_CONF_ERROR;
}
// prev用来保存当前cf的conf_file指针
prev = cf->conf_file;
// 从内存池cf->pool申请一块ngx_conf_file_t大小的内存空间, 并使cf->conf_file指向它
if (!(cf->conf_file = ngx_palloc(cf->pool, sizeof(ngx_conf_file_t)))) {
return NGX_CONF_ERROR;
}
// ngx_fd_info宏就是调用fstat从文件描述符获取文件状态
// 这里就是获取配置文件的文件状态, 并保存在cf->conf_file->file.info中
if (ngx_fd_info(fd, &cf->conf_file->file.info) == -1) {
ngx_log_error(NGX_LOG_EMERG, cf->log, ngx_errno,
ngx_fd_info_n " %s failed", filename->data);
}
// 从内存池cf->pool中申请一块大小为1024字节的内存空间, 用来作为cf->conf_file的缓冲区,
// 接下来配置文件的内容就会读取至该缓冲区, 这也意味着每次我们最多只能从配置文件中读取1024字节的内容
if (!(cf->conf_file->buffer = ngx_create_temp_buf(cf->pool, 1024))) {
return NGX_CONF_ERROR;
}
cf->conf_file->file.fd = fd;
cf->conf_file->file.name.le