101 #include <sys/stat.h>
135 const char *orig_rcpt,
136 const char *delivered,
138 int flags,
const char *eol,
DSN_BUF *why)
140 const char *myname =
"mail_copy";
146 int corrupt_error = 0;
162 msg_panic(
"file size limit %lu < message size %lu. This "
163 "causes large messages to be delivered repeatedly "
164 "after they were submitted with \"sendmail -t\" "
165 "or after recipients were added with the Milter "
166 "SMFIR_ADDRCPT request",
167 (
unsigned long) size_limit,
168 (
unsigned long) st.st_size);
175 if ((orig_length =
vstream_fseek(dst, (off_t) 0, SEEK_END)) < 0)
191 asctime(localtime(&now)), eol);
226 #define VSTREAM_FWRITE_BUF(s,b) \
227 vstream_fwrite((s),vstring_str(b),VSTRING_LEN(b))
230 while ((type =
rec_get(src, buf, 0)) > 0) {
235 if ((flags &
MAIL_COPY_QUOTE) && *bp ==
'F' && !strncmp(bp,
"From ", 5))
251 msg_warn(
"bad record type: %d in message content", type);
274 if ((flags & MAIL_COPY_TOFILE) != 0)
286 if ((flags & MAIL_COPY_TOFILE) != 0)
287 if (corrupt_error || read_error || write_error)
296 #define TRY_AGAIN_ERROR(errno) \
297 (errno == EAGAIN || errno == ESTALE)
299 if (why && read_error)
302 "error reading message: %m");
303 if (why && write_error)
306 "error writing message: %m");
const char * mbox_dsn(int err, const char *def_dsn)
#define MAIL_COPY_STAT_WRITE
NORETURN msg_panic(const char *fmt,...)
#define MAIL_COPY_RETURN_PATH
#define MAIL_COPY_STAT_READ
off_t get_file_limit(void)
VSTREAM * vstream_fprintf(VSTREAM *stream, const char *fmt,...)
#define TRY_AGAIN_ERROR(errno)
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)
#define MAIL_ADDR_MAIL_DAEMON
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
#define MAIL_COPY_DELIVERED
NORETURN msg_fatal(const char *fmt,...)
off_t vstream_fseek(VSTREAM *stream, off_t offset, int whence)
#define VSTREAM_FWRITE_BUF(s, b)
int vstream_fflush(VSTREAM *stream)
#define quote_822_local(dst, src)
DSN_BUF * dsb_unix(DSN_BUF *dsb, const char *status, const char *dtext, const char *format,...)
VSTRING * vstring_free(VSTRING *vp)
#define vstream_fileno(vp)
int mark_corrupt(VSTREAM *src)
#define MAIL_COPY_STAT_CORRUPT
#define VSTREAM_PUTC(ch, vp)
const SYS_EXITS_DETAIL * sys_exits_detail(int code)
#define MAIL_COPY_ORIG_RCPT
#define rec_get(fp, buf, limit)
#define vstream_ferror(vp)
int vstream_fputs(const char *str, VSTREAM *stream)