#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 SMTPD_STATE {
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;
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;
VSTREAM *proxy;
VSTRING *proxy_buffer;
char *proxy_mail;
int proxy_xforward_features;
SMTPD_XFORWARD_ATTR xforward;
#ifdef USE_TLS
int tls_use_tls;
int tls_enforce_tls;
int tls_auth_only;
TLS_SESS_STATE *tls_context;
#endif
const char **milter_argv;
ssize_t milter_argc;
} SMTPD_STATE;
#define SMTPD_FLAG_HANGUP (1<<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)
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_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_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 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(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 FORWARD_CLIENT_ATTR(s, a) \
(((s)->xforward.flags & SMTPD_STATE_XFORWARD_CLIENT_MASK) ? \
(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 FORWARD_IDENT(s) \
(((s)->xforward.flags & SMTPD_STATE_XFORWARD_IDENT) ? \
(s)->queue_id : (s)->ident)
#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;
#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_GSSAPI 0x0008
extern int smtpd_pw_server_sasl_opts;
#endif