4 * Implements the SEARCH command in IMAP.
5 * This command is way too convoluted. Marc Crispin is a fscking idiot.
18 #include <sys/types.h>
27 #include "sysdep_decls.h"
28 #include "citserver.h"
31 #include "dynloader.h"
38 #include "internet_addressing.h"
39 #include "mime_parser.h"
40 #include "serv_imap.h"
41 #include "imap_tools.h"
42 #include "imap_fetch.h"
43 #include "imap_search.h"
52 * imap_do_search() calls imap_do_search_msg() to output the deta of an
53 * individual message, once it has been successfully loaded from disk.
55 void imap_do_search_msg(int seq, struct CtdlMessage *msg,
56 int num_items, char **itemlist, int is_uid) {
60 is_valid = 1; /* FIXME ... replace with a real test */
63 * If the message meets the specified search criteria, output its
64 * sequence number *or* UID, depending on what the client wants.
67 if (is_uid) cprintf("%ld ", IMAP->msgids[seq-1]);
68 else cprintf("%d ", seq);
76 * imap_search() calls imap_do_search() to do its actual work, once it's
77 * validated and boiled down the request a bit.
79 void imap_do_search(int num_items, char **itemlist, int is_uid) {
81 struct CtdlMessage *msg;
84 if (IMAP->num_msgs > 0)
85 for (i = 0; i < IMAP->num_msgs; ++i)
86 if (IMAP->flags[i] && IMAP_FETCHED) {
87 msg = CtdlFetchMessage(IMAP->msgids[i]);
89 imap_do_search_msg(i+1, msg, num_items,
94 lprintf(1, "SEARCH internal error\n");
102 * This function is called by the main command loop.
104 void imap_search(int num_parms, char *parms[]) {
111 cprintf("%s BAD invalid parameters\r\n", parms[0]);
115 imap_pick_range(parms[2], 0);
118 for (i=3; i<num_parms; ++i) {
119 strcat(items, parms[i]);
120 if (i < (num_parms-1)) strcat(items, " ");
123 num_items = imap_extract_data_items(itemlist, items);
125 cprintf("%s BAD invalid data item list\r\n", parms[0]);
129 imap_do_search(num_items, itemlist, 0);
130 cprintf("%s OK SEARCH completed\r\n", parms[0]);
134 * This function is called by the main command loop.
136 void imap_uidsearch(int num_parms, char *parms[]) {
143 cprintf("%s BAD invalid parameters\r\n", parms[0]);
147 imap_pick_range(parms[3], 1);
150 for (i=4; i<num_parms; ++i) {
151 strcat(items, parms[i]);
152 if (i < (num_parms-1)) strcat(items, " ");
155 num_items = imap_extract_data_items(itemlist, items);
157 cprintf("%s BAD invalid data item list\r\n", parms[0]);
161 imap_do_search(num_items, itemlist, 1);
162 cprintf("%s OK UID SEARCH completed\r\n", parms[0]);