From 236d6cccde6bad718a445799ed5ff742958e4c76 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Thu, 27 Jun 2002 06:37:37 +0000
Subject: [PATCH] get_msg_body and get_msg_tail methods now take additional
 bool parameter indicating whether the message is to be rfc822-encoded or not
 (defaults to false). This solves the problem of the nntp service and newslink
 module sending messages with dots in the first character of a line
 incorrectly.

---
 src/sbbs3/js_msgbase.c | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/src/sbbs3/js_msgbase.c b/src/sbbs3/js_msgbase.c
index ba7a206e7a..41fc0ec729 100644
--- a/src/sbbs3/js_msgbase.c
+++ b/src/sbbs3/js_msgbase.c
@@ -498,7 +498,7 @@ js_put_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
 	return(JS_TRUE);
 }
 
-static char* get_msg_text(smb_t* smb, smbmsg_t* msg, BOOL strip_ctrl_a, ulong mode)
+static char* get_msg_text(smb_t* smb, smbmsg_t* msg, BOOL strip_ctrl_a, BOOL rfc822, ulong mode)
 {
 	char*		buf;
 
@@ -536,6 +536,22 @@ static char* get_msg_text(smb_t* smb, smbmsg_t* msg, BOOL strip_ctrl_a, ulong mo
 			free(newbuf);
 		}
 	}
+
+	if(rfc822) {	/* must escape lines starting with dot ('.') */
+		char* newbuf;
+		if((newbuf=malloc((strlen(buf)*2)+1))!=NULL) {
+			int i,j;
+			for(i=j=0;buf[i];i++) {
+				if((i==0 || buf[i-1]=='\n') && buf[i]=='.')
+					newbuf[j++]='.';
+				newbuf[j++]=buf[i]; 
+			}
+			newbuf[j]=0;
+			free(buf);
+			buf = newbuf;
+		}
+	}
+
 	return(buf);
 }
 
@@ -546,6 +562,7 @@ js_get_msg_body(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 	smbmsg_t	msg;
 	JSBool		strip_ctrl_a=JS_FALSE;
 	JSBool		tails=JS_TRUE;
+	JSBool		rfc822=JS_FALSE;
 	private_t*	p;
 
 	*rval = JSVAL_NULL;
@@ -567,10 +584,12 @@ js_get_msg_body(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 		strip_ctrl_a=JSVAL_TO_BOOLEAN(argv[2]);
 
 	if(argc>3)
-		tails=JSVAL_TO_BOOLEAN(argv[3]);
+		rfc822=JSVAL_TO_BOOLEAN(argv[3]);
 
+	if(argc>4)
+		tails=JSVAL_TO_BOOLEAN(argv[4]);
 
-	buf = get_msg_text(&(p->smb), &msg, strip_ctrl_a, tails ? GETMSGTXT_TAILS : 0);
+	buf = get_msg_text(&(p->smb), &msg, strip_ctrl_a, rfc822, tails ? GETMSGTXT_TAILS : 0);
 	if(buf==NULL)
 		return(JS_TRUE);
 
@@ -587,6 +606,7 @@ js_get_msg_tail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 	char*		buf;
 	smbmsg_t	msg;
 	JSBool		strip_ctrl_a=JS_FALSE;
+	JSBool		rfc822=JS_FALSE;
 	private_t*	p;
 
 	*rval = JSVAL_NULL;
@@ -607,7 +627,10 @@ js_get_msg_tail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 	if(argc>2)
 		strip_ctrl_a=JSVAL_TO_BOOLEAN(argv[2]);
 
-	buf = get_msg_text(&(p->smb), &msg, strip_ctrl_a, GETMSGTXT_TAILS|GETMSGTXT_NO_BODY);
+	if(argc>3)
+		rfc822=JSVAL_TO_BOOLEAN(argv[3]);
+
+	buf = get_msg_text(&(p->smb), &msg, strip_ctrl_a, rfc822, GETMSGTXT_TAILS|GETMSGTXT_NO_BODY);
 	if(buf==NULL)
 		return(JS_TRUE);
 
-- 
GitLab