#include <unistd.h>
#include <vstream.h>
#include <vstring.h>
#include <deliver_request.h>
#include <maps.h>
#include <mbox_conf.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;
char *sender;
char *orig_rcpt;
char *recipient;
long rcpt_offset;
char *user;
char *delivered;
char *relay;
long arrival_time;
} DELIVER_ATTR;
extern void deliver_attr_init(DELIVER_ATTR *);
extern void deliver_attr_dump(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.orig_rcpt, attr.recipient, \
attr.rcpt_offset, attr.relay, \
attr.arrival_time
#define SENT_ATTR(attr) attr.queue_id, attr.orig_rcpt, attr.recipient, \
attr.rcpt_offset, attr.relay, \
attr.arrival_time
#define COPY_ATTR(attr) attr.sender, attr.orig_rcpt, attr.delivered, \
attr.fp
#define MSG_LOG_STATE(m, p) \
msg_info("%s[%d]: recip %s deliver %s", m, \
p.level, \
p.msg_attr.recipient ? p.msg_attr.recipient : "", \
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;