annotate src/lib-imap/imap-parser.c @ 9532:00cd9aacd03c HEAD

Updated copyright notices to include year 2010.
author Timo Sirainen <tss@iki.fi>
date Mon, 25 Jan 2010 01:18:58 +0200
parents 31fe9a8740c3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9532
00cd9aacd03c Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 9151
diff changeset
1 /* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 735
diff changeset
4 #include "istream.h"
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 735
diff changeset
5 #include "ostream.h"
896
21ffcce83c70 Rewrote rfc822-tokenize.c to work one token at a time so it won't uselessly
Timo Sirainen <tss@iki.fi>
parents: 877
diff changeset
6 #include "strescape.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "imap-parser.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #define is_linebreak(c) \
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 ((c) == '\r' || (c) == '\n')
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
12 #define LIST_INIT_COUNT 7
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
13
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
14 enum arg_parse_type {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 ARG_PARSE_NONE = 0,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 ARG_PARSE_ATOM,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 ARG_PARSE_STRING,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 ARG_PARSE_LITERAL,
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
19 ARG_PARSE_LITERAL_DATA,
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
20 ARG_PARSE_LITERAL_DATA_FORCED
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
21 };
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
23 struct imap_parser {
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
24 /* permanent */
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
25 pool_t pool;
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
26 struct istream *input;
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
27 struct ostream *output;
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
28 size_t max_line_size;
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
29 enum imap_parser_flags flags;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
31 /* reset by imap_parser_reset(): */
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
32 size_t line_size;
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
33 ARRAY_TYPE(imap_arg_list) root_list;
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
34 ARRAY_TYPE(imap_arg_list) *cur_list;
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
35 struct imap_arg *list_arg;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
37 enum arg_parse_type cur_type;
502
7927650f3b9b imap_parser_read_args() didn't correctly always return "need for more data"
Timo Sirainen <tss@iki.fi>
parents: 469
diff changeset
38 size_t cur_pos; /* parser position in input buffer */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 int str_first_escape; /* ARG_PARSE_STRING: index to first '\' */
50
d493b9cc265e Introduced uoff_t which is the unsigned-equilevant of off_t. This was needed
Timo Sirainen <tss@iki.fi>
parents: 22
diff changeset
41 uoff_t literal_size; /* ARG_PARSE_LITERAL: string size */
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
42
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
43 const char *error;
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
44
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 unsigned int literal_skip_crlf:1;
1022
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
46 unsigned int literal_nonsync:1;
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
47 unsigned int literal_size_return:1;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 unsigned int eol:1;
1023
dc660f588218 Disconnect client if given non-sync literal size is too large. Better than
Timo Sirainen <tss@iki.fi>
parents: 1022
diff changeset
49 unsigned int fatal_error:1;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 };
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
52 struct imap_parser *
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
53 imap_parser_create(struct istream *input, struct ostream *output,
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
54 size_t max_line_size)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
56 struct imap_parser *parser;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
58 parser = i_new(struct imap_parser, 1);
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
59 parser->pool = pool_alloconly_create(MEMPOOL_GROWING"IMAP parser",
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
60 1024*10);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 735
diff changeset
61 parser->input = input;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 735
diff changeset
62 parser->output = output;
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
63 parser->max_line_size = max_line_size;
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
64
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
65 p_array_init(&parser->root_list, parser->pool, LIST_INIT_COUNT);
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
66 parser->cur_list = &parser->root_list;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 return parser;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
70 void imap_parser_destroy(struct imap_parser **parser)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 {
6428
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6418
diff changeset
72 pool_unref(&(*parser)->pool);
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
73 i_free(*parser);
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
74 *parser = NULL;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
77 void imap_parser_reset(struct imap_parser *parser)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 p_clear(parser->pool);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
81 parser->line_size = 0;
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
82
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
83 p_array_init(&parser->root_list, parser->pool, LIST_INIT_COUNT);
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
84 parser->cur_list = &parser->root_list;
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
85 parser->list_arg = NULL;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 parser->cur_type = ARG_PARSE_NONE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 parser->cur_pos = 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
90 parser->str_first_escape = 0;
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
91 parser->literal_size = 0;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
93 parser->error = NULL;
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
94
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
95 parser->literal_skip_crlf = FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 parser->eol = FALSE;
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
97 parser->literal_size_return = FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3481
diff changeset
100 const char *imap_parser_get_error(struct imap_parser *parser, bool *fatal)
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
101 {
1023
dc660f588218 Disconnect client if given non-sync literal size is too large. Better than
Timo Sirainen <tss@iki.fi>
parents: 1022
diff changeset
102 *fatal = parser->fatal_error;
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
103 return parser->error;
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
104 }
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
105
502
7927650f3b9b imap_parser_read_args() didn't correctly always return "need for more data"
Timo Sirainen <tss@iki.fi>
parents: 469
diff changeset
106 /* skip over everything parsed so far, plus the following whitespace */
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
107 static int imap_parser_skip_to_next(struct imap_parser *parser,
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 896
diff changeset
108 const unsigned char **data,
502
7927650f3b9b imap_parser_read_args() didn't correctly always return "need for more data"
Timo Sirainen <tss@iki.fi>
parents: 469
diff changeset
109 size_t *data_size)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 {
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 129
diff changeset
111 size_t i;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 for (i = parser->cur_pos; i < *data_size; i++) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 if ((*data)[i] != ' ')
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
118 parser->line_size += i;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 735
diff changeset
119 i_stream_skip(parser->input, i);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 parser->cur_pos = 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 *data += i;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 *data_size -= i;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 return *data_size > 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
127 static struct imap_arg *imap_arg_create(struct imap_parser *parser)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
129 struct imap_arg *arg;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
131 arg = array_append_space(parser->cur_list);
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
132 arg->parent = parser->list_arg;
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
133 return arg;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
136 static void imap_parser_open_list(struct imap_parser *parser)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 {
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
138 parser->list_arg = imap_arg_create(parser);
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
139 parser->list_arg->type = IMAP_ARG_LIST;
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
140 p_array_init(&parser->list_arg->_data.list, parser->pool,
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
141 LIST_INIT_COUNT);
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
142 parser->cur_list = &parser->list_arg->_data.list;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 parser->cur_type = ARG_PARSE_NONE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
147 static int imap_parser_close_list(struct imap_parser *parser)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
149 struct imap_arg *arg;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
151 if (parser->list_arg == NULL) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 /* we're not inside list */
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
153 parser->error = "Unexpected ')'";
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
157 arg = imap_arg_create(parser);
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
158 arg->type = IMAP_ARG_EOL;
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
159
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
160 parser->list_arg = parser->list_arg->parent;
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
161 if (parser->list_arg == NULL) {
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
162 parser->cur_list = &parser->root_list;
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
163 } else {
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
164 parser->cur_list = &parser->list_arg->_data.list;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 parser->cur_type = ARG_PARSE_NONE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
171 static void imap_parser_save_arg(struct imap_parser *parser,
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
172 const unsigned char *data, size_t size)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
174 struct imap_arg *arg;
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
175 char *str;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
177 arg = imap_arg_create(parser);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 switch (parser->cur_type) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 case ARG_PARSE_ATOM:
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 896
diff changeset
181 if (size == 3 && memcmp(data, "NIL", 3) == 0) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 /* NIL argument */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 arg->type = IMAP_ARG_NIL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 } else {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 /* simply save the string */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 arg->type = IMAP_ARG_ATOM;
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 896
diff changeset
187 arg->_data.str = p_strndup(parser->pool, data, size);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 case ARG_PARSE_STRING:
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 /* data is quoted and may contain escapes. */
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 896
diff changeset
192 i_assert(size > 0);
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
193
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 arg->type = IMAP_ARG_STRING;
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
195 str = p_strndup(parser->pool, data+1, size-1);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 /* remove the escapes */
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
198 if (parser->str_first_escape >= 0 &&
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
199 (parser->flags & IMAP_PARSE_FLAG_NO_UNESCAPE) == 0) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 /* -1 because we skipped the '"' prefix */
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
201 str_unescape(str + parser->str_first_escape-1);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 }
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
203 arg->_data.str = str;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 case ARG_PARSE_LITERAL_DATA:
1107
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 1068
diff changeset
206 if ((parser->flags & IMAP_PARSE_FLAG_LITERAL_SIZE) != 0) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 /* save literal size */
1022
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
208 arg->type = parser->literal_nonsync ?
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
209 IMAP_ARG_LITERAL_SIZE_NONSYNC :
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
210 IMAP_ARG_LITERAL_SIZE;
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
211 arg->_data.literal_size = parser->literal_size;
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
212 break;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
213 }
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
214 /* fall through */
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
215 case ARG_PARSE_LITERAL_DATA_FORCED:
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
216 if ((parser->flags &
1107
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 1068
diff changeset
217 IMAP_PARSE_FLAG_LITERAL_TYPE) != 0) {
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 1068
diff changeset
218 arg->type = IMAP_ARG_LITERAL;
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 1068
diff changeset
219 arg->_data.str = p_strndup(parser->pool, data, size);
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 1068
diff changeset
220 } else {
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 1068
diff changeset
221 arg->type = IMAP_ARG_STRING;
4044c2903ed7 Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents: 1068
diff changeset
222 arg->_data.str = p_strndup(parser->pool, data, size);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 default:
546
e1254b838e0b Added --enable-asserts (default) and fixed some warnings when building
Timo Sirainen <tss@iki.fi>
parents: 504
diff changeset
226 i_unreached();
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228
502
7927650f3b9b imap_parser_read_args() didn't correctly always return "need for more data"
Timo Sirainen <tss@iki.fi>
parents: 469
diff changeset
229 parser->cur_type = ARG_PARSE_NONE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231
1169
0eaf51e01ccd Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents: 1167
diff changeset
232 static int is_valid_atom_char(struct imap_parser *parser, char chr)
0eaf51e01ccd Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents: 1167
diff changeset
233 {
6889
3ec5a07d00f2 Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents: 6739
diff changeset
234 const char *error;
3ec5a07d00f2 Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents: 6739
diff changeset
235
6946
49ba86f65da5 Fixed handling invalid characters in atoms.
Timo Sirainen <tss@iki.fi>
parents: 6889
diff changeset
236 if (IS_ATOM_SPECIAL_INPUT((unsigned char)chr))
6889
3ec5a07d00f2 Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents: 6739
diff changeset
237 error = "Invalid characters in atom";
6946
49ba86f65da5 Fixed handling invalid characters in atoms.
Timo Sirainen <tss@iki.fi>
parents: 6889
diff changeset
238 else if ((chr & 0x80) != 0)
6889
3ec5a07d00f2 Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents: 6739
diff changeset
239 error = "8bit data in atom";
6946
49ba86f65da5 Fixed handling invalid characters in atoms.
Timo Sirainen <tss@iki.fi>
parents: 6889
diff changeset
240 else
6889
3ec5a07d00f2 Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents: 6739
diff changeset
241 return TRUE;
1169
0eaf51e01ccd Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents: 1167
diff changeset
242
6889
3ec5a07d00f2 Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents: 6739
diff changeset
243 if ((parser->flags & IMAP_PARSE_FLAG_ATOM_ALLCHARS) != 0)
3ec5a07d00f2 Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents: 6739
diff changeset
244 return TRUE;
3ec5a07d00f2 Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents: 6739
diff changeset
245 parser->error = error;
3ec5a07d00f2 Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents: 6739
diff changeset
246 return FALSE;
1169
0eaf51e01ccd Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents: 1167
diff changeset
247 }
0eaf51e01ccd Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents: 1167
diff changeset
248
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
249 static int imap_parser_read_atom(struct imap_parser *parser,
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
250 const unsigned char *data, size_t data_size)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 {
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 129
diff changeset
252 size_t i;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 1661
diff changeset
254 /* read until we've found space, CR or LF. */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 for (i = parser->cur_pos; i < data_size; i++) {
7131
0355a4603e80 If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
256 if (data[i] == ' ' || is_linebreak(data[i])) {
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 1661
diff changeset
257 imap_parser_save_arg(parser, data, i);
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 1661
diff changeset
258 break;
7131
0355a4603e80 If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
259 } else if (data[i] == ')') {
0355a4603e80 If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
260 if (parser->list_arg != NULL ||
0355a4603e80 If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
261 (parser->flags &
0355a4603e80 If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
262 IMAP_PARSE_FLAG_ATOM_ALLCHARS) == 0) {
0355a4603e80 If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
263 imap_parser_save_arg(parser, data, i);
0355a4603e80 If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
264 break;
0355a4603e80 If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
265 }
0355a4603e80 If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
266 /* assume it's part of the atom */
2675
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 1661
diff changeset
267 } else if (!is_valid_atom_char(parser, data[i]))
60d33cf81c8e BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents: 1661
diff changeset
268 return FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 parser->cur_pos = i;
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
272 return parser->cur_type == ARG_PARSE_NONE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
275 static int imap_parser_read_string(struct imap_parser *parser,
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 896
diff changeset
276 const unsigned char *data, size_t data_size)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 {
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 129
diff changeset
278 size_t i;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 /* read until we've found non-escaped ", CR or LF */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 for (i = parser->cur_pos; i < data_size; i++) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 if (data[i] == '"') {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 imap_parser_save_arg(parser, data, i);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 i++; /* skip the trailing '"' too */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 if (data[i] == '\\') {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 if (i+1 == data_size) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 /* known data ends with '\' - leave it to
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 next time as well if it happens to be \" */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 /* save the first escaped char */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 if (parser->str_first_escape < 0)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 parser->str_first_escape = i;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 /* skip the escaped char */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 i++;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 /* check linebreaks here, so escaping CR/LF isn't possible.
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 string always ends with '"', so it's an error if we found
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 a linebreak.. */
8837
c9d6ae6f10fe imap-parser: Added IMAP_PARSE_FLAG_MULTILINE_STR flag.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
307 if (is_linebreak(data[i]) &&
c9d6ae6f10fe imap-parser: Added IMAP_PARSE_FLAG_MULTILINE_STR flag.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
308 (parser->flags & IMAP_PARSE_FLAG_MULTILINE_STR) == 0) {
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
309 parser->error = "Missing '\"'";
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 parser->cur_pos = i;
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
315 return parser->cur_type == ARG_PARSE_NONE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
318 static int imap_parser_literal_end(struct imap_parser *parser)
308
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
319 {
1288
fa47d787c2aa Literal parser broke if \r\n wasn't in buffer at the time '}' was parsed.
Timo Sirainen <tss@iki.fi>
parents: 1175
diff changeset
320 if ((parser->flags & IMAP_PARSE_FLAG_LITERAL_SIZE) == 0) {
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
321 if (parser->line_size >= parser->max_line_size ||
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
322 parser->literal_size >
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
323 parser->max_line_size - parser->line_size) {
308
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
324 /* too long string, abort. */
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
325 parser->error = "Literal size too large";
1023
dc660f588218 Disconnect client if given non-sync literal size is too large. Better than
Timo Sirainen <tss@iki.fi>
parents: 1022
diff changeset
326 parser->fatal_error = TRUE;
308
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
327 return FALSE;
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
328 }
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
329
1022
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
330 if (parser->output != NULL && !parser->literal_nonsync) {
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 735
diff changeset
331 o_stream_send(parser->output, "+ OK\r\n", 6);
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 735
diff changeset
332 o_stream_flush(parser->output);
408
e057845d94ca Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents: 348
diff changeset
333 }
308
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
334 }
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
335
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
336 parser->cur_type = ARG_PARSE_LITERAL_DATA;
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
337 parser->literal_skip_crlf = TRUE;
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
338
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
339 parser->cur_pos = 0;
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
340 return TRUE;
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
341 }
899d3e189dbf We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
342
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
343 static int imap_parser_read_literal(struct imap_parser *parser,
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 896
diff changeset
344 const unsigned char *data,
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 129
diff changeset
345 size_t data_size)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 {
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 129
diff changeset
347 size_t i, prev_size;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 /* expecting digits + "}" */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 for (i = parser->cur_pos; i < data_size; i++) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 if (data[i] == '}') {
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
352 parser->line_size += i+1;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 735
diff changeset
353 i_stream_skip(parser->input, i+1);
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
354 return imap_parser_literal_end(parser);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356
1022
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
357 if (parser->literal_nonsync) {
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
358 parser->error = "Expecting '}' after '+'";
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
359 return FALSE;
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
360 }
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
361
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
362 if (data[i] == '+') {
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
363 parser->literal_nonsync = TRUE;
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
364 continue;
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
365 }
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
366
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
367 if (data[i] < '0' || data[i] > '9') {
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
368 parser->error = "Invalid literal size";
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 return FALSE;
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
370 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 prev_size = parser->literal_size;
50
d493b9cc265e Introduced uoff_t which is the unsigned-equilevant of off_t. This was needed
Timo Sirainen <tss@iki.fi>
parents: 22
diff changeset
373 parser->literal_size = parser->literal_size*10 + (data[i]-'0');
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 if (parser->literal_size < prev_size) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 /* wrapped around, abort. */
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
377 parser->error = "Literal size too large";
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
382 parser->cur_pos = i;
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
383 return FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
386 static int imap_parser_read_literal_data(struct imap_parser *parser,
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 896
diff changeset
387 const unsigned char *data,
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 129
diff changeset
388 size_t data_size)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 if (parser->literal_skip_crlf) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 /* skip \r\n or \n, anything else gives an error */
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
392 if (data_size == 0)
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
393 return FALSE;
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
394
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 if (*data == '\r') {
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
396 parser->line_size++;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 data++; data_size--;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 735
diff changeset
398 i_stream_skip(parser->input, 1);
719
d23e1df5efa0 Still not exactly right.
Timo Sirainen <tss@iki.fi>
parents: 718
diff changeset
399
d23e1df5efa0 Still not exactly right.
Timo Sirainen <tss@iki.fi>
parents: 718
diff changeset
400 if (data_size == 0)
d23e1df5efa0 Still not exactly right.
Timo Sirainen <tss@iki.fi>
parents: 718
diff changeset
401 return FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
404 if (*data != '\n') {
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
405 parser->error = "Missing LF after literal size";
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 return FALSE;
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
407 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
409 parser->line_size++;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 data++; data_size--;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 735
diff changeset
411 i_stream_skip(parser->input, 1);
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
412
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 parser->literal_skip_crlf = FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 i_assert(parser->cur_pos == 0);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
418 if ((parser->flags & IMAP_PARSE_FLAG_LITERAL_SIZE) == 0 ||
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
419 parser->cur_type == ARG_PARSE_LITERAL_DATA_FORCED) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 /* now we just wait until we've read enough data */
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
421 if (data_size < parser->literal_size)
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
422 return FALSE;
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
423 else {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 imap_parser_save_arg(parser, data,
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 129
diff changeset
425 (size_t)parser->literal_size);
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
426 parser->cur_pos = (size_t)parser->literal_size;
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
427 return TRUE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 } else {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 /* we want to save only literal size, not the literal itself. */
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
431 parser->literal_size_return = TRUE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 imap_parser_save_arg(parser, NULL, 0);
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
433 return FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 /* Returns TRUE if argument was fully processed. Also returns TRUE if
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 an argument inside a list was processed. */
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
439 static int imap_parser_read_arg(struct imap_parser *parser)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 {
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 896
diff changeset
441 const unsigned char *data;
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 129
diff changeset
442 size_t data_size;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 896
diff changeset
444 data = i_stream_get_data(parser->input, &data_size);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 if (data_size == 0)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 while (parser->cur_type == ARG_PARSE_NONE) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 /* we haven't started parsing yet */
502
7927650f3b9b imap_parser_read_args() didn't correctly always return "need for more data"
Timo Sirainen <tss@iki.fi>
parents: 469
diff changeset
450 if (!imap_parser_skip_to_next(parser, &data, &data_size))
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 i_assert(parser->cur_pos == 0);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 switch (data[0]) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 case '\r':
9081
09f78cad5d58 imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents: 8837
diff changeset
456 if (data_size == 1) {
09f78cad5d58 imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents: 8837
diff changeset
457 /* wait for LF */
09f78cad5d58 imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents: 8837
diff changeset
458 return FALSE;
09f78cad5d58 imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents: 8837
diff changeset
459 }
09f78cad5d58 imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents: 8837
diff changeset
460 if (data[1] != '\n') {
09f78cad5d58 imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents: 8837
diff changeset
461 parser->error = "CR sent without LF";
09f78cad5d58 imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents: 8837
diff changeset
462 return FALSE;
09f78cad5d58 imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents: 8837
diff changeset
463 }
09f78cad5d58 imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents: 8837
diff changeset
464 /* fall through */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465 case '\n':
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 /* unexpected end of line */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 parser->eol = TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469 case '"':
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 parser->cur_type = ARG_PARSE_STRING;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 parser->str_first_escape = -1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
472 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473 case '{':
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474 parser->cur_type = ARG_PARSE_LITERAL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
475 parser->literal_size = 0;
1022
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1014
diff changeset
476 parser->literal_nonsync = FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 case '(':
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479 imap_parser_open_list(parser);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481 case ')':
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482 if (!imap_parser_close_list(parser))
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
483 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
485 if (parser->list_arg == NULL) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486 /* end of argument */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487 parser->cur_pos++;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
489 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
490 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491 default:
1169
0eaf51e01ccd Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents: 1167
diff changeset
492 if (!is_valid_atom_char(parser, data[0]))
0eaf51e01ccd Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents: 1167
diff changeset
493 return FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494 parser->cur_type = ARG_PARSE_ATOM;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
495 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
496 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
497
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498 parser->cur_pos++;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
501 i_assert(data_size > 0);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
502
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
503 switch (parser->cur_type) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
504 case ARG_PARSE_ATOM:
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
505 if (!imap_parser_read_atom(parser, data, data_size))
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
506 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
507 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
508 case ARG_PARSE_STRING:
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
509 if (!imap_parser_read_string(parser, data, data_size))
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
510 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
511 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
512 case ARG_PARSE_LITERAL:
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513 if (!imap_parser_read_literal(parser, data, data_size))
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 735
diff changeset
516 /* pass through to parsing data. since input->skip was
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
517 modified, we need to get the data start position again. */
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 896
diff changeset
518 data = i_stream_get_data(parser->input, &data_size);
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
519
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
520 /* fall through */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
521 case ARG_PARSE_LITERAL_DATA:
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
522 case ARG_PARSE_LITERAL_DATA_FORCED:
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
523 if (!imap_parser_read_literal_data(parser, data, data_size))
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
524 return FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 default:
546
e1254b838e0b Added --enable-asserts (default) and fixed some warnings when building
Timo Sirainen <tss@iki.fi>
parents: 504
diff changeset
527 i_unreached();
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529
717
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
530 i_assert(parser->cur_type == ARG_PARSE_NONE);
3f817df5eba4 Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
531 return TRUE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533
1010
3c30228ae095 Missing ')' wasn't reported correctly.
Timo Sirainen <tss@iki.fi>
parents: 941
diff changeset
534 /* ARG_PARSE_NONE checks that last argument isn't only partially parsed. */
720
e0825139b0f1 Maybe now?
Timo Sirainen <tss@iki.fi>
parents: 719
diff changeset
535 #define IS_UNFINISHED(parser) \
e0825139b0f1 Maybe now?
Timo Sirainen <tss@iki.fi>
parents: 719
diff changeset
536 ((parser)->cur_type != ARG_PARSE_NONE || \
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
537 (parser)->cur_list != &parser->root_list)
719
d23e1df5efa0 Still not exactly right.
Timo Sirainen <tss@iki.fi>
parents: 718
diff changeset
538
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
539 static int finish_line(struct imap_parser *parser, unsigned int count,
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
540 const struct imap_arg **args_r)
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
541 {
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
542 struct imap_arg *arg;
9151
31fe9a8740c3 imap_parser_read_args() didn't correctly return how many parameters were read.
Timo Sirainen <tss@iki.fi>
parents: 9081
diff changeset
543 int ret = array_count(&parser->root_list);
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
544
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
545 parser->line_size += parser->cur_pos;
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
546 i_stream_skip(parser->input, parser->cur_pos);
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
547 parser->cur_pos = 0;
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
548
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
549 if (parser->list_arg != NULL && !parser->literal_size_return) {
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
550 parser->error = "Missing ')'";
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
551 *args_r = NULL;
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
552 return -1;
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
553 }
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
554
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
555 /* fill the missing parameters with NILs */
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
556 while (count > array_count(&parser->root_list)) {
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
557 arg = array_append_space(&parser->root_list);
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
558 arg->type = IMAP_ARG_NIL;
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
559 }
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
560 arg = array_append_space(&parser->root_list);
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
561 arg->type = IMAP_ARG_EOL;
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
562
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
563 *args_r = array_get(&parser->root_list, &count);
9151
31fe9a8740c3 imap_parser_read_args() didn't correctly return how many parameters were read.
Timo Sirainen <tss@iki.fi>
parents: 9081
diff changeset
564 return ret;
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
565 }
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
566
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
567 int imap_parser_read_args(struct imap_parser *parser, unsigned int count,
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
568 enum imap_parser_flags flags,
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
569 const struct imap_arg **args_r)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
570 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
571 parser->flags = flags;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
572
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
573 if (parser->literal_size_return) {
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
574 /* delete EOL */
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
575 array_delete(&parser->root_list,
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
576 array_count(&parser->root_list)-1, 1);
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
577 parser->literal_size_return = FALSE;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
578 }
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
579
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
580 while (!parser->eol && (count == 0 || IS_UNFINISHED(parser) ||
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
581 array_count(&parser->root_list) < count)) {
444
85ab93a7693b ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents: 424
diff changeset
582 if (!imap_parser_read_arg(parser))
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
583 break;
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
584
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
585 if (parser->line_size > parser->max_line_size) {
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
586 parser->error = "IMAP command line too large";
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
587 break;
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
588 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
590
768
8b3518bb327e Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
591 if (parser->error != NULL) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592 /* error, abort */
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
593 parser->line_size += parser->cur_pos;
1014
26a028e6d7d5 Externally parsed literal size always stops argument parsing now. Input
Timo Sirainen <tss@iki.fi>
parents: 1010
diff changeset
594 i_stream_skip(parser->input, parser->cur_pos);
26a028e6d7d5 Externally parsed literal size always stops argument parsing now. Input
Timo Sirainen <tss@iki.fi>
parents: 1010
diff changeset
595 parser->cur_pos = 0;
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
596 *args_r = NULL;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597 return -1;
735
ce93054db96b All SEARCH arguments still may not have been parsed.
Timo Sirainen <tss@iki.fi>
parents: 720
diff changeset
598 } else if ((!IS_UNFINISHED(parser) && count > 0 &&
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
599 array_count(&parser->root_list) >= count) ||
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
600 parser->eol || parser->literal_size_return) {
1010
3c30228ae095 Missing ')' wasn't reported correctly.
Timo Sirainen <tss@iki.fi>
parents: 941
diff changeset
601 /* all arguments read / end of line. */
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
602 return finish_line(parser, count, args_r);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603 } else {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
604 /* need more data */
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
605 *args_r = NULL;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
606 return -2;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
607 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
608 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
609
6739
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
610 static struct imap_arg *
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
611 imap_parser_get_last_literal_size(struct imap_parser *parser,
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
612 ARRAY_TYPE(imap_arg_list) **list_r)
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
613 {
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
614 ARRAY_TYPE(imap_arg_list) *list;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
615 struct imap_arg *args;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
616 unsigned int count;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
617
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
618 list = &parser->root_list;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
619 args = array_get_modifiable(&parser->root_list, &count);
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
620 i_assert(count > 1 && args[count-1].type == IMAP_ARG_EOL);
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
621 count--;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
622
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
623 while (args[count-1].type != IMAP_ARG_LITERAL_SIZE &&
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
624 args[count-1].type != IMAP_ARG_LITERAL_SIZE_NONSYNC) {
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
625 if (args[count-1].type != IMAP_ARG_LIST)
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
626 return NULL;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
627
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
628 /* maybe the list ends with literal size */
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
629 list = &args[count-1]._data.list;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
630 args = array_get_modifiable(list, &count);
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
631 if (count == 0)
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
632 return NULL;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
633 }
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
634
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
635 *list_r = list;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
636 return &args[count-1];
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
637 }
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
638
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
639 bool imap_parser_get_literal_size(struct imap_parser *parser, uoff_t *size_r)
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
640 {
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
641 ARRAY_TYPE(imap_arg_list) *list;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
642 struct imap_arg *last_arg;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
643
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
644 last_arg = imap_parser_get_last_literal_size(parser, &list);
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
645 if (last_arg == NULL)
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
646 return FALSE;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
647
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
648 *size_r = IMAP_ARG_LITERAL_SIZE(last_arg);
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
649 return TRUE;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
650 }
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
651
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
652 void imap_parser_read_last_literal(struct imap_parser *parser)
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
653 {
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
654 ARRAY_TYPE(imap_arg_list) *list;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
655 struct imap_arg *last_arg;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
656
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
657 i_assert(parser->literal_size_return);
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
658
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
659 last_arg = imap_parser_get_last_literal_size(parser, &list);
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
660 i_assert(last_arg != NULL);
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
661
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
662 parser->cur_type = ARG_PARSE_LITERAL_DATA_FORCED;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
663 i_assert(parser->literal_size == last_arg->_data.literal_size);
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
664
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
665 /* delete EOL */
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
666 array_delete(&parser->root_list, array_count(&parser->root_list)-1, 1);
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
667
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
668 /* delete literal size */
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
669 array_delete(list, array_count(list)-1, 1);
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
670 parser->literal_size_return = FALSE;
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
671 }
d145669ed45a Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
672
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
673 int imap_parser_finish_line(struct imap_parser *parser, unsigned int count,
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
674 enum imap_parser_flags flags,
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
675 const struct imap_arg **args_r)
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
676 {
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
677 const unsigned char *data;
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
678 size_t data_size;
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
679 int ret;
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
680
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
681 ret = imap_parser_read_args(parser, count, flags, args_r);
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
682 if (ret == -2) {
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
683 /* we should have noticed end of everything except atom */
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
684 if (parser->cur_type == ARG_PARSE_ATOM) {
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
685 data = i_stream_get_data(parser->input, &data_size);
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
686 imap_parser_save_arg(parser, data, data_size);
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
687 }
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
688 }
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
689 return finish_line(parser, count, args_r);
1661
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
690 }
566fb4bf7066 Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents: 1591
diff changeset
691
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
692 const char *imap_parser_read_word(struct imap_parser *parser)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
693 {
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 896
diff changeset
694 const unsigned char *data;
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 129
diff changeset
695 size_t i, data_size;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
696
898
0d5be52d7131 Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents: 896
diff changeset
697 data = i_stream_get_data(parser->input, &data_size);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
698
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
699 for (i = 0; i < data_size; i++) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
700 if (data[i] == ' ' || data[i] == '\r' || data[i] == '\n')
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
701 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
703
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
704 if (i < data_size) {
1591
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
705 data_size = i + (data[i] == ' ' ? 1 : 0);
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
706 parser->line_size += data_size;
6eca99b727a0 IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents: 1311
diff changeset
707 i_stream_skip(parser->input, data_size);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
708 return p_strndup(parser->pool, data, i);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
709 } else {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
710 return NULL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
711 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
712 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
713
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
714 const char *imap_arg_string(const struct imap_arg *arg)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
715 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
716 switch (arg->type) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
717 case IMAP_ARG_NIL:
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
718 return "";
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
719
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
720 case IMAP_ARG_ATOM:
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
721 case IMAP_ARG_STRING:
5837
5cd5f65a8dad imap_arg_string() should handle IMAP_ARG_LITERAL also.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
722 case IMAP_ARG_LITERAL:
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
723 return arg->_data.str;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
724
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
725 default:
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
726 return NULL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
727 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
728 }
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
729
6418
46d9ee79f292 Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
730 char *imap_arg_str_error(const struct imap_arg *arg)
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
731 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
732 i_panic("Tried to access imap_arg type %d as string", arg->type);
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6351
diff changeset
733 #ifndef ATTRS_DEFINED
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
734 return NULL;
4823
414c0c45040e Added some noreturn attributes and fixed warnings caused by them.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
735 #endif
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
736 }
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
737
6418
46d9ee79f292 Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
738 uoff_t imap_arg_literal_size_error(const struct imap_arg *arg)
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
739 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
740 i_panic("Tried to access imap_arg type %d as literal size", arg->type);
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6351
diff changeset
741 #ifndef ATTRS_DEFINED
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
742 return 0;
4823
414c0c45040e Added some noreturn attributes and fixed warnings caused by them.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
743 #endif
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
744 }
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
745
6418
46d9ee79f292 Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
746 ARRAY_TYPE(imap_arg_list) *imap_arg_list_error(const struct imap_arg *arg)
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
747 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
748 i_panic("Tried to access imap_arg type %d as list", arg->type);
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6351
diff changeset
749 #ifndef ATTRS_DEFINED
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
750 return NULL;
4823
414c0c45040e Added some noreturn attributes and fixed warnings caused by them.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
751 #endif
877
7935347f54f1 Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents: 825
diff changeset
752 }