#include <sys/time.h>
#include <unistd.h>
#include <vstream.h>
#include <vstring.h>
#include <argv.h>
#include <myaddrinfo.h>
#include <mail_stream.h>
#include <tls.h>
#include <milter.h>
typedef struct SMTPD_DEFER {
int active;
VSTRING *reason;
VSTRING *dsn;
int code;
int class;
} SMTPD_DEFER;
typedef struct {
int flags;
char *name;
char *addr;
char *port;
char *namaddr;
char *rfc_addr;
char *protocol;
char *helo_name;
char *ident;
char *domain;
} SMTPD_XFORWARD_ATTR;
typedef struct {
int flags;
int err;
VSTREAM *client;
VSTRING *buffer;
VSTRING *addr_buf;
char *service;
struct timeval arrival_time;
char *name;
char *reverse_name;
char *addr;
char *port;
char *namaddr;
char *rfc_addr;
int addr_family;
struct sockaddr_storage sockaddr;
int name_status;
int reverse_name_status;
int conn_count;
int conn_rate;
int error_count;
int error_mask;
int notify_mask;
char *helo_name;
char *queue_id;
VSTREAM *cleanup;
MAIL_STREAM *dest;
int rcpt_count;
char *access_denied;
ARGV *history;
char *reason;
char *sender;
char *encoding;
char *verp_delims;
char *recipient;
char *etrn_name;
char *protocol;
char *where;
int recursion;
int chunking;
void *chunking_context;
off_t msg_size;
off_t act_size;
int junk_cmds;
int rcpt_overshoot;
char *rewrite_context;
#ifdef USE_SASL_AUTH
struct XSASL_SERVER *sasl_server;
VSTRING *sasl_reply;
char *sasl_mechanism_list;
char *sasl_method;
char *sasl_username;
char *sasl_sender;
#endif
int sender_rcptmap_checked;
int recipient_rcptmap_checked;
int warn_if_reject;
SMTPD_DEFER defer_if_reject;
SMTPD_DEFER defer_if_permit;
int defer_if_permit_client;
int defer_if_permit_helo;
int defer_if_permit_sender;
int discard;
char *saved_filter;
char *saved_redirect;
char *saved_bcc;
int saved_flags;
#ifdef DELAY_ACTION
int saved_delay;
#endif
VSTRING *expand_buf;
ARGV *prepend;
VSTRING *instance;
int seqno;
int ehlo_discard_mask;
char *dsn_envid;
int dsn_ret;
VSTRING *dsn_buf;
VSTRING *dsn_orcpt_buf;
struct SMTPD_PROXY *proxy;
char *proxy_mail;
SMTPD_XFORWARD_ATTR xforward;
#ifdef USE_TLS
#ifdef USE_TLSPROXY
VSTREAM *tlsproxy;
#endif
TLS_SESS_STATE *tls_context;
#endif
const char **milter_argv;
ssize_t milter_argc;
const char *milter_reject_text;
VSTRING *ehlo_buf;
ARGV *ehlo_argv;
} SMTPD_STATE;
#define SMTPD_FLAG_HANGUP (1<<0)
#define SMTPD_FLAG_ILL_PIPELINING (1<<1)
#define SMTPD_FLAG_AUTH_USED (1<<2)
#define SMTPD_MASK_MAIL_KEEP ~0
#define SMTPD_STATE_XFORWARD_INIT (1<<0)
#define SMTPD_STATE_XFORWARD_NAME (1<<1)
#define SMTPD_STATE_XFORWARD_ADDR (1<<2)
#define SMTPD_STATE_XFORWARD_PROTO (1<<3)
#define SMTPD_STATE_XFORWARD_HELO (1<<4)
#define SMTPD_STATE_XFORWARD_IDENT (1<<5)
#define SMTPD_STATE_XFORWARD_DOMAIN (1<<6)
#define SMTPD_STATE_XFORWARD_PORT (1<<7)
#define SMTPD_STATE_XFORWARD_CLIENT_MASK \
(SMTPD_STATE_XFORWARD_NAME | SMTPD_STATE_XFORWARD_ADDR \
| SMTPD_STATE_XFORWARD_PROTO | SMTPD_STATE_XFORWARD_HELO \
| SMTPD_STATE_XFORWARD_PORT)
#define SMTPD_CHUNKING (1 << 0)
#define SMTPD_CHUNKING_CONT (1 << 1)
#define SMTPD_CHUNKING_LAST (1 << 2)
#define SMTPD_CHUNKING_BINARYMIME (1 << 3)
#define SMTPD_CHUNKING_NONZERO (1 << 4)
extern void smtpd_state_init(SMTPD_STATE *, VSTREAM *, const char *);
extern void smtpd_state_reset(SMTPD_STATE *);
#define SMTPD_AFTER_CONNECT "CONNECT"
#define SMTPD_AFTER_DATA "DATA content"
#define SMTPD_AFTER_DOT "END-OF-MESSAGE"
#define SMTPD_CMD_HELO "HELO"
#define SMTPD_CMD_EHLO "EHLO"
#define SMTPD_CMD_STARTTLS "STARTTLS"
#define SMTPD_CMD_AUTH "AUTH"
#define SMTPD_CMD_MAIL "MAIL"
#define SMTPD_CMD_RCPT "RCPT"
#define SMTPD_CMD_DATA "DATA"
#define SMTPD_CMD_BURL "BURL"
#define SMTPD_CMD_BDAT "BDAT"
#define SMTPD_CMD_EOD SMTPD_AFTER_DOT
#define SMTPD_CMD_RSET "RSET"
#define SMTPD_CMD_NOOP "NOOP"
#define SMTPD_CMD_VRFY "VRFY"
#define SMTPD_CMD_ETRN "ETRN"
#define SMTPD_CMD_QUIT "QUIT"
#define SMTPD_CMD_XCLIENT "XCLIENT"
#define SMTPD_CMD_XFORWARD "XFORWARD"
#define SMTPD_CMD_UNKNOWN "UNKNOWN"
#define CLIENT_ATTR_UNKNOWN "unknown"
#define CLIENT_NAME_UNKNOWN CLIENT_ATTR_UNKNOWN
#define CLIENT_ADDR_UNKNOWN CLIENT_ATTR_UNKNOWN
#define CLIENT_PORT_UNKNOWN CLIENT_ATTR_UNKNOWN
#define CLIENT_NAMADDR_UNKNOWN CLIENT_ATTR_UNKNOWN
#define CLIENT_HELO_UNKNOWN 0
#define CLIENT_PROTO_UNKNOWN CLIENT_ATTR_UNKNOWN
#define CLIENT_IDENT_UNKNOWN 0
#define CLIENT_DOMAIN_UNKNOWN 0
#define CLIENT_LOGIN_UNKNOWN 0
#define IS_AVAIL_CLIENT_ATTR(v) ((v) && strcmp((v), CLIENT_ATTR_UNKNOWN))
#define IS_AVAIL_CLIENT_NAME(v) IS_AVAIL_CLIENT_ATTR(v)
#define IS_AVAIL_CLIENT_ADDR(v) IS_AVAIL_CLIENT_ATTR(v)
#define IS_AVAIL_CLIENT_PORT(v) IS_AVAIL_CLIENT_ATTR(v)
#define IS_AVAIL_CLIENT_NAMADDR(v) IS_AVAIL_CLIENT_ATTR(v)
#define IS_AVAIL_CLIENT_HELO(v) ((v) != 0)
#define IS_AVAIL_CLIENT_PROTO(v) IS_AVAIL_CLIENT_ATTR(v)
#define IS_AVAIL_CLIENT_IDENT(v) ((v) != 0)
#define IS_AVAIL_CLIENT_DOMAIN(v) ((v) != 0)
#define SMTPD_STAND_ALONE_STREAM(stream) \
(stream == VSTREAM_IN && getuid() != var_owner_uid)
#define SMTPD_STAND_ALONE(state) \
(state->client == VSTREAM_IN && getuid() != var_owner_uid)
#define USE_SMTPD_PROXY(state) \
(SMTPD_STAND_ALONE(state) == 0 && *var_smtpd_proxy_filt)
extern void smtpd_peer_init(SMTPD_STATE *state);
extern void smtpd_peer_reset(SMTPD_STATE *state);
#define SMTPD_PEER_CODE_OK 2
#define SMTPD_PEER_CODE_TEMP 4
#define SMTPD_PEER_CODE_PERM 5
#define SMTPD_PEER_CODE_FORGED 6
#define SMTPD_BUILD_NAMADDRPORT(name, addr, port) \
concatenate((name), "[", (addr), "]", \
var_smtpd_client_port_log ? ":" : (char *) 0, \
(port), (char *) 0)
#define HAVE_FORWARDED_CLIENT_ATTR(s) \
((s)->xforward.flags & SMTPD_STATE_XFORWARD_CLIENT_MASK)
#define FORWARD_CLIENT_ATTR(s, a) \
(HAVE_FORWARDED_CLIENT_ATTR(s) ? \
(s)->xforward.a : (s)->a)
#define FORWARD_ADDR(s) FORWARD_CLIENT_ATTR((s), rfc_addr)
#define FORWARD_NAME(s) FORWARD_CLIENT_ATTR((s), name)
#define FORWARD_NAMADDR(s) FORWARD_CLIENT_ATTR((s), namaddr)
#define FORWARD_PROTO(s) FORWARD_CLIENT_ATTR((s), protocol)
#define FORWARD_HELO(s) FORWARD_CLIENT_ATTR((s), helo_name)
#define FORWARD_PORT(s) FORWARD_CLIENT_ATTR((s), port)
#define HAVE_FORWARDED_IDENT(s) \
((s)->xforward.ident != 0)
#define FORWARD_IDENT(s) \
(HAVE_FORWARDED_IDENT(s) ? \
(s)->xforward.ident : (s)->queue_id)
#define FORWARD_DOMAIN(s) \
(((s)->xforward.flags & SMTPD_STATE_XFORWARD_DOMAIN) ? \
(s)->xforward.domain : (s)->rewrite_context)
extern void smtpd_xforward_init(SMTPD_STATE *);
extern void smtpd_xforward_preset(SMTPD_STATE *);
extern void smtpd_xforward_reset(SMTPD_STATE *);
extern int smtpd_input_transp_mask;
extern MILTERS *smtpd_milters;
extern double smtpd_space_multf;
#ifdef __APPLE_OS_X_SERVER__
#define PW_SERVER_NONE 0x0000
#define PW_SERVER_LOGIN 0x0001
#define PW_SERVER_PLAIN 0x0002
#define PW_SERVER_CRAM_MD5 0x0004
#define PW_SERVER_DIGEST_MD5 0x0008
#define PW_SERVER_GSSAPI 0x0010
extern int smtpd_pw_server_sasl_opts;
#endif