37#define WHO "ezmlm-send"
50static void die_usage() {
logmsg(
WHO,100,USAGE,
"ezmlm-send [-cClLqQrR] [-h header] dir"); }
58static char strnum[FMT_ULONG];
59char szmsgnum[FMT_ULONG];
109stralloc outhost = {0};
110stralloc outlocal = {0};
170 if (i ==
sublist.len)
return 1;
172 if (byte_diff(
sublist.s,i,sender))
return 0;
188 fd = open_trunc(
"numnew");
191 if (buffer_put(&
bn,strnum,fmt_ulong(strnum,
msgnum)) == -1)
194 if (buffer_put(&
bn,strnum,fmt_ulong(strnum,
cumsize)) == -1)
201 if (rename(
"numnew",
"num") == -1)
240 if (mkdir(
fnadir.s,0755) == -1)
263 if (getln(&
bi,&qline,&
match,
'\n') == -1)
267 pos = scan_ulong(qline.s,&idx);
272 if (buffer_put(&
bxn,qline.s,qline.len) == -1)
274 if (qline.s[pos] ==
':') {
275 if (getln(&
bi,&qline,&
match,
'\n') == -1)
277 if (!
match && qline.s[0] !=
'\t')
279 if (buffer_put(&
bxn,qline.s,qline.len) == -1)
285 if (!stralloc_copyb(&qline,strnum,fmt_ulong(strnum,
outnum)))
die_nomem();
286 if (!stralloc_cats(&qline,
": "))
die_nomem();
289 if (!stralloc_cats(&qline,
" "))
die_nomem();
291 if (!stralloc_cats(&qline,
"Re: "))
die_nomem();
293 if (!stralloc_cats(&qline,
"\n\t"))
die_nomem();
295 if (!stralloc_cats(&qline,
";"))
die_nomem();
301 if (!stralloc_cats(&qline,
" "))
die_nomem();
309 if (!stralloc_cats(&qline,
"\n"))
die_nomem();
341 char *mlheader = (
char *) 0;
360 char *
cp, *cpstart, *cpafter;
365 while ((
opt = getoptb(argc,argv,
"cCh:H:lLrRqQs:S:vV")) != opteof)
367 case 'c':
case 'C':
break;
369 case 'H': mlheader = (
char*)optarg;
370 mlheader[str_chr(mlheader,
':')] =
'\0';
377 case 'S': pos = scan_ulong(optarg,&
hash_lo);
378 if (!optarg[pos++])
break;
379 scan_ulong(optarg+pos,&
hash_hi);
387 default: die_usage();
391 dir = argv[optind++];
392 if (!
dir) die_usage();
394 sender = env_get(
"SENDER");
396 if (chdir(
dir) == -1)
414 if ((
fd = open_read(
"text/trailer")) == -1) {
415 if (errno == ENOENT) flagtrailer = 0;
426 cp = line.s + scan_ulong(line.s,&
msgnum);
440 if (!stralloc_cats(&line,
"/0"))
die_nomem();
457 if (str_equal(sender,
"#@[]"))
468 if (str_start(sender+pos,
"-return-"))
470 pos += scan_ulong(sender+pos,&
innum);
474 szmsgnum[fmt_ulong(szmsgnum,
outnum)] =
'\0';
479 if (!stralloc_catb(&
fnadir,strnum,
483 if (!stralloc_catb(&
fnaf,strnum,fmt_uint0(strnum,
488 if (mkdir(
fnadir.s,0755) == -1)
499 if (!stralloc_copys(&line,
"Return-Path: <"))
die_nomem();
502 for (i = 0; i < qline.len; ++i)
503 if (qline.s[i] ==
'\n') qline.s[i] =
'_';
504 if (!stralloc_cat(&line,&qline))
die_nomem();
506 if (!stralloc_cats(&line,
">\n"))
die_nomem();
539 if (getln(buffer_0,&line,&
match,
'\n') == -1)
541 if (flaginheader &&
match) {
582 while ((
cp += byte_chr(
cp,cpafter-
cp,
';')) != cpafter) {
584 while (
cp < cpafter && (*
cp ==
' ' || *
cp ==
'\t' || *
cp ==
'\n'))
586 if (case_startb(
cp,cpafter-
cp,
"boundary=")) {
591 while (
cp < cpafter && *
cp !=
'"')
597 while (
cp < cpafter && *
cp !=
';' &&
598 *
cp !=
' ' && *
cp !=
'\t' && *
cp !=
'\n')
602 if (!stralloc_catb(&
boundary,cpstart,
cp-cpstart))
612 }
else if ((*line.s !=
' ') && (*line.s !=
'\t')) {
622 case_startb(line.s,line.len,
"Received:")) {
625 pos = byte_chr(line.s,line.len,
';');
632 }
else if (case_startb(line.s,line.len,
"Mailing-List:")) {
634 }
else if (mlheader && case_startb(line.s,line.len,mlheader)) {
637 case_startb(line.s,line.len,
"Content-Type:")) {
640 }
else if (case_startb(line.s,line.len,
"Subject:")) {
645 }
else if (flagtrailer && case_startb(line.s,line.len,
"Content-Transfer-Encoding:")) {
647 cpafter =
cp + line.len;
648 while (
cp < cpafter && (*
cp ==
' ' || *
cp ==
'\t'))
650 if (case_startb(
cp,cpafter-
cp,
"base64"))
encin =
'B';
651 else if (case_startb(
cp,cpafter-
cp,
"Quoted-Printable"))
encin =
'Q';
652 }
else if (flaglistid && case_startb(line.s,line.len,
"list-id:")) {
655 if (case_startb(line.s,line.len,
"From:")) {
659 }
else if (line.len ==
mydtline.len)
660 if (!byte_diff(line.s,line.len,
mydtline.s))
665 }
else if (flagfromline) {
667 }
else if (flagcontline) {
674 if (!(flaginheader && flagbadfield)) {
695 }
else if (flagseenext) {
696 if (case_startb(line.s,line.len,
"content-type:")) {
699 while (*
cp ==
' ' || *
cp ==
'\t')
702 while (*
cp !=
'\n' && *
cp !=
'\t' && *
cp !=
' ' && *
cp !=
';')
711 }
else if (line.len == 1) {
765 if (!stralloc_copy(&line,&outlocal))
die_nomem();
766 if (!stralloc_cats(&line,
"-return-"))
die_nomem();
767 if (!stralloc_cats(&line,szmsgnum))
die_nomem();
768 if (!stralloc_cats(&line,
"-@"))
die_nomem();
769 if (!stralloc_cat(&line,&outhost))
die_nomem();
770 if (!stralloc_cats(&line,
"-@[]"))
die_nomem();
void mkauthhash(const char *s, unsigned int len, char *h)
void makehash(const char *indata, unsigned int inlen, char *hash)
int quote2(stralloc *sa, const char *s)
const char auto_version[]
int unfold_hdr(char *, unsigned long, stralloc *, const char *, stralloc *, int)
Error messages. If you translate these, I would urge you to keep the English version as well....
#define ERR_TMP_QMAIL_QUEUE
int lockfile(const char *)
const char * qmail_close(struct qmail *)
void qmail_puts(struct qmail *, const char *)
void qmail_put(struct qmail *, const char *, int)
void qmail_from(struct qmail *, const char *)
unsigned long qmail_qp(struct qmail *)
int qmail_open(struct qmail *, const stralloc *)
const char * loginfo(const char *dir, unsigned long msgnum, unsigned long, unsigned long subs, int done)
void tagmsg(const char *dir, unsigned long msgnum, const char *seed, const char *action, char *hashout, unsigned long bodysize, unsigned long chunk)
void closesql(void)
close connection to SQL server, if open
unsigned long putsubs(const char *dir, unsigned long hash_lo, unsigned long hash_hi, int subwrite(), int flagsql)
int getconf(stralloc *sa, const char *fn, int flagrequired, const char *dir)
int getconf_line(stralloc *sa, const char *fn, int flagrequired, const char *dir)
void ezcopy(struct qmail *qqp, const char *fn, char q)
void set_cpoutlocal(const stralloc *ln)
void set_cpnum(const char *cf)
void set_cpouthost(const stralloc *ln)
unsigned int author_name(char **sout, char *s, unsigned int l)
int subto(char *s, unsigned int l)
struct constmap mimeremovemap
struct constmap headerremovemap
const char * checktag(const char *dir, unsigned long num, unsigned long listno, const char *action, const char *seed, const char *hash)
void concat_hdr(char *indata, unsigned int n, stralloc *outdata)
int idx_copy_insertsubject()
copies old index file up to but not including msg, then adds a line with 'sub' trimmed of reply indic...
int subto(char *s, unsigned int l)
ssize_t mywrite(int fd, char *buf, unsigned int len)
void qa_put(char *buf, unsigned int len)
int sublistmatch(char *sender)
void decode_hdr(const char *indata, unsigned int n, stralloc *outdata)
void hdr_transferenc(void)
void hdr_add(const char *line, unsigned int len)
void encode_b64(const unsigned char *indata, unsigned int n, stralloc *outdata, int control)
void hdr_ctype(enum ctype ctype)
const char * logmsg(const char *dir, unsigned long num, unsigned long listno, unsigned long subs, int done)