Mercurial > hg > nginx
comparison src/core/ngx_config_file.c @ 32:d45effe5854c
nginx-0.0.1-2002-12-19-10:08:55 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 19 Dec 2002 07:08:55 +0000 |
parents | src/core/ngx_config_command.c@d7908993fdeb |
children | 79c1fce18e71 |
comparison
equal
deleted
inserted
replaced
31:d1ebcc555037 | 32:d45effe5854c |
---|---|
1 | |
2 #include <ngx_config.h> | |
3 | |
4 #include <ngx_core.h> | |
5 | |
6 #include <ngx_config_file.h> | |
7 | |
8 | |
9 static int argument_number[] = { | |
10 NGX_CONF_NOARGS, | |
11 NGX_CONF_TAKE1, | |
12 NGX_CONF_TAKE2 | |
13 }; | |
14 | |
15 #if 0 | |
16 | |
17 int ngx_conf_parse(ngx_conf_t *cf, char *filename) | |
18 { | |
19 int rc; | |
20 char *error; | |
21 ngx_fd_t fd; | |
22 ngx_conf_file_t *prev; | |
23 | |
24 if (filename) { | |
25 | |
26 fd = ngx_open_file(filename, NGX_FILE_RDONLY); | |
27 if (fd == NGX_INVALID_FILE) { | |
28 ngx_log_error(NGX_LOG_EMERG, cf->log, ngx_errno, | |
29 "ngx_conf_open: " | |
30 ngx_open_file_n " %s failed", filename); | |
31 return NGX_ERROR; | |
32 } | |
33 | |
34 prev = cf->file; | |
35 ngx_test_null(cf->file, ngx_palloc(cf->pool, sizeof(ngx_conf_file_t)), | |
36 NGX_ERROR); | |
37 | |
38 cf->file->fd = fd; | |
39 cf->file->name = filename; | |
40 cf->file->line = 1; | |
41 cf->file->pos = 0; | |
42 } | |
43 | |
44 for ( ;; ) { | |
45 rc = ngx_conf_read_token(cf); | |
46 | |
47 /* ??? NGX_OK, NGX_ERROR, NGX_CONF_FILE_DONE, NGX_CONF_BLOCK_DONE */ | |
48 | |
49 if (rc != NGX_OK) { | |
50 return rc; | |
51 } | |
52 | |
53 /* ???? | |
54 "listen address:port;" | |
55 "location /images/ {" */ | |
56 | |
57 if (cf->handler) { | |
58 | |
59 if (*(cf->handler)(cf) == NGX_ERROR) { | |
60 return NGX_ERROR; | |
61 } | |
62 | |
63 continue; | |
64 } | |
65 | |
66 cmd = ngx_conf_find_token(cf); | |
67 if (cmd == NULL) { | |
68 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | |
69 "unknown directive \"%s\" in %s:%d", | |
70 cf->name, cf->file->name, cf->file->line); | |
71 return NGX_ERROR; | |
72 } | |
73 | |
74 if (cmd->type & argument_number[cf->args->nelts]) { | |
75 error = cmd->set(cf, cmd->offset, cf->args); | |
76 | |
77 if (error) { | |
78 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | |
79 "%s in directive \"%s\" in %s:%d", | |
80 error, cf->name, cf->file->name, cf->file->line); | |
81 return NGX_ERROR; | |
82 } | |
83 } | |
84 | |
85 #if 0 | |
86 if (cmd->type == NGX_CONF_CONTAINER) { | |
87 ngx_conf_parse(cf, cmd->container, NULL); | |
88 | |
89 } else if (cmd->type == NGX_CONF_FLAG) { | |
90 | |
91 if (cf->args->nelts != 1) { | |
92 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | |
93 "invalid number of arguments " | |
94 "in directive \"%s\" in %s:%d", | |
95 cf->name, cf->file->name, cf->file->line); | |
96 return NGX_ERROR; | |
97 } | |
98 | |
99 if (ngx_strcasecmp(cf->args->elts[0], "on") == 0) { | |
100 flag = 1; | |
101 | |
102 } else if (ngx_strcasecmp(cf->args->elts[0], "off") == 0) { | |
103 flag = 0; | |
104 | |
105 } else { | |
106 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | |
107 "invalid flag in directive \"%s\" in %s:%d", | |
108 cf->name, cf->file->name, cf->file->line); | |
109 return NGX_ERROR; | |
110 } | |
111 | |
112 rv = cmd->set(cf, cmd->offset, flag); | |
113 if (rv) { | |
114 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | |
115 "%s in directive \"%s\" in %s:%d", | |
116 rv, cf->name, cf->file->name, cf->file->line); | |
117 return NGX_ERROR; | |
118 } | |
119 | |
120 } else if (cmd->type & argument_number[args->nelts]) { | |
121 rv = cmd->set(cf, cmd->offset, cf->args); | |
122 if (rv) { | |
123 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | |
124 "%s in directive \"%s\" in %s:%d", | |
125 rv, cf->name, cf->file->name, cf->file->line); | |
126 return NGX_ERROR; | |
127 } | |
128 | |
129 } else { | |
130 ngx_log_error(NGX_LOG_EMERG, cf->log, 0, | |
131 "invalid number of arguments " | |
132 "in directive \"%s\" in %s:%d", | |
133 cf->name, cf->file->name, cf->file->line); | |
134 return NGX_ERROR; | |
135 } | |
136 } | |
137 #endif | |
138 | |
139 if (filename) { | |
140 cf->file = prev; | |
141 | |
142 if (ngx_close_file(fd) == NGX_FILE_ERROR) { | |
143 ngx_log_error(NGX_LOG_ERR, cf->log, ngx_errno, | |
144 ngx_close_file_n " %s failed", cf->name); | |
145 return NGX_ERROR; | |
146 } | |
147 } | |
148 | |
149 return NGX_OK; | |
150 } | |
151 | |
152 #endif | |
153 | |
154 #if 0 | |
155 | |
156 int ngx_conf_read_token(ngx_conf_t *cf) | |
157 { | |
158 char *start, ch, *src, *dst; | |
159 int n, need_space, last_space, len, quoted, s_quoted, d_quoted; | |
160 ngx_hunk_t *h; | |
161 | |
162 need_space = 0; | |
163 last_space = 1; | |
164 len = 0; | |
165 quoted = s_quoted = d_quoted = 0; | |
166 | |
167 cf->args->nelts = 0; | |
168 h = cf->conf_file->hunk; | |
169 | |
170 for (start = h->pos.mem; /* end_of_file */ ; h->pos.mem++) { | |
171 | |
172 if (h->pos.mem >= h->last.mem) { | |
173 if (h->pos.mem - start) { | |
174 ngx_memcpy(h->start, start, h->pos.mem - start); | |
175 } | |
176 | |
177 n = ngx_read_file(cf->conf_file->file, | |
178 h->start + (h->pos.mem - start), | |
179 h->end - (h->start + (h->pos.mem - start)), | |
180 cf->conf_file->file.offset); | |
181 | |
182 if (n == NGX_ERROR) { | |
183 return NGX_ERROR; | |
184 } | |
185 | |
186 cf->conf_file.file.offset += n; | |
187 h->pos.mem = h->start + (h->pos.mem - start); | |
188 start = h->start; | |
189 h->last.mem = h->pos.mem + n; | |
190 } | |
191 | |
192 ch = *h->pos.mem; | |
193 | |
194 if (ch == LF) { | |
195 cf->conf_file->line++; | |
196 } | |
197 | |
198 if (quoted) { | |
199 quoted = 0; | |
200 continue; | |
201 } | |
202 | |
203 len++; | |
204 | |
205 if (last_space) { | |
206 start = h->pos.mem; | |
207 | |
208 if (ch == ' ' || ch == '\t' || ch == CR || ch == LF) { | |
209 start++; | |
210 continue; | |
211 } | |
212 } | |
213 | |
214 if (ch = '\\') { | |
215 quoted = 1; | |
216 continue; | |
217 } | |
218 | |
219 if (d_quoted) { | |
220 | |
221 if (ch == '"') { | |
222 d_quoted = 0; | |
223 need_space = 1; | |
224 last_space = 1; | |
225 continue; | |
226 } | |
227 | |
228 } else if (s_quoted) { | |
229 | |
230 if (ch == '\'') { | |
231 s_quoted = 0; | |
232 need_space = 1; | |
233 last_space = 1; | |
234 continue; | |
235 } | |
236 | |
237 } else { | |
238 | |
239 if (ch == ' ' || ch == '\t' || ch == CR || ch == LF) { | |
240 ngx_test_null(word, ngx_push_array(cf->args), NGX_ERROR); | |
241 ngx_test_null(word->data, ngx_palloc(cf->temp_pool, len + 1), | |
242 NGX_ERROR); | |
243 word->len = len; | |
244 | |
245 for (dst = word->data, src = start; src < h->pos; /* void */) { | |
246 if (*src == '\\') | |
247 src++; | |
248 *dst++ = *src++; | |
249 } | |
250 *dst = '\0'; | |
251 | |
252 need_space = 0; | |
253 last_space = 1; | |
254 continue; | |
255 } | |
256 | |
257 if (need_space) { | |
258 return NGX_ERROR; | |
259 } | |
260 | |
261 if (ch == ';') { | |
262 return NGX_OK; | |
263 } | |
264 | |
265 if (ch == '{') { | |
266 return NGX_OK; | |
267 } | |
268 | |
269 if (ch == '}') { | |
270 return NGX_BLOCK_DONE; | |
271 } | |
272 | |
273 if (last_space) { | |
274 if (ch == '"') { | |
275 d_quoted = 1; | |
276 continue; | |
277 } | |
278 | |
279 if (ch == '\'') { | |
280 s_quoted = 1; | |
281 continue; | |
282 } | |
283 } | |
284 | |
285 last_space = 0; | |
286 } | |
287 } | |
288 } | |
289 | |
290 #endif | |
291 | |
292 char *ngx_conf_set_size_slot(char *conf, int offset, char *value) | |
293 { | |
294 int size; | |
295 | |
296 size = atoi(value); | |
297 if (size < 0) | |
298 return "value must be greater or equal to zero"; | |
299 | |
300 *(int *) (conf + offset) = size; | |
301 return NULL; | |
302 } | |
303 | |
304 char *ngx_conf_set_time_slot(char *conf, int offset, char *value) | |
305 { | |
306 int size; | |
307 | |
308 size = atoi(value); | |
309 if (size < 0) | |
310 return "value must be greater or equal to zero"; | |
311 | |
312 *(int *) (conf + offset) = size; | |
313 return NULL; | |
314 } |