diff -ur qmail-1.03/date822fmt.c qmail-1.03-wireformat/date822fmt.c --- qmail-1.03/date822fmt.c Mon Jun 15 06:53:16 1998 +++ qmail-1.03-wireformat/date822fmt.c Sat Mar 8 00:38:09 2003 @@ -24,6 +24,6 @@ i = fmt_uint0(s,dt->min,2); len += i; if (s) s += i; i = fmt_str(s,":"); len += i; if (s) s += i; i = fmt_uint0(s,dt->sec,2); len += i; if (s) s += i; - i = fmt_str(s," -0000\n"); len += i; if (s) s += i; + i = fmt_str(s," -0000\r\n"); len += i; if (s) s += i; return len; } diff -ur qmail-1.03/qmail-local.c qmail-1.03-wireformat/qmail-local.c --- qmail-1.03/qmail-local.c Mon Jun 15 06:53:16 1998 +++ qmail-1.03-wireformat/qmail-local.c Sat Mar 8 00:46:26 2003 @@ -507,7 +507,7 @@ if (!stralloc_copys(&dtline,"Delivered-To: ")) temp_nomem(); if (!stralloc_cat(&dtline,&envrecip)) temp_nomem(); for (i = 0;i < dtline.len;++i) if (dtline.s[i] == '\n') dtline.s[i] = '_'; - if (!stralloc_cats(&dtline,"\n")) temp_nomem(); + if (!stralloc_cats(&dtline,"\r\n")) temp_nomem(); if (!stralloc_copy(&foo,&dtline)) temp_nomem(); if (!stralloc_0(&foo)) temp_nomem(); @@ -522,7 +522,7 @@ if (!stralloc_copys(&rpline,"Return-Path: <")) temp_nomem(); if (!stralloc_cat(&rpline,&foo)) temp_nomem(); for (i = 0;i < rpline.len;++i) if (rpline.s[i] == '\n') rpline.s[i] = '_'; - if (!stralloc_cats(&rpline,">\n")) temp_nomem(); + if (!stralloc_cats(&rpline,">\r\n")) temp_nomem(); if (!stralloc_copy(&foo,&rpline)) temp_nomem(); if (!stralloc_0(&foo)) temp_nomem(); diff -ur qmail-1.03/qmail-pop3d.c qmail-1.03-wireformat/qmail-pop3d.c --- qmail-1.03/qmail-pop3d.c Mon Jun 15 06:53:16 1998 +++ qmail-1.03-wireformat/qmail-pop3d.c Sat Mar 8 01:05:07 2003 @@ -1,5 +1,7 @@ #include #include +#include +#include #include "commands.h" #include "sig.h" #include "getln.h" @@ -84,6 +86,25 @@ char strnum[FMT_ULONG]; stralloc line = {0}; +static int deftimeoutwrite(fd,buf,len) int fd; char *buf; int len; +{ + return timeoutwrite(1200,fd,buf,len); +} + +void mmblast(fromfd,size) +int fromfd; +unsigned long size; +{ + void *mm; + + if ((mm=mmap(NULL,size,PROT_READ,MAP_SHARED,fromfd,0)) == NULL) + die(); + if (allwrite(deftimeoutwrite,STDOUT_FILENO,mm,size) != 0) + die(); + if (munmap(mm,size) != 0) + die(); +} + void blast(ssfrom,limit) substdio *ssfrom; unsigned long limit; @@ -268,8 +289,15 @@ fd = open_read(m[i].fn); if (fd == -1) { err_nosuch(); return; } okay(); - substdio_fdbuf(&ssmsg,read,fd,ssmsgbuf,sizeof(ssmsgbuf)); - blast(&ssmsg,limit); + if (limit) + { + substdio_fdbuf(&ssmsg,read,fd,ssmsgbuf,sizeof(ssmsgbuf)); + blast(&ssmsg,limit); + } + else + { + mmblast(fd,m[i].size); + } close(fd); } diff -ur qmail-1.03/qmail-remote.c qmail-1.03-wireformat/qmail-remote.c --- qmail-1.03/qmail-remote.c Mon Sep 16 20:35:52 2002 +++ qmail-1.03-wireformat/qmail-remote.c Sat Mar 8 01:26:19 2003 @@ -2,6 +2,10 @@ #include #include #include +#include +#include +#include +#include #include "sig.h" #include "stralloc.h" #include "substdio.h" @@ -189,11 +193,31 @@ zerodie(); } +static int deftimeoutwrite(fd,buf,len) int fd; char *buf; int len; +{ + return timeoutwrite(timeout,fd,buf,len); +} + void blast() { int r; char ch; + struct stat st; + void *mm; + if (fstat(STDIN_FILENO,&st) == 0) + { + if ((mm=mmap(NULL,st.st_size,PROT_READ,MAP_SHARED,STDIN_FILENO,0)) != NULL) + { + if (allwrite(deftimeoutwrite,smtpfd,mm,st.st_size) != 0) + temp_read(); + if (munmap(mm,st.st_size) != 0) + temp_read(); + flagcritical=1; + return; + } + } + for (;;) { r = substdio_get(&ssin,&ch,1); if (r == 0) break; diff -ur qmail-1.03/qmail-smtpd.c qmail-1.03-wireformat/qmail-smtpd.c --- qmail-1.03/qmail-smtpd.c Mon Jun 15 06:53:16 1998 +++ qmail-1.03-wireformat/qmail-smtpd.c Sat Mar 8 00:33:07 2003 @@ -323,24 +323,24 @@ switch(state) { case 0: if (ch == '\n') straynewline(); - if (ch == '\r') { state = 4; continue; } + if (ch == '\r') { state = 4; break; } break; case 1: /* \r\n */ if (ch == '\n') straynewline(); - if (ch == '.') { state = 2; continue; } - if (ch == '\r') { state = 4; continue; } + if (ch == '.') { state = 2; break; } + if (ch == '\r') { state = 4; break; } state = 0; break; case 2: /* \r\n + . */ if (ch == '\n') straynewline(); - if (ch == '\r') { state = 3; continue; } + if (ch == '\r') { state = 3; break; } state = 0; break; case 3: /* \r\n + .\r */ - if (ch == '\n') return; + if (ch == '\n') { put(&ch); return; } put("."); put("\r"); - if (ch == '\r') { state = 4; continue; } + if (ch == '\r') { state = 4; break; } state = 0; break; case 4: /* + \r */ diff -ur qmail-1.03/received.c qmail-1.03-wireformat/received.c --- qmail-1.03/received.c Mon Jun 15 06:53:16 1998 +++ qmail-1.03-wireformat/received.c Sat Mar 8 00:38:16 2003 @@ -61,7 +61,7 @@ qmail_puts(qqt,"@"); } safeput(qqt,remoteip); - qmail_puts(qqt,")\n by "); + qmail_puts(qqt,")\r\n by "); safeput(qqt,local); qmail_puts(qqt," with "); qmail_puts(qqt,protocol); diff -ur qmail-1.03/substdio.h qmail-1.03-wireformat/substdio.h --- qmail-1.03/substdio.h Mon Jun 15 06:53:16 1998 +++ qmail-1.03-wireformat/substdio.h Sat Mar 8 01:06:24 2003 @@ -13,6 +13,7 @@ extern void substdio_fdbuf(); +extern int allwrite(); extern int substdio_flush(); extern int substdio_put(); extern int substdio_bput(); diff -ur qmail-1.03/substdo.c qmail-1.03-wireformat/substdo.c --- qmail-1.03/substdo.c Mon Jun 15 06:53:16 1998 +++ qmail-1.03-wireformat/substdo.c Sat Mar 8 01:06:25 2003 @@ -3,7 +3,7 @@ #include "byte.h" #include "error.h" -static int allwrite(op,fd,buf,len) +int allwrite(op,fd,buf,len) register int (*op)(); register int fd; register char *buf;