#ifndef _MILTER_H_INCLUDED_
#define _MILTER_H_INCLUDED_
#include <vstring.h>
#include <vstream.h>
#include <argv.h>
typedef struct MILTER {
char *name;
struct MILTER *next;
struct MILTERS *parent;
const char *(*conn_event) (struct MILTER *, const char *, const char *, const char *, unsigned, ARGV *);
const char *(*helo_event) (struct MILTER *, const char *, int, ARGV *);
const char *(*mail_event) (struct MILTER *, const char **, ARGV *);
const char *(*rcpt_event) (struct MILTER *, const char **, ARGV *);
const char *(*data_event) (struct MILTER *, ARGV *);
const char *(*message) (struct MILTER *, VSTREAM *, off_t, ARGV *);
const char *(*unknown_event) (struct MILTER *, const char *, ARGV *);
const char *(*other_event) (struct MILTER *);
void (*abort) (struct MILTER *);
void (*disc_event) (struct MILTER *);
int (*active) (struct MILTER *);
int (*send) (struct MILTER *, VSTREAM *);
void (*free) (struct MILTER *);
} MILTER;
extern MILTER *milter8_create(const char *, int, int, int, const char *, const char *, struct MILTERS *);
extern MILTER *milter8_receive(VSTREAM *, struct MILTERS *);
typedef struct MILTERS {
MILTER *milter_list;
const char *(*mac_lookup) (const char *, void *);
void *mac_context;
char *conn_macros;
char *helo_macros;
char *mail_macros;
char *rcpt_macros;
char *data_macros;
char *eod_macros;
char *unk_macros;
void *chg_context;
const char *(*add_header) (void *, char *, char *);
const char *(*upd_header) (void *, ssize_t, char *, char *);
const char *(*del_header) (void *, ssize_t, char *);
const char *(*ins_header) (void *, ssize_t, char *, char *);
const char *(*add_rcpt) (void *, char *);
const char *(*del_rcpt) (void *, char *);
const char *(*repl_body) (void *, int, VSTRING *);
} MILTERS;
typedef const char *(*MILTER_MAC_LOOKUP_FN) (const char *, void *);
typedef const char *(*MILTER_ADD_HEADER_FN) (void *, char *, char *);
typedef const char *(*MILTER_EDIT_HEADER_FN) (void *, ssize_t, char *, char *);
typedef const char *(*MILTER_DEL_HEADER_FN) (void *, ssize_t, char *);
typedef const char *(*MILTER_EDIT_RCPT_FN) (void *, char *);
typedef const char *(*MILTER_EDIT_BODY_FN) (void *, int, VSTRING *);
extern MILTERS *milter_create(const char *, int, int, int,
const char *, const char *,
const char *, const char *,
const char *, const char *,
const char *, const char *,
const char *);
extern void milter_macro_callback(MILTERS *, MILTER_MAC_LOOKUP_FN, void *);
extern void milter_edit_callback(MILTERS *milters, MILTER_ADD_HEADER_FN,
MILTER_EDIT_HEADER_FN, MILTER_EDIT_HEADER_FN,
MILTER_DEL_HEADER_FN, MILTER_EDIT_RCPT_FN,
MILTER_EDIT_RCPT_FN, MILTER_EDIT_BODY_FN,
void *);
extern const char *milter_conn_event(MILTERS *, const char *, const char *, const char *, unsigned);
extern const char *milter_helo_event(MILTERS *, const char *, int);
extern const char *milter_mail_event(MILTERS *, const char **);
extern const char *milter_rcpt_event(MILTERS *, const char **);
extern const char *milter_data_event(MILTERS *);
extern const char *milter_message(MILTERS *, VSTREAM *, off_t);
extern const char *milter_unknown_event(MILTERS *, const char *);
extern const char *milter_other_event(MILTERS *);
extern void milter_abort(MILTERS *);
extern void milter_disc_event(MILTERS *);
extern int milter_send(MILTERS *, VSTREAM *);
extern MILTERS *milter_receive(VSTREAM *, int);
extern void milter_free(MILTERS *);
#define MILTER_BODY_START 1
#define MILTER_BODY_LINE 2
#define MILTER_BODY_END 3
#define S8_MAC__ "{_}"
#define S8_MAC_J "{j}"
#define S8_MAC_V "{v}"
#define S8_MAC_DAEMON_NAME "{daemon_name}"
#define S8_MAC_IF_NAME "{if_name}"
#define S8_MAC_IF_ADDR "{if_addr}"
#define S8_MAC_CLIENT_ADDR "{client_addr}"
#define S8_MAC_CLIENT_CONN "{client_connections}"
#define S8_MAC_CLIENT_NAME "{client_name}"
#define S8_MAC_CLIENT_PTR "{client_ptr}"
#define S8_MAC_CLIENT_RES "{client_resolve}"
#define S8_MAC_TLS_VERSION "{tls_version}"
#define S8_MAC_CIPHER "{cipher}"
#define S8_MAC_CIPHER_BITS "{cipher_bits}"
#define S8_MAC_CERT_SUBJECT "{cert_subject}"
#define S8_MAC_CERT_ISSUER "{cert_issuer}"
#define S8_MAC_I "{i}"
#define S8_MAC_AUTH_TYPE "{auth_type}"
#define S8_MAC_AUTH_AUTHEN "{auth_authen}"
#define S8_MAC_AUTH_AUTHOR "{auth_author}"
#define S8_MAC_MAIL_MAILER "{mail_mailer}"
#define S8_MAC_MAIL_HOST "{mail_host}"
#define S8_MAC_MAIL_ADDR "{mail_addr}"
#define S8_MAC_RCPT_MAILER "{rcpt_mailer}"
#define S8_MAC_RCPT_HOST "{rcpt_host}"
#define S8_MAC_RCPT_ADDR "{rcpt_addr}"
#endif