#include <unistd.h>
#include <vstream.h>
#include <vstring.h>
#include <deliver_request.h>
#include <maps.h>
#include <mbox_conf.h>
#include <dsn_buf.h>
#include <dsn.h>
extern MAPS *virtual_mailbox_maps;
extern MAPS *virtual_uid_maps;
extern MAPS *virtual_gid_maps;
typedef struct USER_ATTR {
uid_t uid;
gid_t gid;
char *mailbox;
} USER_ATTR;
#define RESET_USER_ATTR(usr_attr, level) { \
usr_attr.uid = 0; usr_attr.gid = 0; usr_attr.mailbox = 0; \
if (msg_verbose) \
msg_info("%s[%d]: reset user_attr", myname, level); \
}
typedef struct DELIVER_ATTR {
int level;
VSTREAM *fp;
char *queue_name;
char *queue_id;
long offset;
const char *sender;
char *dsn_envid;
int dsn_ret;
RECIPIENT rcpt;
char *user;
const char *delivered;
char *relay;
MSG_STATS msg_stats;
DSN_BUF *why;
} DELIVER_ATTR;
extern void deliver_attr_init(DELIVER_ATTR *);
extern void deliver_attr_dump(DELIVER_ATTR *);
extern void deliver_attr_free(DELIVER_ATTR *);
#define FEATURE_NODELIVERED (1<<0)
typedef struct LOCAL_STATE {
int level;
DELIVER_ATTR msg_attr;
DELIVER_REQUEST *request;
} LOCAL_STATE;
#define BOUNCE_FLAGS(request) DEL_REQ_TRACE_FLAGS((request)->flags)
#define BOUNCE_ATTR(attr) \
attr.queue_id, &attr.msg_stats, &attr.rcpt, attr.relay, \
DSN_FROM_DSN_BUF(attr.why)
#define SENT_ATTR(attr) \
attr.queue_id, &attr.msg_stats, &attr.rcpt, attr.relay, \
DSN_FROM_DSN_BUF(attr.why)
#define COPY_ATTR(attr) \
attr.sender, attr.rcpt.orig_addr, attr.delivered, attr.fp
#define MSG_LOG_STATE(m, p) \
msg_info("%s[%d]: recip %s deliver %s", m, \
p.level, \
p.msg_attr.rcpt.address ? p.msg_attr.rcpt.address : "", \
p.msg_attr.delivered ? p.msg_attr.delivered : "")
extern int deliver_recipient(LOCAL_STATE, USER_ATTR);
extern int deliver_mailbox(LOCAL_STATE, USER_ATTR, int *);
extern int deliver_file(LOCAL_STATE, USER_ATTR, char *);
extern int deliver_maildir(LOCAL_STATE, USER_ATTR);
extern int deliver_unknown(LOCAL_STATE);
extern int virtual_mbox_lock_mask;
#define STR(s) vstring_str(s)