nginx/src/core/ngx_config_command.c

281 lines
6.2 KiB
C
Raw Normal View History

2002-09-11 23:18:33 +08:00
#include <ngx_config.h>
#if 0
typedef struct ngx_conf_file_t {
ngx_fd_t fd;
char *name;
int line;
char *pos;
};
typedef struct ngx_conf_t {
char *name;
ngx_array_t *args;
ngx_conf_file_t *file;
ngx_log_t *log;
void *context; # ngx_http_conf_t
};
static int argument_number[] = {
NGX_CONF_NOARGS,
NGX_CONF_TAKE1,
NGX_CONF_TAKE2,
NGX_CONF_TAKE3
};
ngx_conf_parse(cf, container, filename)
{
create cf;
*conatiner(cf);
if (filename) {
open;
}
for ( ;; ) {
rc = ngx_conf_read_token(cf);
NGX_OK, NGX_ERROR, NGX_CONF_FILE_DONE, NGX_CONF_BLOCK_DONE
if (rc != NGX_OK)
return rc;
"listen address:port;"
"location /images/ {"
cmd = ngx_conf_find_token(cf);
if (cmd == NULL) {
ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
"unknown directive \"%s\" in %s:%d",
cf->name, cf->file->name, cf->file->line);
return NGX_ERROR;
}
if (cmd->type == NGX_CONF_CONTAINER) {
ngx_conf_parse(cf, cmd->container, NULL);
} else if (cmd->type == NGX_CONF_FLAG) {
if (cf->args->nelts != 1) {
ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
"invalid number of arguments "
"in directive \"%s\" in %s:%d",
cf->name, cf->file->name, cf->file->line);
return NGX_ERROR;
}
if (ngx_strcasecmp(cf->args->elts[0], "on") == 0) {
flag = 1;
} else if (ngx_strcasecmp(cf->args->elts[0], "off") == 0) {
flag = 0;
} else {
ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
"invalid flag in directive \"%s\" in %s:%d",
cf->name, cf->file->name, cf->file->line);
return NGX_ERROR;
}
rv = cmd->set(cf, cmd->offset, flag);
if (rv) {
ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
"%s in directive \"%s\" in %s:%d",
rv, cf->name, cf->file->name, cf->file->line);
return NGX_ERROR;
}
} else if (cmd->type & argument_number[args->nelts]) {
rv = cmd->set(cf, cmd->offset, cf->args);
if (rv) {
ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
"%s in directive \"%s\" in %s:%d",
rv, cf->name, cf->file->name, cf->file->line);
return NGX_ERROR;
}
} else {
ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
"invalid number of arguments "
"in directive \"%s\" in %s:%d",
cf->name, cf->file->name, cf->file->line);
return NGX_ERROR;
}
}
if (filename) {
close;
}
}
int ngx_conf_read_token(ngx_conf_t *cf)
{
need_space = 0;
last_space = 1;
len = 0;
quoted = s_quoted = d_quoted = 0;
cf->args->nelts = 0;
for (/* void */ ; cf->pos < cf->end; cf->pos++) {
ch = *cf->pos;
if (ch == LF)
cf->line++;
if (quoted) {
quoted = 0;
continue;
}
len++;
if (ch = '\\') {
quoted = 1;
continue;
}
if (d_quoted) {
if (ch == '"') {
d_qouted = 0;
need_space = 1;
last_space = 1;
continue;
}
} else if (s_quoted) {
if (ch == '\'') {
s_qouted = 0;
need_space = 1;
last_space = 1;
continue;
}
} else {
if (ch == ' ' || ch == '\t' || ch == CR || ch == LF) {
ngx_test_null(word, ngx_push_array(cf->args), NGX_ERRROR);
ngx_test_null(*word, ngx_palloc(cf->temp_pool, len + 1),
NGX_ERROR);
for (dst = *word, src = cf->start; src < cf->pos; /* void */) {
if (*src == '\\')
src++;
*dst++ = *src++;
}
*dst = '\0';
need_space = 0;
last_space = 1;
continue;
}
if (need_space) {
return NGX_ERROR;
}
if (ch == ';')
return NGX_OK;
if (ch == '{')
return NGX_OK;
if (ch == '}')
return NGX_BLOCK_DONE;
if (last_space) {
if (ch == '"') {
d_qouted = 1;
continue;
}
if (ch == '\'') {
s_qouted = 1;
continue;
}
}
last_space = 0;
}
}
}
container
server
location
module
if
http_conf current server
current location
ngx_conf_t *ngx_conf_open(char *filename, ngx_log_t *log)
{
ngx_cf->fd = ngx_open_file(config, NGX_FILE_RDONLY);
if (ngx_conf->fd == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
"ngx_conf_open: "
ngx_open_file_n " %s failed", filename);
return NULL;
}
ngx_conf->name = filename;
ngx_conf->log = log;
return ngx_conf;
}
void ngx_conf_close(ngx_conf_t *cf)
{
if (ngx_close_file(cf->fd) == -1) {
ngx_log_error(NGX_LOG_ERR, cf->log, ngx_errno,
ngx_close_file_n " %s failed", cf->name);
}
cf->fd = -1;
}
#endif
2002-09-11 23:18:33 +08:00
char *ngx_conf_set_size_slot(char *conf, int offset, char *value)
{
int size;
size = atoi(value);
if (size < 0)
return "value must be greater or equal to zero";
*(int *) (conf + offset) = size;
return NULL;
}
2002-09-16 23:01:44 +08:00
char *ngx_conf_set_time_slot(char *conf, int offset, char *value)
{
int size;
size = atoi(value);
if (size < 0)
return "value must be greater or equal to zero";
*(int *) (conf + offset) = size;
return NULL;
}