From b7aa230a8b0ad1d100bfcb8ee5715e8174217396 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 6 Aug 2002 02:56:49 +0000
Subject: [PATCH] Changed kludge line parsing to support kludge lines spanning
 more than one (128 byte) block.

---
 src/sbbs3/qwktomsg.cpp | 216 ++++++++++++++++++++++++-----------------
 1 file changed, 127 insertions(+), 89 deletions(-)

diff --git a/src/sbbs3/qwktomsg.cpp b/src/sbbs3/qwktomsg.cpp
index cb531fc123..c2561de2b7 100644
--- a/src/sbbs3/qwktomsg.cpp
+++ b/src/sbbs3/qwktomsg.cpp
@@ -44,10 +44,14 @@
 bool sbbs_t::qwktomsg(FILE *qwk_fp, char *hdrblk, char fromhub, uint subnum
 	, uint touser)
 {
-	char	str[256],*body,*tail,col=0,lastch=0,*p,*lzhbuf,qwkbuf[129];
+	char*	body;
+	char*	tail;
+	char*	header;
+	char	str[256],col=0,lastch=0,*p,*lzhbuf,qwkbuf[QWK_BLOCK_LEN+1];
 	uint 	i,j,k,lzh=0,storage,skip=0;
 	ushort	xlat;
 	long	l,bodylen,taillen,length;
+	bool	header_cont=false;
 	ulong	crc,block,blocks;
 	smbmsg_t	msg;
 	struct	tm tm;
@@ -118,82 +122,7 @@ bool sbbs_t::qwktomsg(FILE *qwk_fp, char *hdrblk, char fromhub, uint subnum
 		msg.idx.to=crc16(str); }
 
 	memset(qwkbuf,0,sizeof(qwkbuf));
-	fread(qwkbuf,1,128,qwk_fp);
-
-	if(useron.rest&FLAG('Q') || fromhub) {      /* QWK Net */
-		if(!strnicmp(qwkbuf,"@VIA:",5)) {
-			set_qwk_flag(QWK_VIA);
-			p=strchr(qwkbuf,'\xe3');
-			if(p) {
-				*p=0;
-				skip=strlen(qwkbuf)+1; }
-			truncsp(qwkbuf);
-			p=qwkbuf+5; 					/* Skip "@VIA:" */
-			while(*p && *p<=SP) p++;		/* Skip any spaces */
-			if(route_circ(p,cfg.sys_id)) {
-				smb_freemsgmem(&msg);
-				bprintf("\r\nCircular message path: %s\r\n",p);
-				sprintf(str,"Circular message path: %s from %s"
-					,p,fromhub ? cfg.qhub[fromhub-1]->id:useron.alias);
-				errorlog(str);
-				return(false); }
-			sprintf(str,"%s/%s"
-				,fromhub ? cfg.qhub[fromhub-1]->id : useron.alias,p);
-			strupr(str);
-			update_qwkroute(str); }
-		else {
-			if(fromhub)
-				strcpy(str,cfg.qhub[fromhub-1]->id);
-			else
-				strcpy(str,useron.alias); }
-		strupr(str);
-		j=NET_QWK;
-		smb_hfield(&msg,SENDERNETTYPE,2,&j);
-		smb_hfield(&msg,SENDERNETADDR,strlen(str),str);
-		sprintf(str,"%25.25s",hdrblk+46);  /* From user */
-		truncsp(str);
-		if(!strnicmp(qwkbuf+skip,"@MSGID:",7)) {
-			set_qwk_flag(QWK_MSGID);
-			p=strchr(qwkbuf+skip,'\xe3');
-			i=skip;
-			if(p) {
-				*p=0;
-				skip+=strlen(qwkbuf+i)+1; }
-			p=qwkbuf+i+7;					/* Skip "@MSGID:" */
-			while(*p && *p<=SP) p++;		/* Skip any spaces */
-			truncsp(p);
-			smb_hfield(&msg,RFC822MSGID,strlen(p),p);
-		}
-		if(!strnicmp(qwkbuf+skip,"@REPLY:",7)) {
-			set_qwk_flag(QWK_MSGID);
-			p=strchr(qwkbuf+skip,'\xe3');
-			i=skip;
-			if(p) {
-				*p=0;
-				skip+=strlen(qwkbuf+i)+1; }
-			p=qwkbuf+i+7;					/* Skip "@REPLY:" */
-			while(*p && *p<=SP) p++;		/* Skip any spaces */
-			truncsp(p);
-			smb_hfield(&msg,RFC822REPLYID,strlen(p),p);
-		}
-		if(!strnicmp(qwkbuf+skip,"@TZ:",4)) {
-			set_qwk_flag(QWK_TZ);
-			p=strchr(qwkbuf+skip,'\xe3');
-			i=skip;
-			if(p) {
-				*p=0;
-				skip+=strlen(qwkbuf+i)+1; }
-			p=qwkbuf+i+4;					/* Skip "@TZ:" */
-			while(*p && *p<=SP) p++;		/* Skip any spaces */
-			msg.hdr.when_written.zone=(short)ahtoul(p); 
-		}
-	} else {
-		sprintf(str,"%u",useron.number);
-		smb_hfield(&msg,SENDEREXT,strlen(str),str);
-		if((uint)subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_NAME)
-			strcpy(str,useron.name);
-		else
-			strcpy(str,useron.alias); }
+	fread(qwkbuf,1,QWK_BLOCK_LEN,qwk_fp);
 
 	smb_hfield(&msg,SENDER,strlen(str),str);
 	if((uint)subnum==INVALID_SUB) {
@@ -216,26 +145,47 @@ bool sbbs_t::qwktomsg(FILE *qwk_fp, char *hdrblk, char fromhub, uint subnum
 	/* Convert the QWK message text */
 	/********************************/
 
+	if((header=(char *)calloc((blocks-1L)*QWK_BLOCK_LEN*2L,sizeof(char)))==NULL) {
+		smb_freemsgmem(&msg);
+		errormsg(WHERE,ERR_ALLOC,"QWK msg header",(blocks-1L)*QWK_BLOCK_LEN*2L);
+		return(false); 
+	}
+
 	bodylen=0;
-	if((body=(char *)LMALLOC((blocks-1L)*128L*2L))==NULL) {
+	if((body=(char *)LMALLOC((blocks-1L)*QWK_BLOCK_LEN*2L))==NULL) {
+		LFREE(header);
 		smb_freemsgmem(&msg);
-		errormsg(WHERE,ERR_ALLOC,"QWK msg body",(blocks-1L)*128L*2L);
-		return(false); }
+		errormsg(WHERE,ERR_ALLOC,"QWK msg body",(blocks-1L)*QWK_BLOCK_LEN*2L);
+		return(false); 
+	}
 
 	taillen=0;
-	if((tail=(char *)LMALLOC((blocks-1L)*128L*2L))==NULL) {
+	if((tail=(char *)LMALLOC((blocks-1L)*QWK_BLOCK_LEN*2L))==NULL) {
+		LFREE(header);
 		LFREE(body);
 		smb_freemsgmem(&msg);
-		errormsg(WHERE,ERR_ALLOC,"QWK msg tail",(blocks-1L)*128L*2L);
-		return(false); }
+		errormsg(WHERE,ERR_ALLOC,"QWK msg tail",(blocks-1L)*QWK_BLOCK_LEN*2L);
+		return(false); 
+	}
 
 	for(block=1;block<blocks;block++) {
-		if(block>1)
-			if(!fread(qwkbuf,1,128,qwk_fp))
-				break;
-		for(k=skip;k<128;k++,skip=0) {
+		if(!fread(qwkbuf,1,QWK_BLOCK_LEN,qwk_fp))
+			break;
+		for(k=0;k<QWK_BLOCK_LEN;k++) {
 			if(qwkbuf[k]==0)
 				continue;
+			if(bodylen==0 && (qwkbuf[k]=='@' || header_cont)) {
+				if((p=strchr(qwkbuf+k, QWK_NEWLINE))!=NULL)
+					*p=0;
+				strcat(header, qwkbuf+k);
+				strcat(header, "\n");
+				if(p==NULL) {
+					header_cont=true;
+					break;
+				}
+				k+=strlen(qwkbuf+k);
+				header_cont=false;
+			}
 			if(!taillen && qwkbuf[k]==SP && col==3 && bodylen>=3
 				&& body[bodylen-3]=='-' && body[bodylen-2]=='-'
 				&& body[bodylen-1]=='-') {
@@ -244,7 +194,7 @@ bool sbbs_t::qwktomsg(FILE *qwk_fp, char *hdrblk, char fromhub, uint subnum
 				taillen=4;
 				col++;
 				continue; }
-			if((uchar)qwkbuf[k]==0xE3) {		/* expand 0xe3 to crlf */
+			if(qwkbuf[k]==QWK_NEWLINE) {		/* expand QWK_NEWLINE to crlf */
 				if(!taillen && col==3 && bodylen>=3 && body[bodylen-3]=='-'
 					&& body[bodylen-2]=='-' && body[bodylen-1]=='-') {
 					bodylen-=3;
@@ -276,7 +226,9 @@ bool sbbs_t::qwktomsg(FILE *qwk_fp, char *hdrblk, char fromhub, uint subnum
 			if(taillen)
 				tail[taillen++]=qwkbuf[k];
 			else
-				body[bodylen++]=qwkbuf[k]; } }
+				body[bodylen++]=qwkbuf[k]; 
+		} 
+	}
 
 	while(bodylen && body[bodylen-1]==SP) bodylen--; /* remove trailing spaces */
 	if(bodylen>=2 && body[bodylen-2]==CR && body[bodylen-1]==LF)
@@ -284,6 +236,92 @@ bool sbbs_t::qwktomsg(FILE *qwk_fp, char *hdrblk, char fromhub, uint subnum
 
 	while(taillen && tail[taillen-1]<=SP) taillen--; /* remove trailing garbage */
 
+	skip=0;
+	if(useron.rest&FLAG('Q') || fromhub) {      /* QWK Net */
+		if(!strnicmp(header,"@VIA:",5)) {
+			set_qwk_flag(QWK_VIA);
+			p=strchr(header, '\n');
+			if(p) {
+				*p=0;
+				skip=strlen(header)+1; 
+			}
+			truncsp(header);
+			p=header+5; 					/* Skip "@VIA:" */
+			while(*p && *p<=SP) p++;		/* Skip any spaces */
+			if(route_circ(p,cfg.sys_id)) {
+				free(header);
+				free(body);
+				free(tail);
+				smb_freemsgmem(&msg);
+				bprintf("\r\nCircular message path: %s\r\n",p);
+				sprintf(str,"Circular message path: %s from %s"
+					,p,fromhub ? cfg.qhub[fromhub-1]->id:useron.alias);
+				errorlog(str);
+				return(false); }
+			sprintf(str,"%s/%s"
+				,fromhub ? cfg.qhub[fromhub-1]->id : useron.alias,p);
+			strupr(str);
+			update_qwkroute(str); }
+		else {
+			if(fromhub)
+				strcpy(str,cfg.qhub[fromhub-1]->id);
+			else
+				strcpy(str,useron.alias); }
+		strupr(str);
+		j=NET_QWK;
+		smb_hfield(&msg,SENDERNETTYPE,2,&j);
+		smb_hfield(&msg,SENDERNETADDR,strlen(str),str);
+		sprintf(str,"%25.25s",hdrblk+46);  /* From user */
+		truncsp(str);
+	} else {
+		sprintf(str,"%u",useron.number);
+		smb_hfield(&msg,SENDEREXT,strlen(str),str);
+		if((uint)subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_NAME)
+			strcpy(str,useron.name);
+		else
+			strcpy(str,useron.alias);
+	}
+
+	if(!strnicmp(header+skip,"@MSGID:",7)) {
+		set_qwk_flag(QWK_MSGID);
+		p=strchr(header+skip, '\n');
+		i=skip;
+		if(p) {
+			*p=0;
+			skip+=strlen(header+i)+1; 
+		}
+		p=header+i+7;					/* Skip "@MSGID:" */
+		while(*p && *p<=SP) p++;		/* Skip any spaces */
+		truncsp(p);
+		smb_hfield(&msg,RFC822MSGID,strlen(p),p);
+	}
+	if(!strnicmp(header+skip,"@REPLY:",7)) {
+		set_qwk_flag(QWK_MSGID);
+		p=strchr(header+skip, '\n');
+		i=skip;
+		if(p) {
+			*p=0;
+			skip+=strlen(header+i)+1; 
+		}
+		p=header+i+7;					/* Skip "@REPLY:" */
+		while(*p && *p<=SP) p++;		/* Skip any spaces */
+		truncsp(p);
+		smb_hfield(&msg,RFC822REPLYID,strlen(p),p);
+	}
+	if(!strnicmp(header+skip,"@TZ:",4)) {
+		set_qwk_flag(QWK_TZ);
+		p=strchr(header+skip, '\n');
+		i=skip;
+		if(p) {
+			*p=0;
+			skip+=strlen(header+i)+1; 
+		}
+		p=header+i+4;					/* Skip "@TZ:" */
+		while(*p && *p<=SP) p++;		/* Skip any spaces */
+		msg.hdr.when_written.zone=(short)ahtoul(p); 
+	}
+	free(header);
+
 	/*****************/
 	/* Calculate CRC */
 	/*****************/
-- 
GitLab