#include <htable.h>
#include <vstream.h>
#include <vstring.h>
#include <been_here.h>
#include <tok822.h>
#include <deliver_request.h>
#include <mbox_conf.h>
#include <maps.h>
#include <dsn_buf.h>
#include <dsn.h>
typedef struct USER_ATTR {
uid_t uid;
gid_t gid;
char *home;
char *logname;
char *shell;
} USER_ATTR;
#define RESET_USER_ATTR(usr_attr, level) { \
usr_attr.uid = 0; usr_attr.gid = 0; usr_attr.home = 0; \
usr_attr.logname = 0; usr_attr.shell = 0; \
if (msg_verbose) \
msg_info("%s[%d]: reset user_attr", myname, level); \
}
#define SET_USER_ATTR(usr_attr, pwd, level) { \
usr_attr.uid = pwd->pw_uid; usr_attr.gid = pwd->pw_gid; \
usr_attr.home = pwd->pw_dir; usr_attr.logname = pwd->pw_name; \
usr_attr.shell = pwd->pw_shell; \
if (msg_verbose) \
msg_info("%s[%d]: set user_attr: %s", \
myname, level, pwd->pw_name); \
}
typedef struct DELIVER_ATTR {
int level;
VSTREAM *fp;
char *queue_name;
char *queue_id;
long offset;
char *encoding;
const char *sender;
char *dsn_envid;
int dsn_ret;
RECIPIENT rcpt;
char *domain;
char *local;
char *user;
char *extension;
char *unmatched;
const char *owner;
const char *delivered;
char *relay;
MSG_STATS msg_stats;
int exp_type;
char *exp_from;
DELIVER_REQUEST *request;
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 EXPAND_TYPE_ALIAS (1<<0)
#define EXPAND_TYPE_FWD (1<<1)
#define EXPAND_TYPE_INCL (1<<2)
typedef struct LOCAL_STATE {
int level;
DELIVER_ATTR msg_attr;
BH_TABLE *dup_filter;
HTABLE *loop_info;
DELIVER_REQUEST *request;
} LOCAL_STATE;
#define RESET_OWNER_ATTR(msg_attr, level) { \
msg_attr.owner = 0; \
if (msg_verbose) \
msg_info("%s[%d]: reset owner attr", myname, level); \
}
#define SET_OWNER_ATTR(msg_attr, who, level) { \
msg_attr.sender = msg_attr.owner = who; \
if (msg_verbose) \
msg_info("%s[%d]: set owner attr: %s", \
myname, level, who); \
}
#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 BOUNCE_ONE_ATTR(attr) \
attr.queue_name, attr.queue_id, attr.encoding, \
attr.sender, attr.dsn_envid, attr.dsn_ret, \
&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 OPENED_ATTR(attr) \
attr.queue_id, attr.sender
#define COPY_ATTR(attr) \
attr.sender, attr.rcpt.orig_addr, attr.delivered, attr.fp
#define MSG_LOG_STATE(m, p) \
msg_info("%s[%d]: local %s recip %s exten %s deliver %s exp_from %s", \
m, \
p.level, \
p.msg_attr.local ? p.msg_attr.local : "" , \
p.msg_attr.rcpt.address ? p.msg_attr.rcpt.address : "", \
p.msg_attr.extension ? p.msg_attr.extension : "", \
p.msg_attr.delivered ? p.msg_attr.delivered : "", \
p.msg_attr.exp_from ? p.msg_attr.exp_from : "")
extern int deliver_recipient(LOCAL_STATE, USER_ATTR);
extern int deliver_alias(LOCAL_STATE, USER_ATTR, char *, int *);
extern int deliver_dotforward(LOCAL_STATE, USER_ATTR, int *);
extern int deliver_include(LOCAL_STATE, USER_ATTR, char *);
extern int deliver_token(LOCAL_STATE, USER_ATTR, TOK822 *);
extern int deliver_token_string(LOCAL_STATE, USER_ATTR, char *, int *);
extern int deliver_token_stream(LOCAL_STATE, USER_ATTR, VSTREAM *, int *);
extern int deliver_resolve_tree(LOCAL_STATE, USER_ATTR, TOK822 *);
extern int deliver_resolve_addr(LOCAL_STATE, USER_ATTR, char *);
extern int deliver_mailbox(LOCAL_STATE, USER_ATTR, int *);
extern int deliver_command(LOCAL_STATE, USER_ATTR, const char *);
extern int deliver_file(LOCAL_STATE, USER_ATTR, char *);
extern int deliver_indirect(LOCAL_STATE);
extern int deliver_maildir(LOCAL_STATE, USER_ATTR, char *);
extern int deliver_unknown(LOCAL_STATE, USER_ATTR);
extern int local_file_deliver_mask;
extern int local_cmd_deliver_mask;
extern int local_ext_prop_mask;
extern int local_mbox_lock_mask;
#define DELIVER_HDR_CMD (1<<0)
#define DELIVER_HDR_FILE (1<<1)
#define DELIVER_HDR_FWD (1<<2)
extern int local_deliver_hdr_mask;
extern HTABLE *delivered_init(DELIVER_ATTR);
extern int delivered_find(HTABLE *, const char *);
#define delivered_free(t) htable_free((t), (void (*) (char *)) 0)
extern int forward_init(void);
extern int forward_append(DELIVER_ATTR);
extern int forward_finish(DELIVER_REQUEST *, DELIVER_ATTR, int);
extern int feature_control(const char *);
int local_expand(VSTRING *, const char *, LOCAL_STATE *, USER_ATTR *, const char *);
#define LOCAL_EXP_EXTENSION_MATCHED (1<<MAC_PARSE_USER)
extern MAPS *alias_maps;
#define STR(s) vstring_str(s)