[Mixmaster-devel] sendmail, loop
Brought to you by:
weaselp
From: Peter P. <pe...@pa...> - 2002-07-29 07:35:44
|
This sendmail() call is a bit broken IMHO. It does not clearly distinguish between headers and body and tries to interpret the start of the body as headers too etc. This patch=20 - makes smtp sending similar to local /usr/lib/sendmail sending - sets X-Loop for forwarded messages Index: buffers.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/mixmaster/Mix/Src/buffers.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 buffers.c --- buffers.c 31 Oct 2001 08:19:53 -0000 1.1.1.1 +++ buffers.c 29 Jul 2002 07:27:25 -0000 @@ -433,6 +433,36 @@ return (0); } =20 +int buf_isheader(BUFFER *buffer) +{ + BUFFER *line; + long p; + int i; + int err; + int ret; + + line =3D buf_new(); + p =3D buffer->ptr; + ret =3D 0; + err =3D buf_getline(buffer, line); + if (err !=3D 0) + goto end; + + for (i =3D 0; i < line->length; i++) { + if (line->data[i] =3D=3D ' ' || line->data[i] =3D=3D '\t') + break; + if (line->data[i] =3D=3D ':') { + ret =3D 1; + break; + } + } + +end: + buffer->ptr =3D p; + buf_free(line); + return(ret); +} + int buf_getheader(BUFFER *buffer, BUFFER *field, BUFFER *content) { BUFFER *line; @@ -449,11 +479,14 @@ goto end; =20 err =3D -1; - for (i =3D 0; i < line->length; i++) + for (i =3D 0; i < line->length; i++) { + if (line->data[i] =3D=3D ' ' || line->data[i] =3D=3D '\t') + break; if (line->data[i] =3D=3D ':') { err =3D 0; break; } + } if (err =3D=3D -1) { /* badly formatted message -- try to process anyway */ buf_sets(field, "X-Invalid"); Index: mail.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/mixmaster/Mix/Src/mail.c,v retrieving revision 1.3 diff -u -r1.3 mail.c --- mail.c 11 Dec 2001 20:56:07 -0000 1.3 +++ mail.c 29 Jul 2002 07:27:26 -0000 @@ -77,6 +77,21 @@ =20 int smtpsend(BUFFER *head, BUFFER *message, char *from); =20 + +int sendmail_loop(BUFFER *message, char *from, BUFFER *address) +{ + BUFFER *msg; + int err; + + msg =3D buf_new(); + buf_appendf(msg, "X-Loop: %s\n", REMAILERADDR); + buf_cat(msg, message); + err =3D sendmail(msg, from, address); + buf_free(msg); + + return(err); +}; + int sendmail(BUFFER *message, char *from, BUFFER *address) { /* returns: 0: ok 1: problem, try again -1: failed */ @@ -353,7 +368,7 @@ rfc822_addr(content, rcpt); buf_rewind(head); =20 - while (buf_getheader(message, field, content) =3D=3D 0) { + while (buf_isheader(message) && buf_getheader(message, field, content) = =3D=3D 0) { if (bufieq(field, "to") || bufieq(field, "cc") || bufieq(field, "bcc")= ) { #ifdef BROKEN_MTA if (!bufifind(rcpt, content->data))=20 Index: mix.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/mixmaster/Mix/Src/mix.h,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 mix.h --- mix.h 31 Oct 2001 08:19:53 -0000 1.1.1.1 +++ mix.h 29 Jul 2002 07:27:26 -0000 @@ -536,6 +536,14 @@ other lines of text buf may contain are removed. =20 =20 +int buf_isheader(BUFFER *buf); + + This function checks whether the first line of buf is a RFC 822 header l= ine. + + Returns: + 0 if it is not a header line. + 1 if it is a header line. + int buf_getheader(BUFFER *buf, BUFFER *field, BUFFER *content); =20 This function reads a RFC 822 header line from buf. The field name of @@ -711,6 +719,10 @@ This function sends a mail message. The From: line and the destination address may be contained in the message; in that case address and from must be NULL. address is checked against the destination block list. + +int sendmail_loop(BUFFER *message, BUFFER *address, const char *from); + + Identical to sendmail() but adds an X-Loop: header line. =20 =20 Printable Encoding Index: mix3.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/mixmaster/Mix/Src/mix3.h,v retrieving revision 1.7 diff -u -r1.7 mix3.h --- mix3.h 24 Jul 2002 07:00:16 -0000 1.7 +++ mix3.h 29 Jul 2002 07:27:26 -0000 @@ -62,6 +62,7 @@ int buf_chop(BUFFER *b); void buf_move(BUFFER *dest, BUFFER *src); byte *buf_data(BUFFER *buffer); +int buf_isheader(BUFFER *buffer); int buf_getheader(BUFFER *buffer, BUFFER *field, BUFFER *content); int buf_appendheader(BUFFER *buffer, BUFFER *field, BUFFER *contents); int buf_lookahead(BUFFER *buffer, BUFFER *line); @@ -111,6 +112,7 @@ void rfc822_name(BUFFER *line, BUFFER *name); void sendmail_begin(void); /* begin mail sending session */ void sendmail_end(void); /* end mail sending session */ +int sendmail_loop(BUFFER *message, char *from, BUFFER *address); int sendmail(BUFFER *message, char *from, BUFFER *address); int mixfile(char *path, const char *name); int file_to_out(const char *name); Index: rem.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/mixmaster/Mix/Src/rem.c,v retrieving revision 1.18 diff -u -r1.18 rem.c --- rem.c 25 Jul 2002 08:49:03 -0000 1.18 +++ rem.c 29 Jul 2002 07:27:26 -0000 @@ -345,7 +345,7 @@ goto isloop; } buf_sets(content, mailbox); - sendmail(message, NULL, content); + sendmail_loop(message, NULL, content); isloop: buf_free(field); buf_free(content); yours, peter --=20 PGP signed and encrypted | .''`. ** Debian GNU/Linux ** messages preferred. | : :' : The universal | `. `' Operating System http://www.palfrader.org/ | `- http://www.debian.org/ |