91 const char *myname =
"deliver_mailbox_file";
118 dsb_simple(why,
"2.0.0",
"delivers to mailbox");
154 ||
stat(spool_dir, &st) < 0
155 || (st.st_mode & S_IWOTH) != 0) {
156 spool_uid = usr_attr.
uid;
157 spool_gid = usr_attr.
gid;
158 }
else if ((st.st_mode & S_IWGRP) != 0) {
159 spool_uid = usr_attr.
uid;
160 spool_gid = st.st_gid;
165 if (spool_uid == usr_attr.
uid) {
169 chown_uid = usr_attr.
uid;
170 chown_gid = usr_attr.
gid;
173 msg_info(
"spool_uid/gid %ld/%ld chown_uid/gid %ld/%ld",
174 (
long) spool_uid, (
long) spool_gid,
175 (
long) chown_uid, (
long) chown_gid);
188 mp =
mbox_open(mailbox, O_APPEND | O_WRONLY | O_CREAT,
189 S_IRUSR | S_IWUSR, &st, chown_uid, chown_gid,
192 if (spool_uid != usr_attr.
uid || spool_gid != usr_attr.
gid)
194 if (S_ISREG(st.st_mode) == 0) {
197 "destination %s is not a regular file", mailbox);
201 "destination %s is not owned by recipient", mailbox);
202 msg_warn(
"specify \"%s = no\" to ignore mailbox ownership mismatch",
206 msg_fatal(
"seek mailbox file %s: %m", mailbox);
208 copy_flags,
"\n", why);
210 if (spool_uid != usr_attr.
uid || spool_gid != usr_attr.
gid)
221 }
else if (mail_copy_status != 0) {
223 "cannot update mailbox %s for user %s. ",
230 dsb_simple(why,
"2.0.0",
"delivered to mailbox");
245 return (deliver_status);
252 const char *myname =
"deliver_mailbox";
256 static MAPS *transp_maps;
257 const char *map_transport;
258 static MAPS *cmd_maps;
259 const char *map_command;
291 }
else if (transp_maps && transp_maps->
error != 0) {
309 msg_warn(
"error looking up passwd info for %s: %m",
333 #define LAST_CHAR(s) (s[strlen(s) - 1])
343 }
else if (cmd_maps && cmd_maps->
error != 0) {
360 status = deliver_mailbox_file(state, usr_attr);
int mypwnam_err(const char *name, struct mypasswd **result)
#define BOUNCE_ATTR(attr)
char * var_mailbox_transport
#define MAIL_COPY_STAT_WRITE
VSTRING * vstring_sprintf_prepend(VSTRING *vp, const char *format,...)
int deliver_mailbox(LOCAL_STATE state, USER_ATTR usr_attr, int *statusp)
int deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *command)
#define VAR_MAILBOX_CMD_MAPS
#define DEL_REQ_TRACE_ONLY(f)
#define DICT_FLAG_UTF8_REQUEST
#define VAR_MBOX_TRANSP_MAPS
bool var_strict_mbox_owner
DELIVER_REQUEST * request
#define BOUNCE_FLAGS(request)
int bounce_append(int flags, const char *id, MSG_STATS *stats, RECIPIENT *rcpt, const char *relay, DSN *dsn)
char * var_mailbox_cmd_maps
#define VAR_STRICT_MBOX_OWNER
int been_here(BH_TABLE *dup_filter, const char *fmt,...)
MAPS * maps_create(const char *title, const char *map_names, int dict_flags)
char * var_mbox_transp_maps
int vstream_fclose(VSTREAM *stream)
int mail_copy(const char *sender, const char *orig_rcpt, const char *delivered, VSTREAM *src, VSTREAM *dst, int flags, const char *eol, DSN_BUF *why)
char * var_mailbox_command
#define DICT_FLAG_PARANOID
void msg_warn(const char *fmt,...)
void mbox_release(MBOX *mp)
VSTRING * vstring_alloc(ssize_t len)
int deliver_pass(const char *class, const char *service, DELIVER_REQUEST *request, RECIPIENT *rcpt)
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
bool var_frozen_delivered
DSN_BUF * dsb_simple(DSN_BUF *dsb, const char *status, const char *format,...)
#define MAIL_COPY_DELIVERED
NORETURN msg_fatal(const char *fmt,...)
off_t vstream_fseek(VSTREAM *stream, off_t offset, int whence)
void set_eugid(uid_t euid, gid_t egid)
char * concatenate(const char *arg0,...)
void mypwfree(struct mypasswd *mypwd)
#define SET_USER_ATTR(usr_attr, pwd, level)
VSTRING * vstring_free(VSTRING *vp)
#define DICT_FLAG_NO_REGSUB
int deliver_maildir(LOCAL_STATE, USER_ATTR, char *)
char * var_mail_spool_dir
int defer_append(int flags, const char *id, MSG_STATS *stats, RECIPIENT *rcpt, const char *relay, DSN *dsn)
#define MAIL_COPY_STAT_CORRUPT
void biff_notify(const char *text, ssize_t len)
int sent(int flags, const char *id, MSG_STATS *stats, RECIPIENT *recipient, const char *relay, DSN *dsn)
#define MSG_LOG_STATE(m, p)
MBOX * mbox_open(const char *path, int flags, mode_t mode, struct stat *st, uid_t chown_uid, gid_t chown_gid, int lock_style, const char *def_dsn, DSN_BUF *why)
const char * maps_find(MAPS *maps, const char *name, int flags)
int local_deliver_hdr_mask
#define MAIL_CLASS_PRIVATE
void msg_info(const char *fmt,...)