diff options
Diffstat (limited to 'src/core/ngx_conf_file.c')
-rw-r--r-- | src/core/ngx_conf_file.c | 78 |
1 files changed, 72 insertions, 6 deletions
diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c index 12537bd63..45533be75 100644 --- a/src/core/ngx_conf_file.c +++ b/src/core/ngx_conf_file.c @@ -432,16 +432,34 @@ char *ngx_conf_set_str_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf) char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf) { - int size; + int size, len, scale; + char last; ngx_str_t *value; value = (ngx_str_t *) cf->args->elts; - size = atoi(value[1].data); - if (size < 0) { + len = value[1].len; + last = value[1].data[len - 1]; + + if (last == 'K' || last == 'k') { + len--; + scale = 1024; + + } else if (last == 'M' || last == 'm') { + len--; + scale = 1024 * 1024; + + } else { + scale = 1; + } + + size = ngx_atoi(value[1].data, len); + if (size == NGX_ERROR) { return "value must be greater or equal to zero"; } + size *= scale; + *(int *) (conf + cmd->offset) = size; return NGX_CONF_OK; @@ -450,17 +468,65 @@ char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf) char *ngx_conf_set_time_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf) { - int size; + int size, len, scale; + char last; ngx_str_t *value; value = (ngx_str_t *) cf->args->elts; - size = atoi(value[1].data); + len = value[1].len; + last = value[1].data[len - 1]; + + if (last == 'm') { + len--; + scale = 1000 * 60; + + } else if (last == 'h') { + len--; + scale = 1000 * 60 * 60; + + } else if (last == 'd') { + len--; + scale = 1000 * 60 * 60 * 24; + + } else if (last == 'w') { + len--; + scale = 1000 * 60 * 60 * 24 * 7; + +#if 0 /* overflow */ + + } else if (last == 'M') { + len--; + scale = 1000 * 60 * 60 * 24 * 30; + + } else if (last == 'y') { + len--; + scale = 1000 * 60 * 60 * 24 * 365; + +#endif + + } else if (last == 's') { + len--; + if (value[1].data[len - 1] == 'm') { + len--; + scale = 1; + + } else { + scale = 1000; + } + + } else { + scale = 1000; + } + + size = ngx_atoi(value[1].data, len); if (size < 0) { return "value must be greater or equal to zero"; } - *(int *) (conf + cmd->offset) = size * 1000; + size *= scale; + + *(int *) (conf + cmd->offset) = size; return NGX_CONF_OK; } |