diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/ngx_conf_file.c | 54 | ||||
| -rw-r--r-- | src/core/ngx_conf_file.h | 12 | ||||
| -rw-r--r-- | src/core/ngx_hunk.h | 6 |
3 files changed, 72 insertions, 0 deletions
diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c index 249f10fba..c26aa1774 100644 --- a/src/core/ngx_conf_file.c +++ b/src/core/ngx_conf_file.c @@ -859,6 +859,60 @@ char *ngx_conf_set_sec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) } +char *ngx_conf_set_bufs_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *p = conf; + + int len, scale; + char last; + ngx_str_t *value; + ngx_bufs_t *bufs; + + + bufs = (ngx_bufs_t *) (p + cmd->offset); + + if (bufs->num) { + return "is duplicate"; + } + + value = (ngx_str_t *) cf->args->elts; + + bufs->num = ngx_atoi(value[1].data, value[1].len); + if (bufs->num == NGX_ERROR || bufs->num == 0) { + return "invalid value"; + } + + len = value[2].len; + last = value[2].data[len - 1]; + + switch (last) { + case 'K': + case 'k': + len--; + scale = 1024; + break; + + case 'M': + case 'm': + len--; + scale = 1024 * 1024; + break; + + default: + scale = 1; + } + + bufs->size = ngx_atoi(value[2].data, len); + if (bufs->size == NGX_ERROR || bufs->size == 0) { + return "invalid value"; + } + + bufs->size *= scale; + + return NGX_CONF_OK; +} + + char *ngx_conf_unsupported(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { return "unsupported on this platform"; diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h index f47b7f71c..3164c6c92 100644 --- a/src/core/ngx_conf_file.h +++ b/src/core/ngx_conf_file.h @@ -175,6 +175,17 @@ struct ngx_conf_s { } \ } +#define ngx_conf_merge_bufs_value(conf, prev, default_num, default_size) \ + if (conf.num == 0) { \ + if (prev.num) { \ + conf.num = prev.num; \ + conf.size = prev.size; \ + } else { \ + conf.num = default_num; \ + conf.size = default_size; \ + } \ + } + #define addressof(addr) ((int) &addr) @@ -193,6 +204,7 @@ char *ngx_conf_set_num_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); char *ngx_conf_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); char *ngx_conf_set_time_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); +char *ngx_conf_set_bufs_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); char *ngx_conf_set_core_flag_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); diff --git a/src/core/ngx_hunk.h b/src/core/ngx_hunk.h index fbaad5ee1..0d03164fc 100644 --- a/src/core/ngx_hunk.h +++ b/src/core/ngx_hunk.h @@ -64,6 +64,12 @@ struct ngx_chain_s { }; +typedef struct { + int num; + ssize_t size; +} ngx_bufs_t; + + #define NGX_CHAIN_ERROR (ngx_chain_t *) NGX_ERROR |
