#include <unistd.h>
#ifdef USE_SASL_AUTH
#include <sasl.h>
#include <saslutil.h>
#endif
#include <vstream.h>
#include <vstring.h>
#include <argv.h>
#include <mail_stream.h>
#include <pfixtls.h>
typedef struct SMTPD_DEFER {
int active;
VSTRING *reason;
int class;
} SMTPD_DEFER;
typedef struct SMTPD_STATE {
int err;
VSTREAM *client;
VSTRING *buffer;
time_t time;
char *name;
char *addr;
char *namaddr;
int peer_code;
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 *recipient;
char *etrn_name;
char *protocol;
char *where;
int recursion;
off_t msg_size;
int junk_cmds;
#ifdef USE_SASL_AUTH
#if SASL_VERSION_MAJOR >= 2
const char *sasl_mechanism_list;
#else
char *sasl_mechanism_list;
#endif
char *sasl_method;
char *sasl_username;
char *sasl_sender;
sasl_conn_t *sasl_conn;
VSTRING *sasl_encoded;
VSTRING *sasl_decoded;
int pw_server_enabled;
int pw_server_opts;
char *pw_server_mechanism_list;
#endif
int 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;
VSTRING *expand_buf;
int tls_active;
int tls_use_tls;
int tls_enforce_tls;
int tls_auth_only;
tls_info_t tls_info;
} SMTPD_STATE;
extern void smtpd_state_init(SMTPD_STATE *, VSTREAM *);
extern void smtpd_state_reset(SMTPD_STATE *);
#define SMTPD_AFTER_CONNECT "CONNECT"
#define SMTPD_AFTER_DOT "END-OF-MESSAGE"
#define SMTPD_STAND_ALONE(state) \
(state->client == VSTREAM_IN && getuid() != var_owner_uid)
void smtpd_peer_init(SMTPD_STATE *state);
void smtpd_peer_reset(SMTPD_STATE *state);