deliver
if ((ch = deliver(fd, *argv, lockfile)) != 0)
int deliver(int, char *, int);
goto deliver;
goto deliver;
goto deliver;
goto deliver;
deliver:
deliver:
goto deliver;
goto deliver;
goto deliver;
goto deliver;
deliver:
goto deliver;
goto deliver;
goto deliver;
deliver:
goto deliver;
goto deliver;
goto deliver;
goto deliver;
deliver:
struct deliver deliver;
memset(&deliver, 0, sizeof deliver);
(void)text_to_mailaddr(&deliver.sender, s->evp->sender);
(void)text_to_mailaddr(&deliver.rcpt, s->evp->rcpt);
(void)text_to_mailaddr(&deliver.dest, s->evp->dest);
(void)strlcpy(deliver.mda_exec, s->evp->mda_exec, sizeof deliver.mda_exec);
(void)strlcpy(deliver.mda_subaddress, s->evp->mda_subaddress, sizeof deliver.mda_subaddress);
(void)strlcpy(deliver.dispatcher, s->evp->dispatcher, sizeof deliver.dispatcher);
deliver.userinfo = s->user->userinfo;
m_add_data(p_parent, &deliver, sizeof(deliver));
mda_mbox(struct deliver *deliver)
if (deliver->sender.user[0] == '\0' &&
deliver->sender.domain[0] == '\0')
deliver->sender.user, deliver->sender.domain);
sender, deliver->userinfo.username, (char *)NULL, envp);
mda_mbox_init(struct deliver *deliver)
const char *username = deliver->userinfo.username;
if (fchown(fd, deliver->userinfo.uid, deliver->userinfo.gid) == -1)
mda_unpriv(struct dispatcher *dsp, struct deliver *deliver,
if (deliver->mda_exec[0])
mda_command = deliver->mda_exec;
if (mda_expand_format(mda_exec, sizeof mda_exec, deliver,
&deliver->userinfo, NULL) == -1)
xasprintf(&mda_environ[idx++], "DOMAIN=%s", deliver->rcpt.domain);
xasprintf(&mda_environ[idx++], "ORIGINAL_RECIPIENT=%s@%s", deliver->rcpt.user, deliver->rcpt.domain);
xasprintf(&mda_environ[idx++], "RECIPIENT=%s@%s", deliver->dest.user, deliver->dest.domain);
xasprintf(&mda_environ[idx++], "LOCAL=%s", deliver->rcpt.user);
xasprintf(&mda_environ[idx++], "LOGNAME=%s", deliver->userinfo.username);
xasprintf(&mda_environ[idx++], "USER=%s", deliver->userinfo.username);
if (deliver->sender.user[0])
deliver->sender.user, deliver->sender.domain);
if (deliver->mda_subaddress[0])
xasprintf(&mda_environ[idx++], "EXTENSION=%s", deliver->mda_subaddress);
if (mda_expand_format(mda_wrapper, sizeof mda_wrapper, deliver,
&deliver->userinfo, mda_command) == -1)
mda_expand_format(char *buf, size_t len, const struct deliver *dlv,
ssize_t mda_expand_format(char *, size_t, const struct deliver *,
const struct deliver *, const struct userinfo *, const char *);
const struct deliver *dlv, const struct userinfo *ui, const char *mda_command)
forkmda(struct mproc *p, uint64_t id, struct deliver *deliver)
dsp = dict_xget(env->sc_dispatchers, deliver->dispatcher);
": %s as %s", id, deliver->userinfo.username,
dsp->u.local.user ? dsp->u.local.user : deliver->userinfo.username);
pw_name = deliver->userinfo.username;
pw_uid = deliver->userinfo.uid;
pw_gid = deliver->userinfo.gid;
pw_dir = deliver->userinfo.directory;
if (pw_uid == 0 && (!dsp->u.local.is_mbox || deliver->mda_exec[0])) {
deliver->userinfo.username);
struct deliver deliver;
mda_mbox_init(deliver);
deliver->mda_exec[0] == '\0')
mda_mbox(deliver);
mda_unpriv(dsp, deliver, pw_name, pw_dir);
if (sz != sizeof(deliver))
memmove(&deliver, data, sz);
forkmda(p, reqid, &deliver);
static void forkmda(struct mproc *, uint64_t, struct deliver *);
void mda_mbox_init(struct deliver *);
void mda_mbox(struct deliver *);
void mda_unpriv(struct dispatcher *, struct deliver *, const char *, const char *);
ssize_t mda_expand_format(char *, size_t, const struct deliver *,