On Fri, Feb 06, 2015 at 03:09:57PM +0000, Martin Brandenburg wrote:
> When mail comes in for local delivery with two consecutive lines
> beginning 'From ' only the first is escaped with a >. Two non-
> consecutive 'From ' lines in one message does not cause this.
> 
> Connect to the local mail server and send
> > From blah blah
> > From blah blah
> 
> And you see in /var/mail/...
> > >From blah blah
> > From blah blah
> 
> Needless to say, this confuses practically everything handling mbox
> files.
> 
> I'm not sure what eline was supposed to accomplish below, but it doesn't
> seem to help since all 'From ' lines need to be escaped.

Are you certain about this? My understanding is a new message
in the mbox is indicated by a blank line followed by "From ".
Therefore each "From " that appears in the message, with a
preceeding blank line gets ">" prepended (by convention).

also: http://en.wikipedia.org/wiki/Mbox

--patrick


> -- Martin
> 
> Index: mail.local.c
> ===================================================================
> RCS file: /cvs/src/libexec/mail.local/mail.local.c,v
> retrieving revision 1.33
> diff -u -p -r1.33 mail.local.c
> --- mail.local.c      16 Jan 2015 06:39:50 -0000      1.33
> +++ mail.local.c      6 Feb 2015 15:00:13 -0000
> @@ -117,7 +117,7 @@ storemail(char *from)
>  {
>       FILE *fp = NULL;
>       time_t tval;
> -     int fd, eline;
> +     int fd;
>       size_t len;
>       char *line, *tbuf;
>  
> @@ -131,7 +131,7 @@ storemail(char *from)
>       (void)time(&tval);
>       (void)fprintf(fp, "From %s %s", from, ctime(&tval));
>  
> -     for (eline = 1, tbuf = NULL; (line = fgetln(stdin, &len));) {
> +     for (tbuf = NULL; (line = fgetln(stdin, &len));) {
>               /* We have to NUL-terminate the line since fgetln does not */
>               if (line[len - 1] == '\n')
>                       line[len - 1] = '\0';
> @@ -143,14 +143,8 @@ storemail(char *from)
>                       tbuf[len] = '\0';
>                       line = tbuf;
>               }
> -             if (line[0] == '\0')
> -                     eline = 1;
> -             else {
> -                     if (eline && line[0] == 'F' && len > 5 &&
> -                         !memcmp(line, "From ", 5))
> -                             (void)putc('>', fp);
> -                     eline = 0;
> -             }
> +             if (line[0] == 'F' && len > 5 && !memcmp(line, "From ", 5))
> +                     (void)putc('>', fp);
>               (void)fprintf(fp, "%s\n", line);
>               if (ferror(fp))
>                       break;
> 

Reply via email to