/* Get a header from an slist. */ static char *search_header(struct curl_slist *hdrlist, const char *hdr) { size_t len = strlen(hdr); char *value = NULL; for(; !value && hdrlist; hdrlist = hdrlist->next) value = match_header(hdrlist, hdr, len); return value; }
static int match_messages(char * message, size_t size, struct mailimf_fields * fields, int32_t flags, char * charset, struct mail_search_key * key) { clistiter * cur; size_t length; size_t cur_token; int r; switch (key->type) { /* flags */ case MAIL_SEARCH_KEY_ANSWERED: return ((flags & MAIL_FLAG_ANSWERED) != 0); case MAIL_SEARCH_KEY_FLAGGED: return ((flags & MAIL_FLAG_FLAGGED) != 0); case MAIL_SEARCH_KEY_DELETED: return ((flags & MAIL_FLAG_DELETED) != 0); case MAIL_SEARCH_KEY_RECENT: return ((flags & MAIL_FLAG_NEW) != 0) && ((flags & MAIL_FLAG_SEEN) == 0); case MAIL_SEARCH_KEY_SEEN: return ((flags & MAIL_FLAG_SEEN) != 0); case MAIL_SEARCH_KEY_NEW: return ((flags & MAIL_FLAG_NEW) != 0); case MAIL_SEARCH_KEY_OLD: return ((flags & MAIL_FLAG_NEW) == 0); case MAIL_SEARCH_KEY_UNANSWERED: return ((flags & MAIL_FLAG_ANSWERED) == 0); case MAIL_SEARCH_KEY_UNDELETED: return ((flags & MAIL_FLAG_DELETED) == 0); case MAIL_SEARCH_KEY_UNFLAGGED: return ((flags & MAIL_FLAG_FLAGGED) == 0); case MAIL_SEARCH_KEY_UNSEEN: return ((flags & MAIL_FLAG_SEEN) == 0); /* headers */ case MAIL_SEARCH_KEY_BCC: return match_header(fields, "Bcc", key->bcc); case MAIL_SEARCH_KEY_CC: return match_header(fields, "Cc", key->cc); case MAIL_SEARCH_KEY_FROM: return match_header(fields, "From", key->from); case MAIL_SEARCH_KEY_SUBJECT: return match_header(fields, "Subject", key->subject); case MAIL_SEARCH_KEY_TO: return match_header(fields, "To", key->to); case MAIL_SEARCH_KEY_HEADER: return match_header(fields, key->header_name, key->header_value); /* date */ case MAIL_SEARCH_KEY_BEFORE: return (comp_date(fields, key->before) <= 0); case MAIL_SEARCH_KEY_ON: return (comp_date(fields, key->before) == 0); case MAIL_SEARCH_KEY_SINCE: return (comp_date(fields, key->before) >= 0); /* boolean */ case MAIL_SEARCH_KEY_NOT: return (!match_messages(message, size, fields, flags, charset, key->not)); case MAIL_SEARCH_KEY_OR: return (match_messages(message, size, fields, flags, charset, key->or1) || match_messages(message, size, fields, flags, charset, key->or2)); case MAIL_SEARCH_KEY_MULTIPLE: for(cur = clist_begin(key->multiple) ; cur != NULL ; cur = clist_next(cur)) { if (!match_messages(message, size, fields, flags, charset, clist_content(cur))) return FALSE; } return TRUE; /* size */ case MAIL_SEARCH_KEY_SMALLER: return (size <= key->smaller); case MAIL_SEARCH_KEY_LARGER: return (size >= key->larger); case MAIL_SEARCH_KEY_BODY: length = strlen(message); cur_token = 0; while (1) { r = mailimf_ignore_field_parse(message, length, &cur_token); if (r == MAILIMF_NO_ERROR) { /* do nothing */ } else break; } return (strstr(message + cur_token, key->body) != NULL); case MAIL_SEARCH_KEY_TEXT: return (strstr(message, key->body) != NULL); case MAIL_SEARCH_KEY_ALL: default: return TRUE; } }