Mercurial > dovecot > core-2.2
changeset 16915:0c4ee3b9fa3b
lib-imap: Added IMAP_PARSE_FLAG_STOP_AT_LIST for stopping after '('
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 02 Nov 2013 20:09:28 +0200 |
parents | 09d5728a69d1 |
children | 0a08efeb3f40 |
files | src/lib-imap/imap-parser.c src/lib-imap/imap-parser.h |
diffstat | 2 files changed, 11 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-imap/imap-parser.c Sat Nov 02 20:05:08 2013 +0200 +++ b/src/lib-imap/imap-parser.c Sat Nov 02 20:09:28 2013 +0200 @@ -609,6 +609,10 @@ break; case '(': imap_parser_open_list(parser); + if ((parser->flags & IMAP_PARSE_FLAG_STOP_AT_LIST) != 0) { + i_stream_skip(parser->input, 1); + return FALSE; + } break; case ')': if (!imap_parser_close_list(parser)) @@ -690,7 +694,8 @@ /* ARG_PARSE_NONE checks that last argument isn't only partially parsed. */ #define IS_UNFINISHED(parser) \ ((parser)->cur_type != ARG_PARSE_NONE || \ - (parser)->cur_list != &parser->root_list) + ((parser)->cur_list != &parser->root_list && \ + ((parser)->flags & IMAP_PARSE_FLAG_STOP_AT_LIST) == 0)) static int finish_line(struct imap_parser *parser, unsigned int count, const struct imap_arg **args_r) @@ -703,7 +708,8 @@ parser->cur_pos = 0; parser->cur_resp_text = FALSE; - if (parser->list_arg != NULL && !parser->literal_size_return) { + if (parser->list_arg != NULL && !parser->literal_size_return && + (parser->flags & IMAP_PARSE_FLAG_STOP_AT_LIST) == 0) { parser->error = "Missing ')'"; *args_r = NULL; return -1;
--- a/src/lib-imap/imap-parser.h Sat Nov 02 20:05:08 2013 +0200 +++ b/src/lib-imap/imap-parser.h Sat Nov 02 20:09:28 2013 +0200 @@ -24,7 +24,9 @@ /* We're parsing IMAP server replies. Parse the "text" after OK/NO/BAD/BYE replies as a single atom. We assume that the initial "*" or tag was already skipped over. */ - IMAP_PARSE_FLAG_SERVER_TEXT = 0x80 + IMAP_PARSE_FLAG_SERVER_TEXT = 0x80, + /* Parse until '(' and return it as an empty list */ + IMAP_PARSE_FLAG_STOP_AT_LIST = 0x100 }; struct imap_parser;