21int rename(
const char *,
const char *);
34#define WHO "maildir2mbox"
36static void die_nomem() { logmsg(
WHO,111,FATAL,
"out of memory"); }
51 mbox = env_get(
"MAIL");
52 if (!
mbox) logmsg(
WHO,111,FATAL,
"MAIL not set");
54 if (!
mboxtmp) logmsg(
WHO,111,FATAL,
"MAILTMP not set");
57 logmsg(
WHO,110,FATAL,
"Can't changet maildir");
60 logmsg(
WHO,112,FATAL,
"Can't read maidir");
64 fdlock = open_append(
mbox);
66 logmsg(
WHO,111,FATAL,B(
"unable to lock: ",
mbox));
67 if (lock_ex(fdlock) == -1)
68 logmsg(
WHO,111,FATAL,B(
"unable to lock: ",
mbox));
70 fdoldmbox = open_read(
mbox);
72 logmsg(
WHO,112,FATAL,B(
"unable to read: ",
mbox));
74 fdnewmbox = open_trunc(
mboxtmp);
76 logmsg(
WHO,112,FATAL,B(
"unable to create: ",
mboxtmp));
81 switch (buffer_copy(&
bo,&
bi)) {
82 case -2: logmsg(
WHO,112,FATAL,B(
"unable to read: ",
mbox));
83 case -3: logmsg(
WHO,112,FATAL,B(
"unable to write to: ",
mboxtmp));
92 logmsg(
WHO,112,FATAL,B(
"unable to read: $MAILDIR/",
filenames.s + pe.
id));
95 if (getln(&
bi,&line,&
match,
'\n') != 0)
96 logmsg(
WHO,112,FATAL,B(
"unable to read: $MAILDIR/",
filenames.s + pe.
id));
100 if (stralloc_starts(&line,
"Return-Path: <")) {
101 if (line.s[14] ==
'>') {
108 for (i = 14;i < line.len - 2;++i)
109 if ((line.s[i] ==
' ') || (line.s[i] ==
'\t'))
118 logmsg(
WHO,112,FATAL,B(
"unable to write to: ",
mboxtmp));
120 while (
match && line.len) {
121 if (
gfrom(line.s,line.len))
122 if (buffer_puts(&
bo,
">") == -1)
123 logmsg(
WHO,112,FATAL,B(
"unable to write to: ",
mboxtmp));
124 if (buffer_put(&
bo,line.s,line.len) == -1)
125 logmsg(
WHO,112,FATAL,B(
"unable to write to: ",
mboxtmp));
127 if (buffer_puts(&
bo,
"\n") == -1)
128 logmsg(
WHO,112,FATAL,B(
"unable to write to: ",
mboxtmp));
131 if (getln(&
bi,&line,&
match,
'\n') != 0)
132 logmsg(
WHO,112,FATAL,B(
"unable to read: $MAILDIR/",
filenames.s + pe.
id));
134 if (buffer_puts(&
bo,
"\n"))
135 logmsg(
WHO,112,FATAL,B(
"unable to write to: ",
mboxtmp));
140 if (buffer_flush(&
bo) == -1)
141 logmsg(
WHO,112,FATAL,B(
"unable to write to: ",
mboxtmp));
142 if (fsync(fdnewmbox) == -1)
143 logmsg(
WHO,112,FATAL,B(
"unable to write to: ",
mboxtmp));
144 if (close(fdnewmbox) == -1)
145 logmsg(
WHO,112,FATAL,B(
"unable to write to: ",
mboxtmp));
152 logmsg(
WHO,0,WARN,B(
"$MAILDIR/",
filenames.s + pe.
id,
" will be delivered twice; unable to unlink"));
char outbuf[BUFSIZE_MESS]
int stralloc_copys(stralloc *, char const *)
int gfrom(char *s, int len)
int rename(const char *, const char *)
int maildir_scan(prioq *, stralloc *, int, int)
void maildir_clean(stralloc *)
char * myctime(datetime_sec)
struct prioq_elt *int prioq_min(prioq *, struct prioq_elt *)
void prioq_delmin(prioq *)