84 const char *myname =
"deliver_file";
113 dsb_simple(why,
"5.7.1",
"mail to file is restricted");
122 dsb_simple(why,
"2.0.0",
"delivers to file: %s", path);
135 msg_panic(
"privileged default group id");
140 if (path[strlen(path) - 1] ==
'/')
147 msg_info(
"deliver_file (%ld,%ld): %s",
148 (
long) usr_attr.
uid, (
long) usr_attr.
gid, path);
161 mp =
mbox_open(path, O_APPEND | O_CREAT | O_WRONLY,
162 S_IRUSR | S_IWUSR, &st, -1, -1,
166 if (S_ISREG(st.st_mode) && st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) {
168 dsb_simple(why,
"5.7.1",
"file is executable");
171 S_ISREG(st.st_mode) ? copy_flags :
184 }
else if (mail_copy_status != 0) {
186 "cannot append message to file %s: ", path);
190 dsb_simple(why,
"2.0.0",
"delivered to file: %s", path);
194 return (deliver_status);
#define MAIL_COPY_STAT_WRITE
VSTRING * vstring_sprintf_prepend(VSTRING *vp, const char *format,...)
NORETURN msg_panic(const char *fmt,...)
int deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
#define MBOX_DOT_LOCK_MAY_FAIL
#define DEL_REQ_TRACE_ONLY(f)
DELIVER_REQUEST * request
#define BOUNCE_FLAGS(request)
int been_here(BH_TABLE *dup_filter, const char *fmt,...)
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)
void mbox_release(MBOX *mp)
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)
int bounce_workaround(LOCAL_STATE state)
int deliver_maildir(LOCAL_STATE, USER_ATTR, char *)
#define MAIL_COPY_STAT_CORRUPT
int local_file_deliver_mask
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)
int local_deliver_hdr_mask
void msg_info(const char *fmt,...)