| |
| |
| /* 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; |
| } |