#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdlib.h>
#include "xmalloc.h"
#include "sieve_interface.h"
#include "interp.h"
int sieve_interp_alloc(sieve_interp_t **interp, void *interp_context)
{
sieve_interp_t *i;
static int initonce;
if (!initonce) {
initialize_siev_error_table();
initonce = 1;
}
*interp = NULL;
i = (sieve_interp_t *) xmalloc(sizeof(sieve_interp_t));
if (i == NULL) {
return SIEVE_NOMEM;
}
i->redirect = i->discard = i->reject = i->fileinto = i->keep = NULL;
i->getsize = NULL;
i->getheader = NULL;
i->getenvelope = NULL;
i->vacation = NULL;
i->notify = NULL;
i->markflags = NULL;
i->interp_context = interp_context;
i->err = NULL;
*interp = i;
return SIEVE_OK;
}
static const char *sieve_extensions = "fileinto reject envelope vacation"
" imapflags notify subaddress relational"
" comparator-i;ascii-numeric"
#ifdef ENABLE_REGEX
" regex";
#else
"";
#endif
const char *sieve_listextensions(void)
{
return sieve_extensions;
}
int sieve_interp_free(sieve_interp_t **interp)
{
free(*interp);
return SIEVE_OK;
}
int sieve_register_redirect(sieve_interp_t *interp, sieve_callback *f)
{
interp->redirect = f;
return SIEVE_OK;
}
int sieve_register_discard(sieve_interp_t *interp, sieve_callback *f)
{
interp->discard = f;
return SIEVE_OK;
}
int sieve_register_reject(sieve_interp_t *interp, sieve_callback *f)
{
interp->reject = f;
return SIEVE_OK;
}
int sieve_register_fileinto(sieve_interp_t *interp, sieve_callback *f)
{
interp->fileinto = f;
return SIEVE_OK;
}
int sieve_register_keep(sieve_interp_t *interp, sieve_callback *f)
{
interp->keep = f;
return SIEVE_OK;
}
static char *default_markflags[] = { "\\flagged" };
static sieve_imapflags_t default_mark = { default_markflags, 1 };
int sieve_register_imapflags(sieve_interp_t *interp, sieve_imapflags_t *mark)
{
interp->markflags =
(mark && mark->flag && mark->nflags) ? mark : &default_mark;
return SIEVE_OK;
}
int sieve_register_notify(sieve_interp_t *interp, sieve_callback *f)
{
interp->notify = f;
return SIEVE_OK;
}
int sieve_register_size(sieve_interp_t *interp, sieve_get_size *f)
{
interp->getsize = f;
return SIEVE_OK;
}
int sieve_register_header(sieve_interp_t *interp, sieve_get_header *f)
{
interp->getheader = f;
return SIEVE_OK;
}
int sieve_register_envelope(sieve_interp_t *interp, sieve_get_envelope *f)
{
interp->getenvelope = f;
return SIEVE_OK;
}
int sieve_register_vacation(sieve_interp_t *interp, sieve_vacation_t *v)
{
if (!interp->getenvelope) {
return SIEVE_NOT_FINALIZED;
}
if (v->min_response == 0) v->min_response = 3;
if (v->max_response == 0) v->max_response = 90;
if (v->min_response < 0 || v->max_response < 7 || !v->autorespond
|| !v->send_response) {
return SIEVE_FAIL;
}
interp->vacation = v;
return SIEVE_OK;
}
int sieve_register_parse_error(sieve_interp_t *interp, sieve_parse_error *f)
{
interp->err = f;
return SIEVE_OK;
}
int sieve_register_execute_error(sieve_interp_t *interp, sieve_execute_error *f)
{
interp->execute_err = f;
return SIEVE_OK;
}
int interp_verify(sieve_interp_t *i)
{
if (i->redirect && i->keep && i->getsize && i->getheader) {
return SIEVE_OK;
} else {
return SIEVE_NOT_FINALIZED;
}
}