cmd-sort.c revision d43bed2d458520fd01c28229ce2b178a4593a4a7
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
f1e9611e93dcb3b745c1904029084fa81644e1b3Timo Sirainenget_sort_program(struct client_command_context *cmd,
a04cd96888653891272a512f7735121193af7b35Timo Sirainen enum mail_sort_type program[MAX_SORT_PROGRAM_SIZE])
a04cd96888653891272a512f7735121193af7b35Timo Sirainen unsigned int i, pos;
63946971b08cfb1eec698c28569e1c4aa237852dTimo Sirainen /* empyty list */
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen client_send_command_error(cmd, "Empty sort program.");
a04cd96888653891272a512f7735121193af7b35Timo Sirainen for (; args->type == IMAP_ARG_ATOM || args->type == IMAP_ARG_STRING;
828edf966ee46f65ec5d907f310cab270e7e1088Timo Sirainen last_reverse = strcasecmp(arg, "reverse") == 0;
55a7410569737197afb302b07b488973324b0cc5Timo Sirainen for (i = 0; sort_names[i].type != MAIL_SORT_END; i++) {
a04cd96888653891272a512f7735121193af7b35Timo Sirainen /* @UNSAFE: mask check should prevent us from ever
a04cd96888653891272a512f7735121193af7b35Timo Sirainen overflowing */
828edf966ee46f65ec5d907f310cab270e7e1088Timo Sirainen client_send_command_error(cmd, "Sort list ends with REVERSE.");
55a7410569737197afb302b07b488973324b0cc5Timo Sirainen "Invalid sort list argument.");
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenbool cmd_sort(struct client_command_context *cmd)
d43bed2d458520fd01c28229ce2b178a4593a4a7Timo Sirainen enum mail_sort_type sort_program[MAX_SORT_PROGRAM_SIZE];
42507d758b053bb483de58fba55c73a9eb5d3fbaTimo Sirainen args_count = imap_parser_read_args(cmd->parser, 0, 0, &args);
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen client_send_command_error(cmd, args_count < 0 ? NULL :
55a7410569737197afb302b07b488973324b0cc5Timo Sirainen "Missing or invalid arguments.");
55a7410569737197afb302b07b488973324b0cc5Timo Sirainen /* sort program */
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen client_send_command_error(cmd, "Invalid sort argument.");
d43bed2d458520fd01c28229ce2b178a4593a4a7Timo Sirainen if (get_sort_program(cmd, IMAP_ARG_LIST_ARGS(args), sort_program) < 0)
55a7410569737197afb302b07b488973324b0cc5Timo Sirainen /* charset */
55a7410569737197afb302b07b488973324b0cc5Timo Sirainen if (args->type != IMAP_ARG_ATOM && args->type != IMAP_ARG_STRING) {
55a7410569737197afb302b07b488973324b0cc5Timo Sirainen "Invalid charset argument.");
d43bed2d458520fd01c28229ce2b178a4593a4a7Timo Sirainen ctx = p_new(cmd->pool, struct imap_search_context, 1);
d43bed2d458520fd01c28229ce2b178a4593a4a7Timo Sirainen if ((ret = cmd_search_parse_return_if_found(ctx, &args)) <= 0) {
d43bed2d458520fd01c28229ce2b178a4593a4a7Timo Sirainen /* error / waiting for unambiguity */
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen ret = imap_search_args_build(cmd, args, charset, &sargs);