基础结构
typedef struct {
size_t n;
glob_t pglob;
u_char *pattern;
ngx_log_t *log;
ngx_uint_t test;
} ngx_glob_t;
基本函数
ngx_int_t
ngx_open_glob(ngx_glob_t *gl)
{
int n;
n = glob((char *) gl->pattern, GLOB_NOSORT, NULL, &gl->pglob);
if (n == 0) {
return NGX_OK;
}
#ifdef GLOB_NOMATCH
if (n == GLOB_NOMATCH && gl->test) {
return NGX_OK;
}
#endif
return NGX_ERROR;
}
ngx_int_t
ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name)
{
size_t count;
#ifdef GLOB_NOMATCH
count = (size_t) gl->pglob.gl_pathc;
#else
count = (size_t) gl->pglob.gl_matchc;
#endif
if (gl->n < count) {
name->len = (size_t) ngx_strlen(gl->pglob.gl_pathv[gl->n]);
name->data = (u_char *) gl->pglob.gl_pathv[gl->n];
gl->n++;
return NGX_OK;
}
return NGX_DONE;
}
void
ngx_close_glob(ngx_glob_t *gl)
{
globfree(&gl->pglob);
}
使用方式:
gl.pattern = file.data;
gl.log = cf->log;
gl.test = 1;
//打开glob
if (ngx_open_glob(&gl) != NGX_OK) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,
ngx_open_glob_n " \"%s\" failed", file.data);
return NGX_CONF_ERROR;
}
rv = NGX_CONF_OK;
for ( ;; ) {
n = ngx_read_glob(&gl, &name); //读取glob
if (n != NGX_OK) {
break;
}
file.len = name.len++;
file.data = ngx_pstrdup(cf->pool, &name);
ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data);
rv = ngx_conf_parse(cf, &file);//解析glob
if (rv != NGX_CONF_OK) {
break;
}
}
ngx_close_glob(&gl); //关闭glob