Mercurial > hg > nginx-quic
annotate src/imap/ngx_imap_parse.c @ 533:d6e48c08d718 release-0.1.41
nginx-0.1.41-RELEASE import
*) Bugfix: if the variable was used in the configuration file, then it
can not be used in SSI.
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 19 Aug 2005 08:54:17 +0000 |
parents | e5d7d0334fdb |
children | 511a89da35ad |
rev | line source |
---|---|
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
1 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
2 /* |
444
42d11f017717
nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents:
441
diff
changeset
|
3 * Copyright (C) Igor Sysoev |
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
4 */ |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
422
diff
changeset
|
5 |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
6 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
7 #include <ngx_config.h> |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
8 #include <ngx_core.h> |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
9 #include <ngx_event.h> |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
10 #include <ngx_imap.h> |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
11 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
12 |
527 | 13 ngx_int_t ngx_imap_parse_command(ngx_imap_session_t *s) |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
14 { |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
15 u_char ch, *p, *c; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
16 ngx_str_t *arg; |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
17 enum { |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
18 sw_start = 0, |
527 | 19 sw_spaces_before_command, |
20 sw_command, | |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
21 sw_spaces_before_argument, |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
22 sw_argument, |
527 | 23 sw_literal, |
24 sw_start_literal_argument, | |
25 sw_literal_argument, | |
26 sw_end_literal_argument, | |
27 sw_almost_done | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
28 } state; |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
29 |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
30 state = s->state; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
31 |
527 | 32 for (p = s->buffer->pos; p < s->buffer->last; p++) { |
33 ch = *p; | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
34 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
35 switch (state) { |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
36 |
527 | 37 /* IMAP tag */ |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
38 case sw_start: |
527 | 39 switch (ch) { |
40 case ' ': | |
41 s->tag.len = p - s->buffer->start + 1; | |
42 s->tag.data = s->buffer->start; | |
43 state = sw_spaces_before_command; | |
44 break; | |
45 case CR: | |
46 s->state = sw_start; | |
47 return NGX_IMAP_PARSE_INVALID_COMMAND; | |
48 case LF: | |
49 s->state = sw_start; | |
50 return NGX_IMAP_PARSE_INVALID_COMMAND; | |
51 } | |
52 break; | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
53 |
527 | 54 case sw_spaces_before_command: |
55 switch (ch) { | |
56 case ' ': | |
57 break; | |
58 case CR: | |
59 s->state = sw_start; | |
60 return NGX_IMAP_PARSE_INVALID_COMMAND; | |
61 case LF: | |
62 s->state = sw_start; | |
63 return NGX_IMAP_PARSE_INVALID_COMMAND; | |
64 default: | |
65 s->cmd_start = p; | |
66 state = sw_command; | |
67 break; | |
68 } | |
69 break; | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
70 |
527 | 71 case sw_command: |
72 if (ch == ' ' || ch == CR || ch == LF) { | |
73 | |
74 c = s->cmd_start; | |
75 | |
76 switch (p - c) { | |
77 | |
78 case 4: | |
79 if ((c[0] == 'N' || c[0] == 'n') | |
80 && (c[1] == 'O'|| c[1] == 'o') | |
81 && (c[2] == 'O'|| c[2] == 'o') | |
82 && (c[3] == 'P'|| c[3] == 'p')) | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
83 { |
527 | 84 s->command = NGX_IMAP_NOOP; |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
85 |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
86 } else { |
527 | 87 goto invalid; |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
88 } |
527 | 89 break; |
90 | |
91 case 5: | |
92 if ((c[0] == 'L'|| c[0] == 'l') | |
93 && (c[1] == 'O'|| c[1] == 'o') | |
94 && (c[2] == 'G'|| c[2] == 'g') | |
95 && (c[3] == 'I'|| c[3] == 'i') | |
96 && (c[4] == 'N'|| c[4] == 'n')) | |
97 { | |
98 s->command = NGX_IMAP_LOGIN; | |
99 | |
100 } else { | |
101 goto invalid; | |
102 } | |
103 break; | |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
104 |
527 | 105 case 6: |
106 if ((c[0] == 'L'|| c[0] == 'l') | |
107 && (c[1] == 'O'|| c[1] == 'o') | |
108 && (c[2] == 'G'|| c[2] == 'g') | |
109 && (c[3] == 'O'|| c[3] == 'o') | |
110 && (c[4] == 'U'|| c[4] == 'u') | |
111 && (c[5] == 'T'|| c[5] == 't')) | |
112 { | |
113 s->command = NGX_IMAP_LOGOUT; | |
114 | |
115 } else { | |
116 goto invalid; | |
117 } | |
118 break; | |
119 | |
120 case 10: | |
121 if ((c[0] == 'C'|| c[0] == 'c') | |
122 && (c[1] == 'A'|| c[1] == 'a') | |
123 && (c[2] == 'P'|| c[2] == 'p') | |
124 && (c[3] == 'A'|| c[3] == 'a') | |
125 && (c[4] == 'B'|| c[4] == 'b') | |
126 && (c[5] == 'I'|| c[5] == 'i') | |
127 && (c[6] == 'L'|| c[6] == 'l') | |
128 && (c[7] == 'I'|| c[7] == 'i') | |
129 && (c[8] == 'T'|| c[8] == 't') | |
130 && (c[9] == 'Y'|| c[9] == 'y')) | |
131 { | |
132 s->command = NGX_IMAP_CAPABILITY; | |
133 | |
134 } else { | |
135 goto invalid; | |
136 } | |
137 break; | |
138 | |
139 default: | |
140 goto invalid; | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
141 } |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
142 |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
143 switch (ch) { |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
144 case ' ': |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
145 state = sw_spaces_before_argument; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
146 break; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
147 case CR: |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
148 state = sw_almost_done; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
149 break; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
150 case LF: |
527 | 151 goto done; |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
152 } |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
153 break; |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
154 } |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
155 |
527 | 156 if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) { |
157 goto invalid; | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
158 } |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
159 |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
160 break; |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
161 |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
162 case sw_spaces_before_argument: |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
163 switch (ch) { |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
164 case ' ': |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
165 break; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
166 case CR: |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
167 state = sw_almost_done; |
527 | 168 s->arg_end = p; |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
169 break; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
170 case LF: |
527 | 171 s->arg_end = p; |
172 goto done; | |
173 case '"': | |
174 if (s->args.nelts <= 2) { | |
175 s->quoted = 1; | |
176 s->arg_start = p + 1; | |
177 state = sw_argument; | |
178 break; | |
179 } | |
180 goto invalid; | |
181 case '{': | |
182 if (s->args.nelts <= 2) { | |
183 state = sw_literal; | |
184 break; | |
185 } | |
186 goto invalid; | |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
187 default: |
527 | 188 if (s->args.nelts <= 2) { |
189 s->arg_start = p; | |
190 state = sw_argument; | |
191 break; | |
192 } | |
193 goto invalid; | |
194 } | |
195 break; | |
196 | |
197 case sw_argument: | |
198 switch (ch) { | |
199 case '"': | |
200 if (!s->quoted) { | |
201 break; | |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
202 } |
527 | 203 s->quoted = 0; |
204 /* fall through */ | |
205 case ' ': | |
206 case CR: | |
207 case LF: | |
208 arg = ngx_array_push(&s->args); | |
209 if (arg == NULL) { | |
210 return NGX_ERROR; | |
211 } | |
212 arg->len = p - s->arg_start; | |
213 arg->data = s->arg_start; | |
214 s->arg_start = NULL; | |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
215 |
527 | 216 switch (ch) { |
217 case '"': | |
218 case ' ': | |
219 state = sw_spaces_before_argument; | |
220 break; | |
221 case CR: | |
222 state = sw_almost_done; | |
223 break; | |
224 case LF: | |
225 goto done; | |
226 } | |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
227 break; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
228 } |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
229 break; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
230 |
527 | 231 case sw_literal: |
232 if (ch >= '0' && ch <= '9') { | |
233 s->literal_len = s->literal_len * 10 + (ch - '0'); | |
234 break; | |
235 } | |
236 if (ch == '}') { | |
237 state = sw_start_literal_argument; | |
238 break; | |
239 } | |
240 goto invalid; | |
241 | |
242 case sw_start_literal_argument: | |
243 switch (ch) { | |
244 case CR: | |
245 break; | |
246 case LF: | |
247 s->buffer->pos = p + 1; | |
248 s->arg_start = p + 1; | |
249 s->state = sw_literal_argument; | |
250 return NGX_IMAP_NEXT; | |
251 } | |
252 goto invalid; | |
253 | |
254 case sw_literal_argument: | |
529 | 255 if (s->literal_len && --s->literal_len) { |
527 | 256 break; |
257 } | |
258 | |
259 arg = ngx_array_push(&s->args); | |
260 if (arg == NULL) { | |
261 return NGX_ERROR; | |
262 } | |
263 arg->len = p + 1 - s->arg_start; | |
264 arg->data = s->arg_start; | |
265 s->arg_start = NULL; | |
266 state = sw_end_literal_argument; | |
267 | |
268 break; | |
269 | |
270 case sw_end_literal_argument: | |
271 switch (ch) { | |
272 case '{': | |
273 if (s->args.nelts <= 2) { | |
274 state = sw_literal; | |
275 break; | |
276 } | |
277 goto invalid; | |
278 case CR: | |
279 state = sw_almost_done; | |
280 break; | |
281 case LF: | |
282 goto done; | |
283 default: | |
529 | 284 state = sw_spaces_before_argument; |
285 break; | |
527 | 286 } |
287 break; | |
288 | |
289 case sw_almost_done: | |
290 switch (ch) { | |
291 case LF: | |
292 goto done; | |
293 default: | |
294 goto invalid; | |
295 } | |
296 } | |
297 } | |
298 | |
299 s->buffer->pos = p; | |
300 s->state = state; | |
301 | |
302 return NGX_AGAIN; | |
303 | |
304 done: | |
305 | |
306 s->buffer->pos = p + 1; | |
307 | |
308 if (s->arg_start) { | |
309 arg = ngx_array_push(&s->args); | |
310 if (arg == NULL) { | |
311 return NGX_ERROR; | |
312 } | |
313 arg->len = s->arg_end - s->arg_start; | |
314 arg->data = s->arg_start; | |
315 s->arg_start = NULL; | |
316 s->cmd_start = NULL; | |
317 s->quoted = 0; | |
318 s->literal_len = 0; | |
319 } | |
320 | |
321 s->state = sw_start; | |
322 | |
323 return NGX_OK; | |
324 | |
325 invalid: | |
326 | |
327 s->state = sw_start; | |
328 s->quoted = 0; | |
329 s->literal_len = 0; | |
330 | |
331 return NGX_IMAP_PARSE_INVALID_COMMAND; | |
332 } | |
333 | |
334 | |
335 ngx_int_t ngx_pop3_parse_command(ngx_imap_session_t *s) | |
336 { | |
337 u_char ch, *p, *c, c0, c1, c2, c3; | |
338 ngx_str_t *arg; | |
339 enum { | |
340 sw_start = 0, | |
341 sw_spaces_before_argument, | |
342 sw_argument, | |
343 sw_almost_done | |
344 } state; | |
345 | |
346 state = s->state; | |
347 | |
348 for (p = s->buffer->pos; p < s->buffer->last; p++) { | |
349 ch = *p; | |
350 | |
351 switch (state) { | |
352 | |
353 /* POP3 command */ | |
354 case sw_start: | |
355 if (ch == ' ' || ch == CR || ch == LF) { | |
356 c = s->buffer->start; | |
357 | |
358 if (p - c == 4) { | |
359 | |
360 c0 = ngx_toupper(c[0]); | |
361 c1 = ngx_toupper(c[1]); | |
362 c2 = ngx_toupper(c[2]); | |
363 c3 = ngx_toupper(c[3]); | |
364 | |
365 if (c0 == 'U' && c1 == 'S' && c2 == 'E' && c3 == 'R') | |
366 { | |
367 s->command = NGX_POP3_USER; | |
368 | |
369 } else if (c0 == 'P' && c1 == 'A' && c2 == 'S' && c3 == 'S') | |
370 { | |
371 s->command = NGX_POP3_PASS; | |
372 | |
373 } else if (c0 == 'Q' && c1 == 'U' && c2 == 'I' && c3 == 'T') | |
374 { | |
375 s->command = NGX_POP3_QUIT; | |
376 | |
377 } else if (c0 == 'C' && c1 == 'A' && c2 == 'P' && c3 == 'A') | |
378 { | |
379 s->command = NGX_POP3_CAPA; | |
380 | |
381 } else if (c0 == 'N' && c1 == 'O' && c2 == 'O' && c3 == 'P') | |
382 { | |
383 s->command = NGX_POP3_NOOP; | |
384 | |
385 } else { | |
386 goto invalid; | |
387 } | |
388 | |
389 } else { | |
390 goto invalid; | |
391 } | |
392 | |
393 switch (ch) { | |
394 case ' ': | |
395 state = sw_spaces_before_argument; | |
396 break; | |
397 case CR: | |
398 state = sw_almost_done; | |
399 break; | |
400 case LF: | |
401 goto done; | |
402 } | |
403 break; | |
404 } | |
405 | |
406 if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) { | |
407 goto invalid; | |
408 } | |
409 | |
410 break; | |
411 | |
412 case sw_spaces_before_argument: | |
413 switch (ch) { | |
414 case ' ': | |
415 break; | |
416 case CR: | |
417 state = sw_almost_done; | |
418 s->arg_end = p; | |
419 break; | |
420 case LF: | |
421 s->arg_end = p; | |
422 goto done; | |
423 default: | |
424 if (s->args.nelts <= 2) { | |
425 state = sw_argument; | |
426 s->arg_start = p; | |
427 break; | |
428 } | |
429 goto invalid; | |
430 } | |
431 break; | |
432 | |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
433 case sw_argument: |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
434 switch (ch) { |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
435 case ' ': |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
436 case CR: |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
437 case LF: |
501 | 438 arg = ngx_array_push(&s->args); |
439 if (arg == NULL) { | |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
440 return NGX_ERROR; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
441 } |
527 | 442 arg->len = p - s->arg_start; |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
443 arg->data = s->arg_start; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
444 s->arg_start = NULL; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
445 |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
446 switch (ch) { |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
447 case ' ': |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
448 state = sw_spaces_before_argument; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
449 break; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
450 case CR: |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
451 state = sw_almost_done; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
452 break; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
453 case LF: |
527 | 454 goto done; |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
455 } |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
456 break; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
457 |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
458 default: |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
459 break; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
460 } |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
461 break; |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
462 |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
463 case sw_almost_done: |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
464 switch (ch) { |
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
465 case LF: |
527 | 466 goto done; |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
467 default: |
527 | 468 goto invalid; |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
469 } |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
470 } |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
471 } |
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
472 |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
473 s->buffer->pos = p; |
527 | 474 s->state = state; |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
475 |
527 | 476 return NGX_AGAIN; |
477 | |
478 done: | |
479 | |
480 s->buffer->pos = p + 1; | |
481 | |
482 if (s->arg_start) { | |
483 arg = ngx_array_push(&s->args); | |
484 if (arg == NULL) { | |
485 return NGX_ERROR; | |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
486 } |
527 | 487 arg->len = s->arg_end - s->arg_start; |
488 arg->data = s->arg_start; | |
489 s->arg_start = NULL; | |
490 } | |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
491 |
527 | 492 s->state = sw_start; |
419
47709bff4468
nginx-0.0.10-2004-09-09-19:40:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
417
diff
changeset
|
493 |
527 | 494 return NGX_OK; |
495 | |
496 invalid: | |
497 | |
498 s->state = sw_start; | |
499 | |
500 return NGX_IMAP_PARSE_INVALID_COMMAND; | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
501 } |