bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2006-2018 Dovecot authors, see the included COPYING file */
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen#include "lib.h"
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen#include "array.h"
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen#include "imap-match.h"
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen#include "expire-set.h"
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainenstruct expire_set {
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen pool_t pool;
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen ARRAY(struct imap_match_glob *) globs;
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen};
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainenstruct expire_set *expire_set_init(const char *const *patterns)
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen{
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen struct expire_set *set;
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen struct imap_match_glob *glob;
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen const char *const *pattern;
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen pool_t pool;
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen pool = pool_alloconly_create("Expire pool", 512);
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen set = p_new(pool, struct expire_set, 1);
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen set->pool = pool;
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen p_array_init(&set->globs, set->pool, 16);
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen for (pattern = patterns; *pattern != NULL; pattern++) {
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen glob = imap_match_init(set->pool, *pattern, TRUE, '/');
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen array_append(&set->globs, &glob, 1);
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen }
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen return set;
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen}
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainenvoid expire_set_deinit(struct expire_set **_set)
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen{
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen struct expire_set *set = *_set;
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen *_set = NULL;
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen pool_unref(&set->pool);
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen}
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainenbool expire_set_lookup(struct expire_set *set, const char *mailbox)
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen{
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen struct imap_match_glob *const *globp;
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen array_foreach(&set->globs, globp) {
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen if (imap_match(*globp, mailbox) == IMAP_MATCH_YES)
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen return TRUE;
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen }
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen return FALSE;
f6d57a2c182f63cd52819f0abb3c3d9f828afe19Timo Sirainen}