blob: 26ad4e8a3b42607e23a2b8d3d704d5df3dbceb75 [file] [log] [blame] [raw]
/* NOTE : you will find other conf_set functions in the following files :
*
* complex_value.c
* encoding.c
* path.c
*
*/
char *
ndk_conf_set_true_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *p = conf;
ngx_flag_t *fp;
ngx_conf_post_t *post;
fp = (ngx_flag_t*) (p + cmd->offset);
if (*fp != NGX_CONF_UNSET) {
return "is duplicate";
}
*fp = 1;
if (cmd->post) {
post = cmd->post;
return post->post_handler (cf, post, fp);
}
return NGX_CONF_OK;
}
char *
ndk_conf_set_false_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *p = conf;
ngx_flag_t *fp;
ngx_conf_post_t *post;
fp = (ngx_flag_t*) (p + cmd->offset);
if (*fp != NGX_CONF_UNSET) {
return "is duplicate";
}
*fp = 0;
if (cmd->post) {
post = cmd->post;
return post->post_handler (cf, post, fp);
}
return NGX_CONF_OK;
}
char *
ndk_conf_set_ptr_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *p = conf;
void **ptr;
ptr = (void**) (p + cmd->offset);
if (*ptr != NGX_CONF_UNSET_PTR) {
return "is duplicate";
}
*ptr = cmd->post;
return NGX_CONF_OK;
}
char *
ndk_conf_set_null_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *p = conf;
void **pp;
ngx_conf_post_t *post;
pp = (void **) (p + cmd->offset);
if (*pp != NGX_CONF_UNSET_PTR) {
return "is duplicate";
}
*pp = NULL;
if (cmd->post) {
post = cmd->post;
return post->post_handler (cf, post, pp);
}
return NGX_CONF_OK;
}
char *
ndk_conf_set_num64_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *p = conf;
int64_t *np;
ngx_str_t *value;
ngx_conf_post_t *post;
np = (int64_t *) (p + cmd->offset);
if (*np != NGX_CONF_UNSET) {
return "is duplicate";
}
value = cf->args->elts;
*np = ndk_atoi64 (value[1].data, value[1].len);
if (*np == NGX_ERROR) {
return "invalid number";
}
if (cmd->post) {
post = cmd->post;
return post->post_handler(cf, post, np);
}
return NGX_CONF_OK;
}
char *
ndk_conf_set_str_array_multi_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *p = conf;
ngx_str_t *value, *s;
ngx_array_t **a;
ngx_conf_post_t *post;
ngx_uint_t i;
a = (ngx_array_t **) (p + cmd->offset);
if (*a == NGX_CONF_UNSET_PTR) {
*a = ngx_array_create(cf->pool, 4, sizeof(ngx_str_t));
if (*a == NULL) {
return NGX_CONF_ERROR;
}
}
s = NULL;
for (i=cf->args->nelts-1; i; i--) {
s = ngx_array_push(*a);
if (s == NULL) {
return NGX_CONF_ERROR;
}
value = cf->args->elts;
*s = value[i];
}
if (cmd->post) {
post = cmd->post;
return post->post_handler(cf, post, s);
}
return NGX_CONF_OK;
}
char *
ndk_conf_set_keyval1_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *p = conf;
ngx_str_t *value;
ngx_keyval_t *kv;
ngx_conf_post_t *post;
kv = (ngx_keyval_t *) (p + cmd->offset);
if (kv->key.data)
return "is duplicate";
value = cf->args->elts;
kv->key = value[1];
kv->value = value[2];
if (cmd->post) {
post = cmd->post;
return post->post_handler (cf, post, kv);
}
return NGX_CONF_OK;
}
char *
ndk_conf_set_num_flag_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *p = conf;
ngx_int_t *np;
ngx_str_t *value;
ngx_conf_post_t *post;
np = (ngx_int_t *) (p + cmd->offset);
if (*np != NGX_CONF_UNSET) {
return "is duplicate";
}
value = cf->args->elts;
if (ngx_strcasecmp (value[1].data, (u_char *) "on") == 0) {
*np = NDK_CONF_SET_TRUE;
} else if (ngx_strcasecmp (value[1].data, (u_char *) "off") == 0) {
*np = NDK_CONF_SET_FALSE;
} else {
*np = ngx_atoi (value[1].data, value[1].len);
if (*np == NGX_ERROR) {
return "invalid number and not 'on'/'off'";
}
}
if (cmd->post) {
post = cmd->post;
return post->post_handler (cf, post, np);
}
return NGX_CONF_OK;
}
char *
ndk_conf_set_sec_flag_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *p = conf;
time_t *tp;
ngx_str_t *value;
ngx_conf_post_t *post;
tp = (time_t *) (p + cmd->offset);
if (*tp != NGX_CONF_UNSET) {
return "is duplicate";
}
value = cf->args->elts;
if (ngx_strcasecmp (value[1].data, (u_char *) "on") == 0) {
*tp = NDK_CONF_SET_TRUE;
} else if (ngx_strcasecmp (value[1].data, (u_char *) "off") == 0) {
*tp = NDK_CONF_SET_FALSE;
} else {
*tp = ngx_parse_time (&value[1], 1);
if (*tp == NGX_ERROR) {
return "has an invalid time and not 'on'/'off'";
}
}
if (cmd->post) {
post = cmd->post;
return post->post_handler (cf, post, tp);
}
return NGX_CONF_OK;
}
ngx_http_conf_ctx_t *
ndk_conf_create_http_location (ngx_conf_t *cf)
{
ngx_http_conf_ctx_t *ctx, *pctx;
void *mconf;
ngx_http_core_loc_conf_t *clcf, *pclcf;
ngx_uint_t i;
ngx_http_module_t *module;
ndk_pcallocp_rce (ctx, cf->pool);
pctx = cf->ctx;
ctx->main_conf = pctx->main_conf;
ctx->srv_conf = pctx->srv_conf;
ndk_pcalloc_rce (ctx->loc_conf, cf->pool, sizeof(void *) * ngx_http_max_module);
for (i = 0; ngx_modules[i]; i++) {
if (ngx_modules[i]->type != NGX_HTTP_MODULE) {
continue;
}
module = ngx_modules[i]->ctx;
if (module->create_loc_conf) {
mconf = module->create_loc_conf(cf);
if (mconf == NULL) {
return NGX_CONF_ERROR;
}
ctx->loc_conf[ngx_modules[i]->ctx_index] = mconf;
}
}
pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index];
clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];
clcf->loc_conf = ctx->loc_conf;
clcf->name = pclcf->name;
clcf->noname = 1;
if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) {
return NGX_CONF_ERROR;
}
return ctx;
}
ngx_http_conf_ctx_t *
ngx_conf_create_http_named_location (ngx_conf_t *cf, ngx_str_t *name)
{
ngx_http_conf_ctx_t *ctx;
ngx_http_core_loc_conf_t *clcf;
ctx = ndk_conf_create_http_location (cf);
if (ctx == NGX_CONF_ERROR)
return NGX_CONF_ERROR;
clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];
// in case the developer forgets to add '@' at the beginning of the named location
if (name->data[0] != '@' && ndk_catstrf (cf->pool, name, "sS", "@", name) == NULL)
return NGX_CONF_ERROR;
clcf->name = *name; // TODO : copy?
clcf->noname = 0;
clcf->named = 1;
return ctx;
}
ngx_int_t
ndk_replace_command (ngx_command_t *new_cmd, ngx_uint_t module_type)
{
ngx_uint_t i;
ngx_command_t *cmd;
for (i = 0; ngx_modules[i]; i++) {
if (ngx_modules[i]->type != module_type)
continue;
cmd = ngx_modules[i]->commands;
if (cmd == NULL) {
continue;
}
for ( /* void */ ; cmd->name.len; cmd++) {
if (ndk_cmpstr (&new_cmd->name, &cmd->name) == 0) {
ndk_memcpyp (cmd, new_cmd);
return NGX_OK;
}
}
}
return NGX_DECLINED;
}