#include <sys_defs.h>
#include <msg.h>
#include <attr.h>
#include <mymalloc.h>
#include <vstring.h>
#include <mail_proto.h>
#include <milter.h>
#define MAIL_ATTR_MILT_MAC_CONN "conn_macros"
#define MAIL_ATTR_MILT_MAC_HELO "helo_macros"
#define MAIL_ATTR_MILT_MAC_MAIL "mail_macros"
#define MAIL_ATTR_MILT_MAC_RCPT "rcpt_macros"
#define MAIL_ATTR_MILT_MAC_DATA "data_macros"
#define MAIL_ATTR_MILT_MAC_EOH "eoh_macros"
#define MAIL_ATTR_MILT_MAC_EOD "eod_macros"
#define MAIL_ATTR_MILT_MAC_UNK "unk_macros"
int milter_macros_print(ATTR_PRINT_MASTER_FN print_fn, VSTREAM *fp,
int flags, void *ptr)
{
MILTER_MACROS *mp = (MILTER_MACROS *) ptr;
int ret;
ret = print_fn(fp, flags | ATTR_FLAG_MORE,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_CONN, mp->conn_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_HELO, mp->helo_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_MAIL, mp->mail_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_RCPT, mp->rcpt_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_DATA, mp->data_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_EOH, mp->eoh_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_EOD, mp->eod_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_UNK, mp->unk_macros,
ATTR_TYPE_END);
return (ret);
}
int milter_macros_scan(ATTR_SCAN_MASTER_FN scan_fn, VSTREAM *fp,
int flags, void *ptr)
{
MILTER_MACROS *mp = (MILTER_MACROS *) ptr;
int ret;
VSTRING *conn_macros = vstring_alloc(10);
VSTRING *helo_macros = vstring_alloc(10);
VSTRING *mail_macros = vstring_alloc(10);
VSTRING *rcpt_macros = vstring_alloc(10);
VSTRING *data_macros = vstring_alloc(10);
VSTRING *eoh_macros = vstring_alloc(10);
VSTRING *eod_macros = vstring_alloc(10);
VSTRING *unk_macros = vstring_alloc(10);
ret = scan_fn(fp, flags | ATTR_FLAG_MORE,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_CONN, conn_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_HELO, helo_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_MAIL, mail_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_RCPT, rcpt_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_DATA, data_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_EOH, eoh_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_EOD, eod_macros,
ATTR_TYPE_STR, MAIL_ATTR_MILT_MAC_UNK, unk_macros,
ATTR_TYPE_END);
mp->conn_macros = vstring_export(conn_macros);
mp->helo_macros = vstring_export(helo_macros);
mp->mail_macros = vstring_export(mail_macros);
mp->rcpt_macros = vstring_export(rcpt_macros);
mp->data_macros = vstring_export(data_macros);
mp->eoh_macros = vstring_export(eoh_macros);
mp->eod_macros = vstring_export(eod_macros);
mp->unk_macros = vstring_export(unk_macros);
return (ret == 8 ? 1 : -1);
}
MILTER_MACROS *milter_macros_create(const char *conn_macros,
const char *helo_macros,
const char *mail_macros,
const char *rcpt_macros,
const char *data_macros,
const char *eoh_macros,
const char *eod_macros,
const char *unk_macros)
{
MILTER_MACROS *mp;
mp = (MILTER_MACROS *) mymalloc(sizeof(*mp));
mp->conn_macros = mystrdup(conn_macros);
mp->helo_macros = mystrdup(helo_macros);
mp->mail_macros = mystrdup(mail_macros);
mp->rcpt_macros = mystrdup(rcpt_macros);
mp->data_macros = mystrdup(data_macros);
mp->eoh_macros = mystrdup(eoh_macros);
mp->eod_macros = mystrdup(eod_macros);
mp->unk_macros = mystrdup(unk_macros);
return (mp);
}
MILTER_MACROS *milter_macros_alloc(int mode)
{
MILTER_MACROS *mp;
#define milter_macros_init(mp, expr) do { \
MILTER_MACROS *__mp = (mp); \
char *__expr = (expr); \
__mp->conn_macros = __expr; \
__mp->helo_macros = __expr; \
__mp->mail_macros = __expr; \
__mp->rcpt_macros = __expr; \
__mp->data_macros = __expr; \
__mp->eoh_macros = __expr; \
__mp->eod_macros = __expr; \
__mp->unk_macros = __expr; \
} while (0)
mp = (MILTER_MACROS *) mymalloc(sizeof(*mp));
switch (mode) {
case MILTER_MACROS_ALLOC_ZERO:
milter_macros_init(mp, 0);
break;
case MILTER_MACROS_ALLOC_EMPTY:
milter_macros_init(mp, mystrdup(""));
break;
default:
msg_panic("milter_macros_alloc: unknown mode %d", mode);
}
return (mp);
}
void milter_macros_free(MILTER_MACROS *mp)
{
#define milter_macros_wipe(mp) do { \
MILTER_MACROS *__mp = mp; \
if (__mp->conn_macros) \
myfree(__mp->conn_macros); \
if (__mp->helo_macros) \
myfree(__mp->helo_macros); \
if (__mp->mail_macros) \
myfree(__mp->mail_macros); \
if (__mp->rcpt_macros) \
myfree(__mp->rcpt_macros); \
if (__mp->data_macros) \
myfree(__mp->data_macros); \
if (__mp->eoh_macros) \
myfree(__mp->eoh_macros); \
if (__mp->eod_macros) \
myfree(__mp->eod_macros); \
if (__mp->unk_macros) \
myfree(__mp->unk_macros); \
} while (0)
milter_macros_wipe(mp);
myfree((char *) mp);
}