mail-search-register-human.c revision 00120655cf38b7981ea65abb73330e338bc78f5b
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra#include "lib.h"
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra#include "ioloop.h"
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra#include "array.h"
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra#include "settings-parser.h"
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra#include "imap-date.h"
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra#include "mail-search-register.h"
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra#include "mail-search-parser.h"
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra#include "mail-search-build.h"
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra#include <time.h>
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra#include <ctype.h>
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrastruct mail_search_register *mail_search_register_human;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrastatic struct mail_search_arg *
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrahuman_search_or(struct mail_search_build_context *ctx)
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra{
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra struct mail_search_arg *sarg;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra /* this changes the parent arg to be an OR block instead of AND block */
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills ctx->parent->type = SEARCH_OR;
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills if (mail_search_build_key(ctx, ctx->parent, &sarg) < 0)
9d8d9e1151895fac86a2e3216647dd2a020ecf71Garrett D'Amore return NULL;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra return sarg;
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills}
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Millsstatic struct mail_search_arg *
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Millsarg_new_human_date(struct mail_search_build_context *ctx,
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills enum mail_search_arg_type type,
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills enum mail_search_date_type date_type)
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills{
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills struct mail_search_arg *sarg;
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills const char *value, *error;
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills struct tm tm;
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills unsigned int secs;
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills sarg = mail_search_build_new(ctx, type);
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills if (mail_search_parse_string(ctx->parser, &value) < 0)
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills return NULL;
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills /* a) yyyy-mm-dd
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills b) imap date
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills c) interval (e.g. n days) */
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills if (i_isdigit(value[0]) && i_isdigit(value[1]) &&
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills i_isdigit(value[2]) && i_isdigit(value[3]) && value[4] == '-' &&
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills i_isdigit(value[5]) && i_isdigit(value[6]) && value[7] == '-' &&
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills i_isdigit(value[8]) && i_isdigit(value[9]) && value[10] == '\0') {
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills memset(&tm, 0, sizeof(tm));
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills tm.tm_year = (value[0]-'0') * 1000 + (value[1]-'0') * 100 +
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills (value[2]-'0') * 10 + (value[3]-'0') - 1900;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra tm.tm_mon = (value[5]-'0') * 10 + (value[6]-'0') - 1;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra tm.tm_mday = (value[8]-'0') * 10 + (value[9]-'0');
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra sarg->value.time = mktime(&tm);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra } else if (imap_parse_date(value, &sarg->value.time)) {
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra /* imap date */
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra } else if (settings_get_time(value, &secs, &error) == 0) {
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra sarg->value.time = ioloop_time - secs;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra } else {
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra sarg->value.time = (time_t)-1;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra }
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra sarg->value.search_flags = MAIL_SEARCH_ARG_FLAG_USE_TZ;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra if (sarg->value.time == (time_t)-1) {
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra ctx->_error = p_strconcat(ctx->pool,
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra "Invalid search date parameter: ", value, NULL);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra return NULL;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra }
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra sarg->value.date_type = date_type;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra return sarg;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra}
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra#define CALLBACK_DATE(_func, _type, _date_type) \
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrastatic struct mail_search_arg *\
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrahuman_search_##_func(struct mail_search_build_context *ctx) \
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra{ \
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra return arg_new_human_date(ctx, _type, _date_type); \
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra}
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh MisraCALLBACK_DATE(before, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_RECEIVED);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh MisraCALLBACK_DATE(on, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_RECEIVED);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh MisraCALLBACK_DATE(since, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_RECEIVED);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary MillsCALLBACK_DATE(sentbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SENT);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh MisraCALLBACK_DATE(senton, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SENT);
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh MisraCALLBACK_DATE(sentsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SENT);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh MisraCALLBACK_DATE(savedbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SAVED);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh MisraCALLBACK_DATE(savedon, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SAVED);
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary MillsCALLBACK_DATE(savedsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SAVED);
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misrastatic struct mail_search_arg *
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Millsarg_new_human_size(struct mail_search_build_context *ctx,
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra enum mail_search_arg_type type)
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra{
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra struct mail_search_arg *sarg;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra const char *value, *error;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra sarg = mail_search_build_new(ctx, type);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra if (mail_search_parse_string(ctx->parser, &value) < 0)
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra return NULL;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra if (settings_get_size(value, &sarg->value.size, &error) < 0) {
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra ctx->_error = p_strdup(ctx->pool, error);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra return NULL;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra }
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra return sarg;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra}
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrastatic struct mail_search_arg *
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrahuman_search_larger(struct mail_search_build_context *ctx)
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra{
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra return arg_new_human_size(ctx, SEARCH_LARGER);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra}
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrastatic struct mail_search_arg *
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrahuman_search_smaller(struct mail_search_build_context *ctx)
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra{
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra return arg_new_human_size(ctx, SEARCH_SMALLER);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra}
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrastatic struct mail_search_arg *
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrahuman_search_guid(struct mail_search_build_context *ctx)
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra{
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra return mail_search_build_str(ctx, SEARCH_GUID);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra}
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrastatic struct mail_search_arg *
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrahuman_search_mailbox(struct mail_search_build_context *ctx)
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra{
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra return mail_search_build_str(ctx, SEARCH_MAILBOX_GLOB);
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra}
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrastatic struct mail_search_arg *
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrahuman_search_mailbox_guid(struct mail_search_build_context *ctx)
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra{
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra return mail_search_build_str(ctx, SEARCH_MAILBOX_GUID);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra}
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrastatic const struct mail_search_register_arg human_register_args[] = {
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "OR", human_search_or },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra /* dates */
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "BEFORE", human_search_before },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "ON", human_search_on },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "SINCE", human_search_since },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "SENTBEFORE", human_search_sentbefore },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "SENTON", human_search_senton },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "SENTSINCE", human_search_sentsince },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "SAVEDBEFORE", human_search_savedbefore },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "SAVEDON", human_search_savedon },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "SAVEDSINCE", human_search_savedsince },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "X-SAVEDBEFORE", human_search_savedbefore },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "X-SAVEDON", human_search_savedon },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "X-SAVEDSINCE", human_search_savedsince },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra /* sizes */
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "LARGER", human_search_larger },
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra { "SMALLER", human_search_smaller },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra /* Other Dovecot extensions: */
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "GUID", human_search_guid },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "MAILBOX", human_search_mailbox },
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra { "MAILBOX-GUID", human_search_mailbox_guid }
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra};
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misrastruct mail_search_register *
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misramail_search_register_init_human(struct mail_search_register *imap_register)
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra{
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra struct mail_search_register *reg;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra mail_search_register_fallback_t *fallback;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra ARRAY_DEFINE(copy_args, const struct mail_search_register_arg);
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra const struct mail_search_register_arg *human_args, *imap_args;
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra unsigned int i, j, human_count, imap_count;
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra int ret;
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra reg = mail_search_register_init();
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra mail_search_register_add(reg, human_register_args,
015a6ef6781cc3ceba8ad3bfbae98449b6002a1fSaurabh Misra N_ELEMENTS(human_register_args));
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra /* find and register args in imap that don't exist in human */
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra imap_args = mail_search_register_get(imap_register, &imap_count);
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra human_args = mail_search_register_get(reg, &human_count);
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills t_array_init(&copy_args, imap_count);
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra for (i = j = 0; i < imap_count && j < human_count; ) {
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra ret = strcmp(imap_args[i].key, human_args[j].key);
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra if (ret < 0) {
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra array_append(&copy_args, &imap_args[i], 1);
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra i++;
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra } else if (ret > 0) {
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra j++;
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra } else {
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra i++; j++;
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra }
0eb090a7674ebcdcb1c35501097edeb5f2395459Saurabh Misra }
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills for (; i < imap_count; i++)
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills array_append(&copy_args, &imap_args[i], 1);
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills imap_args = array_get(&copy_args, &imap_count);
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills mail_search_register_add(reg, imap_args, imap_count);
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills if (mail_search_register_get_fallback(imap_register, &fallback))
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills mail_search_register_fallback(reg, fallback);
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills return reg;
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills}
5e8715b93d1d651ab2805b5e6e98b17df49fa92fGary Mills