From 2dd66a8c50f85adcd210b1d482ed1d5ef6e06142 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Thu, 16 Jan 1997 03:29:34 +0000 Subject: One step towards proper continuation handling. svn path=/trunk/; revision=774 --- driver.c | 15 +++++++++++---- socket.c | 12 ++++++++++++ socket.h | 5 +++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/driver.c b/driver.c index 531b6f73..c0901c8c 100644 --- a/driver.c +++ b/driver.c @@ -329,7 +329,7 @@ char *realname; /* real name of host */ 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)(); @@ -345,10 +345,17 @@ char *realname; /* real name of host */ 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++) diff --git a/socket.c b/socket.c index 734321fc..6b2076e7 100644 --- a/socket.c +++ b/socket.c @@ -136,6 +136,18 @@ char *SockGets(char *buf, int len, FILE *sockfp) 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. diff --git a/socket.h b/socket.h index 6c93c634..f84f5b4d 100644 --- a/socket.h +++ b/socket.h @@ -18,6 +18,11 @@ returns buffer on success, NULL on failure. */ 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. -- cgit v1.2.3