diff --git a/src/sbbs3/js_msgbase.c b/src/sbbs3/js_msgbase.c
index 571366d88e5c1144eb351bab908a3803e3ef93e2..6f7b55d4d356811e2b157b4b34ea40a995b61c8a 100644
--- a/src/sbbs3/js_msgbase.c
+++ b/src/sbbs3/js_msgbase.c
@@ -44,6 +44,7 @@ static scfg_t* scfg=NULL;
 typedef struct
 {
 	smb_t	smb;
+	int		status;
 	BOOL	debug;
 
 } private_t;
@@ -88,7 +89,7 @@ js_open(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		return(JS_TRUE);
 	}
 
-	if(smb_open(&(p->smb))!=0)
+	if((p->status=smb_open(&(p->smb)))!=SMB_SUCCESS)
 		return(JS_TRUE);
 
 	*rval = JSVAL_TRUE;
@@ -129,7 +130,8 @@ static BOOL parse_recipient_object(JSContext* cx, private_t* p, JSObject* hdr, s
 			return(FALSE);					/* "to" property required */
 		cp="All";
 	}
-	smb_hfield_str(msg, RECIPIENT, cp);
+	if((p->status=smb_hfield_str(msg, RECIPIENT, cp))!=SMB_SUCCESS)
+		return(FALSE);
 	if(!(p->smb.status.attr&SMB_EMAIL)) {
 		SAFECOPY(to,cp);
 		strlwr(to);
@@ -139,7 +141,8 @@ static BOOL parse_recipient_object(JSContext* cx, private_t* p, JSObject* hdr, s
 	if(JS_GetProperty(cx, hdr, "to_ext", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, RECIPIENTEXT, cp);
+		if((p->status=smb_hfield_str(msg, RECIPIENTEXT, cp))!=SMB_SUCCESS)
+			return(FALSE);
 		if(p->smb.status.attr&SMB_EMAIL)
 			msg->idx.to=atoi(cp);
 	}
@@ -147,7 +150,8 @@ static BOOL parse_recipient_object(JSContext* cx, private_t* p, JSObject* hdr, s
 	if(JS_GetProperty(cx, hdr, "to_org", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, RECIPIENTORG, cp);
+		if((p->status=smb_hfield_str(msg, RECIPIENTORG, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "to_net_type", &val) && !JSVAL_NULL_OR_VOID(val)) {
@@ -158,19 +162,22 @@ static BOOL parse_recipient_object(JSContext* cx, private_t* p, JSObject* hdr, s
 	if(JS_GetProperty(cx, hdr, "to_net_addr", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_netaddr(msg, RECIPIENTNETADDR, cp, &nettype);
+		if((p->status=smb_hfield_netaddr(msg, RECIPIENTNETADDR, cp, &nettype))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(nettype!=NET_UNKNOWN && nettype!=NET_NONE) {
 		if(p->smb.status.attr&SMB_EMAIL)
 			msg->idx.to=0;
-		smb_hfield_bin(msg, RECIPIENTNETTYPE, nettype);
+		if((p->status=smb_hfield_bin(msg, RECIPIENTNETTYPE, nettype))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "to_agent", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		JS_ValueToInt32(cx,val,&i32);
 		agent=(ushort)i32;
-		smb_hfield_bin(msg, RECIPIENTAGENT, agent);
+		if((p->status=smb_hfield_bin(msg, RECIPIENTAGENT, agent))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	return(TRUE);
@@ -203,7 +210,8 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 			return(FALSE);
 	} else
 		cp="";
-	smb_hfield_str(msg, SUBJECT, cp);
+	if((p->status=smb_hfield_str(msg, SUBJECT, cp))!=SMB_SUCCESS)
+		return(FALSE);
 	msg->idx.subj=smb_subject_crc(cp);
 
 	if(JS_GetProperty(cx, hdr, "from", &val) && !JSVAL_NULL_OR_VOID(val)) {
@@ -211,7 +219,8 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 			return(FALSE);
 	} else
 		return(FALSE);	/* "from" property required */
-	smb_hfield_str(msg, SENDER, cp);
+	if((p->status=smb_hfield_str(msg, SENDER, cp))!=SMB_SUCCESS)
+		return(FALSE);
 	if(!(p->smb.status.attr&SMB_EMAIL)) {
 		SAFECOPY(from,cp);
 		strlwr(from);
@@ -222,7 +231,8 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "from_ext", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, SENDEREXT, cp);
+		if((p->status=smb_hfield_str(msg, SENDEREXT, cp))!=SMB_SUCCESS)
+			return(FALSE);
 		if(p->smb.status.attr&SMB_EMAIL)
 			msg->idx.from=atoi(cp);
 	}
@@ -230,7 +240,8 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "from_org", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, SENDERORG, cp);
+		if((p->status=smb_hfield_str(msg, SENDERORG, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "from_net_type", &val) && !JSVAL_NULL_OR_VOID(val)) {
@@ -241,61 +252,71 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "from_net_addr", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_netaddr(msg, SENDERNETADDR, cp, &nettype);
+		if((p->status=smb_hfield_netaddr(msg, SENDERNETADDR, cp, &nettype))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 	
 	if(nettype!=NET_UNKNOWN && nettype!=NET_NONE) {
 		if(p->smb.status.attr&SMB_EMAIL)
 			msg->idx.from=0;
-		smb_hfield_bin(msg, SENDERNETTYPE, nettype);
+		if((p->status=smb_hfield_bin(msg, SENDERNETTYPE, nettype))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "from_agent", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		JS_ValueToInt32(cx,val,&i32);
 		agent=(ushort)i32;
-		smb_hfield_bin(msg, SENDERAGENT, agent);
+		if((p->status=smb_hfield_bin(msg, SENDERAGENT, agent))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "from_ip_addr", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, SENDERIPADDR, cp);
+		if((p->status=smb_hfield_str(msg, SENDERIPADDR, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "from_host_name", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, SENDERHOSTNAME, cp);
+		if((p->status=smb_hfield_str(msg, SENDERHOSTNAME, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "from_protocol", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, SENDERPROTOCOL, cp);
+		if((p->status=smb_hfield_str(msg, SENDERPROTOCOL, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "from_port", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		JS_ValueToInt32(cx,val,&i32);
 		port=(ushort)i32;
-		smb_hfield_bin(msg, SENDERPORT, port);
+		if((p->status=smb_hfield_bin(msg, SENDERPORT, port))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "replyto", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, REPLYTO, cp);
+		if((p->status=smb_hfield_str(msg, REPLYTO, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "replyto_ext", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, REPLYTOEXT, cp);
+		if((p->status=smb_hfield_str(msg, REPLYTOEXT, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "replyto_org", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, REPLYTOORG, cp);
+		if((p->status=smb_hfield_str(msg, REPLYTOORG, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	nettype=NET_UNKNOWN;
@@ -306,84 +327,99 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 	if(JS_GetProperty(cx, hdr, "replyto_net_addr", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_netaddr(msg, REPLYTONETADDR, cp, &nettype);
+		if((p->status=smb_hfield_netaddr(msg, REPLYTONETADDR, cp, &nettype))!=SMB_SUCCESS)
+			return(FALSE);
+	}
+	if(nettype!=NET_UNKNOWN && nettype!=NET_NONE) {
+		if((p->status=smb_hfield_bin(msg, REPLYTONETTYPE, nettype))!=SMB_SUCCESS)
+			return(FALSE);
 	}
-	if(nettype!=NET_UNKNOWN && nettype!=NET_NONE)
-		smb_hfield_bin(msg, REPLYTONETTYPE, nettype);
 
 	if(JS_GetProperty(cx, hdr, "replyto_agent", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		JS_ValueToInt32(cx,val,&i32);
 		agent=(ushort)i32;
-		smb_hfield_bin(msg, REPLYTOAGENT, agent);
+		if((p->status=smb_hfield_bin(msg, REPLYTOAGENT, agent))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	/* RFC822 headers */
 	if(JS_GetProperty(cx, hdr, "id", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, RFC822MSGID, cp);
+		if((p->status=smb_hfield_str(msg, RFC822MSGID, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "reply_id", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, RFC822REPLYID, cp);
+		if((p->status=smb_hfield_str(msg, RFC822REPLYID, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "reverse_path", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, SMTPREVERSEPATH, cp);
+		if((p->status=smb_hfield_str(msg, SMTPREVERSEPATH, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	/* USENET headers */
 	if(JS_GetProperty(cx, hdr, "path", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, USENETPATH, cp);
+		if((p->status=smb_hfield_str(msg, USENETPATH, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "newsgroups", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, USENETNEWSGROUPS, cp);
+		if((p->status=smb_hfield_str(msg, USENETNEWSGROUPS, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	/* FTN headers */
 	if(JS_GetProperty(cx, hdr, "ftn_msgid", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, FIDOMSGID, cp);
+		if((p->status=smb_hfield_str(msg, FIDOMSGID, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "ftn_reply", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, FIDOREPLYID, cp);
+		if((p->status=smb_hfield_str(msg, FIDOREPLYID, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "ftn_area", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, FIDOAREA, cp);
+		if((p->status=smb_hfield_str(msg, FIDOAREA, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "ftn_flags", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, FIDOFLAGS, cp);
+		if((p->status=smb_hfield_str(msg, FIDOFLAGS, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "ftn_pid", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, FIDOPID, cp);
+		if((p->status=smb_hfield_str(msg, FIDOPID, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "ftn_tid", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 			return(FALSE);
-		smb_hfield_str(msg, FIDOTID, cp);
+		if((p->status=smb_hfield_str(msg, FIDOTID, cp))!=SMB_SUCCESS)
+			return(FALSE);
 	}
 
 	if(JS_GetProperty(cx, hdr, "date", &val) && !JSVAL_NULL_OR_VOID(val)) {
@@ -461,18 +497,19 @@ static BOOL parse_header_object(JSContext* cx, private_t* p, JSObject* hdr, smbm
 				continue;
 			if((cp=JS_GetStringBytes(JS_ValueToString(cx,val)))==NULL)
 				return(FALSE);
-			smb_hfield_str(msg, type, cp);
+			if((p->status=smb_hfield_str(msg, type, cp))!=SMB_SUCCESS)
+				return(FALSE);
 		}
 	}
 
 	return(TRUE);
 }
 
-BOOL msg_offset_by_id(scfg_t* scfg, smb_t* smb, char* id, ulong* offset)
+BOOL msg_offset_by_id(private_t* p, char* id, ulong* offset)
 {
 	smbmsg_t msg;
 
-	if(smb_getmsgidx_by_msgid(smb,&msg,id)!=SMB_SUCCESS)
+	if((p->status=smb_getmsgidx_by_msgid(&(p->smb),&msg,id))!=SMB_SUCCESS)
 		return(FALSE);
 
 	*offset = msg.offset;
@@ -510,7 +547,7 @@ js_get_msg_index(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
 			else									/* Get by number */
 				JS_ValueToInt32(cx,argv[n],(int32*)&msg.hdr.number);
 
-			if(smb_getmsgidx(&(p->smb), &msg)!=0)
+			if((p->status=smb_getmsgidx(&(p->smb), &msg))!=SMB_SUCCESS)
 				return(JS_TRUE);
 
 			break;
@@ -605,13 +642,13 @@ js_get_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
 			else									/* Get by number */
 				JS_ValueToInt32(cx,argv[n],(int32*)&msg.hdr.number);
 
-			if(smb_getmsgidx(&(p->smb), &msg)!=0)
+			if((p->status=smb_getmsgidx(&(p->smb), &msg))!=SMB_SUCCESS)
 				return(JS_TRUE);
 
-			if(smb_lockmsghdr(&(p->smb),&msg)!=0)
+			if((p->status=smb_lockmsghdr(&(p->smb),&msg))!=SMB_SUCCESS)
 				return(JS_TRUE);
 
-			if(smb_getmsghdr(&(p->smb), &msg)!=0) {
+			if((p->status=smb_getmsghdr(&(p->smb), &msg))!=SMB_SUCCESS) {
 				smb_unlockmsghdr(&(p->smb),&msg); 
 				return(JS_TRUE);
 			}
@@ -619,8 +656,8 @@ js_get_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
 			smb_unlockmsghdr(&(p->smb),&msg); 
 			break;
 		} else if(JSVAL_IS_STRING(argv[n]))	{		/* Get by ID */
-			if(smb_getmsghdr_by_msgid(&(p->smb),&msg
-				,JS_GetStringBytes(JSVAL_TO_STRING(argv[n])))!=SMB_SUCCESS)
+			if((p->status=smb_getmsghdr_by_msgid(&(p->smb),&msg
+				,JS_GetStringBytes(JSVAL_TO_STRING(argv[n]))))!=SMB_SUCCESS)
 				return(JS_TRUE);	/* ID not found */
 			break;
 		}
@@ -973,7 +1010,7 @@ js_put_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
 			n++;
 			break;
 		} else if(JSVAL_IS_STRING(argv[n]))	{		/* Get by ID */
-			if(!msg_offset_by_id(scfg,&(p->smb)
+			if(!msg_offset_by_id(p
 				,JS_GetStringBytes(JSVAL_TO_STRING(argv[n]))
 				,&msg.offset))
 				return(JS_TRUE);	/* ID not found */
@@ -991,14 +1028,14 @@ js_put_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
 
 	hdr = JSVAL_TO_OBJECT(argv[n++]);
 
-	if(smb_getmsgidx(&(p->smb), &msg)!=0)
+	if((p->status=smb_getmsgidx(&(p->smb), &msg))!=SMB_SUCCESS)
 		return(JS_TRUE);
 
-	if(smb_lockmsghdr(&(p->smb),&msg)!=0)
+	if((p->status=smb_lockmsghdr(&(p->smb),&msg))!=SMB_SUCCESS)
 		return(JS_TRUE);
 
 	do {
-		if(smb_getmsghdr(&(p->smb), &msg)!=0)
+		if((p->status=smb_getmsghdr(&(p->smb), &msg))!=SMB_SUCCESS)
 			break;
 
 		smb_freemsghdrmem(&msg);	/* prevent duplicate header fields */
@@ -1008,7 +1045,7 @@ js_put_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
 			break;
 		}
 
-		if(smb_putmsg(&(p->smb), &msg)!=0)
+		if((p->status=smb_putmsg(&(p->smb), &msg))!=SMB_SUCCESS)
 			break;
 
 		*rval = JSVAL_TRUE;
@@ -1053,7 +1090,7 @@ js_remove_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 			n++;
 			break;
 		} else if(JSVAL_IS_STRING(argv[n]))	{		/* Get by ID */
-			if(!msg_offset_by_id(scfg,&(p->smb)
+			if(!msg_offset_by_id(p
 				,JS_GetStringBytes(JSVAL_TO_STRING(argv[n]))
 				,&msg.offset))
 				return(JS_TRUE);	/* ID not found */
@@ -1066,14 +1103,14 @@ js_remove_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	if(!msg_specified)
 		return(JS_TRUE);
 
-	if(smb_getmsgidx(&(p->smb), &msg)!=0)
+	if((p->status=smb_getmsgidx(&(p->smb), &msg))!=SMB_SUCCESS)
 		return(JS_TRUE);
 
-	if(smb_lockmsghdr(&(p->smb),&msg)!=0)
+	if((p->status=smb_lockmsghdr(&(p->smb),&msg))!=SMB_SUCCESS)
 		return(JS_TRUE);
 
 	do {
-		if(smb_getmsghdr(&(p->smb), &msg)!=0)
+		if((p->status=smb_getmsghdr(&(p->smb), &msg))!=SMB_SUCCESS)
 			break;
 
 		smb_freemsghdrmem(&msg);	/* prevent duplicate header fields */
@@ -1081,7 +1118,7 @@ js_remove_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 		msg.hdr.attr|=MSG_DELETE;
 		msg.idx.attr=msg.hdr.attr;
 
-		if(smb_putmsg(&(p->smb), &msg)!=0)
+		if((p->status=smb_putmsg(&(p->smb), &msg))!=SMB_SUCCESS)
 			break;
 
 		*rval = JSVAL_TRUE;
@@ -1094,28 +1131,28 @@ js_remove_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 }
 
 
-static char* get_msg_text(smb_t* smb, smbmsg_t* msg, BOOL strip_ctrl_a, BOOL rfc822, ulong mode)
+static char* get_msg_text(private_t* p, smbmsg_t* msg, BOOL strip_ctrl_a, BOOL rfc822, ulong mode)
 {
 	char*		buf;
 
-	if(smb_getmsgidx(smb, msg)!=0)
+	if((p->status=smb_getmsgidx(&(p->smb), msg))!=SMB_SUCCESS)
 		return(NULL);
 
-	if(smb_lockmsghdr(smb,msg)!=0)
+	if((p->status=smb_lockmsghdr(&(p->smb),msg))!=SMB_SUCCESS)
 		return(NULL);
 
-	if(smb_getmsghdr(smb, msg)!=0) {
-		smb_unlockmsghdr(smb, msg); 
+	if((p->status=smb_getmsghdr(&(p->smb), msg))!=SMB_SUCCESS) {
+		smb_unlockmsghdr(&(p->smb), msg); 
 		return(NULL);
 	}
 
-	if((buf=smb_getmsgtxt(smb, msg, mode))==NULL) {
-		smb_unlockmsghdr(smb,msg); 
+	if((buf=smb_getmsgtxt(&(p->smb), msg, mode))==NULL) {
+		smb_unlockmsghdr(&(p->smb),msg); 
 		smb_freemsgmem(msg);
 		return(NULL);
 	}
 
-	smb_unlockmsghdr(smb, msg); 
+	smb_unlockmsghdr(&(p->smb), msg); 
 	smb_freemsgmem(msg);
 
 	if(strip_ctrl_a) {
@@ -1189,7 +1226,7 @@ js_get_msg_body(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 			n++;
 			break;
 		} else if(JSVAL_IS_STRING(argv[n]))	{		/* Get by ID */
-			if(!msg_offset_by_id(scfg,&(p->smb)
+			if(!msg_offset_by_id(p
 				,JS_GetStringBytes(JSVAL_TO_STRING(argv[n]))
 				,&msg.offset))
 				return(JS_TRUE);	/* ID not found */
@@ -1211,7 +1248,7 @@ js_get_msg_body(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 	if(n<argc && JSVAL_IS_BOOLEAN(argv[n]))
 		tails=JSVAL_TO_BOOLEAN(argv[n++]);
 
-	buf = get_msg_text(&(p->smb), &msg, strip_ctrl_a, rfc822, tails ? GETMSGTXT_TAILS : 0);
+	buf = get_msg_text(p, &msg, strip_ctrl_a, rfc822, tails ? GETMSGTXT_TAILS : 0);
 	if(buf==NULL)
 		return(JS_TRUE);
 
@@ -1260,7 +1297,7 @@ js_get_msg_tail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 			n++;
 			break;
 		} else if(JSVAL_IS_STRING(argv[n]))	{		/* Get by ID */
-			if(!msg_offset_by_id(scfg,&(p->smb)
+			if(!msg_offset_by_id(p
 				,JS_GetStringBytes(JSVAL_TO_STRING(argv[n]))
 				,&msg.offset))
 				return(JS_TRUE);	/* ID not found */
@@ -1279,7 +1316,7 @@ js_get_msg_tail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 	if(n<argc && JSVAL_IS_BOOLEAN(argv[n]))
 		rfc822=JSVAL_TO_BOOLEAN(argv[n++]);
 
-	buf = get_msg_text(&(p->smb), &msg, strip_ctrl_a, rfc822, GETMSGTXT_TAILS|GETMSGTXT_NO_BODY);
+	buf = get_msg_text(p, &msg, strip_ctrl_a, rfc822, GETMSGTXT_TAILS|GETMSGTXT_NO_BODY);
 	if(buf==NULL)
 		return(JS_TRUE);
 
@@ -1386,13 +1423,13 @@ js_save_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 				if(!JSVAL_IS_OBJECT(val))
 					break;
 
-				if(smb_copymsgmem(&(p->smb), &rcpt_msg, &msg)!=SMB_SUCCESS)
+				if((p->status=smb_copymsgmem(&(p->smb), &rcpt_msg, &msg))!=SMB_SUCCESS)
 					break;
 
 				if(!parse_recipient_object(cx, p, JSVAL_TO_OBJECT(val), &rcpt_msg))
 					break;
 
-				if(smb_addmsghdr(&(p->smb), &rcpt_msg, SMB_SELFPACK)!=SMB_SUCCESS)
+				if((p->status=smb_addmsghdr(&(p->smb), &rcpt_msg, SMB_SELFPACK))!=SMB_SUCCESS)
 					break;
 
 				smb_freemsgmem(&rcpt_msg);
@@ -1426,6 +1463,7 @@ enum {
 	,SMB_PROP_ATTR			// Attributes for this message base (SMB_HYPER,etc)
 	,SMB_PROP_SUBNUM		// sub-board number
 	,SMB_PROP_IS_OPEN
+	,SMB_PROP_STATUS		// Last SMBLIB returned status value (e.g. retval)
 };
 
 static JSBool js_msgbase_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
@@ -1442,10 +1480,10 @@ static JSBool js_msgbase_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
 
 	switch(tiny) {
 		case SMB_PROP_RETRY_TIME:
-			JS_ValueToInt32(cx,*vp,(int32*)&p->smb.retry_time);
+			JS_ValueToInt32(cx,*vp,(int32*)&(p->smb).retry_time);
 			break;
 		case SMB_PROP_RETRY_DELAY:
-			JS_ValueToInt32(cx,*vp,(int32*)&p->smb.retry_delay);
+			JS_ValueToInt32(cx,*vp,(int32*)&(p->smb).retry_delay);
 			break;
 		case SMB_PROP_DEBUG:
 			JS_ValueToBoolean(cx,*vp,&p->debug);
@@ -1477,6 +1515,9 @@ static JSBool js_msgbase_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
 		case SMB_PROP_LAST_ERROR:
 			s=p->smb.last_error;
 			break;
+		case SMB_PROP_STATUS:
+			*vp = INT_TO_JSVAL(p->status);
+			break;
 		case SMB_PROP_RETRY_TIME:
 			*vp = INT_TO_JSVAL(p->smb.retry_time);
 			break;
@@ -1535,6 +1576,7 @@ static jsSyncPropertySpec js_msgbase_properties[] = {
 
 	{	"error"				,SMB_PROP_LAST_ERROR	,SMB_PROP_FLAGS,	310 },
 	{	"last_error"		,SMB_PROP_LAST_ERROR	,JSPROP_READONLY,	311 },	/* alias */
+	{	"status"			,SMB_PROP_STATUS		,SMB_PROP_FLAGS,	312 },
 	{	"file"				,SMB_PROP_FILE			,SMB_PROP_FLAGS,	310 },
 	{	"debug"				,SMB_PROP_DEBUG			,0,					310 },
 	{	"retry_time"		,SMB_PROP_RETRY_TIME	,JSPROP_ENUMERATE,	310 },
@@ -1555,6 +1597,7 @@ static jsSyncPropertySpec js_msgbase_properties[] = {
 static char* msgbase_prop_desc[] = {
 
 	 "last occurred message base error - <small>READ ONLY</small>"
+	,"return value of last <i>SMB Library</i> function call - <small>READ ONLY</small>"
 	,"base path and filename of message base - <small>READ ONLY</small>"
 	,"message base open/lock retry timeout (in seconds)"
 	,"delay between message base open/lock retries (in milliseconds)"