char buf [MSGBUFSIZE+1];
char *bufp, *headers, *fromhdr,*tohdr,*cchdr,*bcchdr,*received_for,*envto;
char *fromptr, *toptr;
- int n, oldlen;
+ int n, oldlen, ch;
int inheaders,lines,sizeticker;
FILE *sinkfp;
RETSIGTYPE (*sigchld)();
oldlen = 0;
while (delimited || len > 0)
{
- if (!SockGets(buf,sizeof(buf),sockfp))
- return(PS_SOCKET);
+ buf[0] = '\0';
+ do {
+ if (!SockGets(buf+strlen(buf), sizeof(buf)-strlen(buf)-1, sockfp))
+ return(PS_SOCKET);
+ vtalarm(ctl->server.timeout);
+ } while
+ /* we may need to grab RFC822 continuations */
+ (inheaders && (ch = SockPeek(sockfp)) == ' ' || ch == '\t');
+
+ /* compute length *before* squeezing out CRs */
n = strlen(buf);
- vtalarm(ctl->server.timeout);
/* squeeze out all carriage returns */
for (fromptr = toptr = buf; *fromptr; fromptr++)
return buf;
}
+int SockPeek(FILE *sockfp)
+/* peek at the next socket character without actually reading it */
+{
+ int n;
+ char ch;
+
+ if ((n = recv(fileno(sockfp), &ch, 1, MSG_PEEK)) == -1)
+ return -1;
+ else
+ return(ch);
+}
+
#ifdef MAIN
/*
* Use the chargen service to test input beuffering directly.
*/
char *SockGets(char *buf, int len, FILE *sockfp);
+/*
+ * Peek at the next socket character without actually reading it.
+ */
+int SockPeek(FILE *sockfp);
+
/*
Write a chunk of bytes to the socket (matches interface of fwrite).
Returns number of bytes successfully written.