diff --git a/src/sbbs3/js_bbs.cpp b/src/sbbs3/js_bbs.cpp
index ecfc6b2d14d019854ebf3846362eeba7c72996cb..ef1e6b8ca60ee8dc818a4b43ce997c613fbb05ab 100644
--- a/src/sbbs3/js_bbs.cpp
+++ b/src/sbbs3/js_bbs.cpp
@@ -1419,11 +1419,13 @@ js_checkfname(JSContext *cx, uintN argc, jsval *arglist)
 	char*      fname = NULL;
 	jsrefcount rc;
 
-	JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
+	if (js_argcIsInsufficient(cx, argc, 1))
+		return JS_FALSE;
 
-	if (argc < 1 || !JSVAL_IS_STRING(argv[0]))
+	if (!JSVAL_IS_STRING(argv[0])) {
+		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
 		return JS_TRUE;
-
+	}
 	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
@@ -1450,7 +1452,7 @@ js_chksyspass(JSContext *cx, uintN argc, jsval *arglist)
 	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
-	if (argc) {
+	if (argc && !JSVAL_NULL_OR_VOID(argv[0])) {
 		JSString* str = JS_ValueToString(cx, argv[0]);
 		JSSTRING_TO_ASTRING(cx, str, sys_pw, sizeof(sbbs->cfg.sys_pass) + 2, NULL);
 	}
@@ -1646,10 +1648,9 @@ js_load_text(JSContext *cx, uintN argc, jsval *arglist)
 	if (js_argcIsInsufficient(cx, argc, 1))
 		return JS_FALSE;
 
-	if ((js_str = JS_ValueToString(cx, argv[0])) == NULL) {
-		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
-		return JS_TRUE;
-	}
+	if ((js_str = JS_ValueToString(cx, argv[0])) == NULL)
+		return JS_FALSE;
+
 	JSSTRING_TO_MSTRING(cx, js_str, cstr, NULL);
 	if (!cstr)
 		return JS_FALSE;
@@ -1802,24 +1803,20 @@ js_logkey(JSContext *cx, uintN argc, jsval *arglist)
 	sbbs_t*    sbbs;
 	jsrefcount rc;
 
+	if (js_argcIsInsufficient(cx, argc, 1))
+		return JS_FALSE;
 	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
-	JS_SET_RVAL(cx, arglist, JSVAL_VOID);
-
-	if ((js_str = JS_ValueToString(cx, argv[0])) == NULL) {
-		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
-		return JS_TRUE;
-	}
+	if ((js_str = JS_ValueToString(cx, argv[0])) == NULL)
+		return JS_FALSE;
 
 	if (argc > 1)
 		JS_ValueToBoolean(cx, argv[1], &comma);
 
 	JSSTRING_TO_MSTRING(cx, js_str, p, NULL);
-	if (p == NULL) {
-		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
-		return JS_TRUE;
-	}
+	if (p == NULL)
+		return JS_FALSE;
 
 	rc = JS_SUSPENDREQUEST(cx);
 	sbbs->logch(*p
@@ -1841,24 +1838,18 @@ js_logstr(JSContext *cx, uintN argc, jsval *arglist)
 	sbbs_t*    sbbs;
 	jsrefcount rc;
 
-	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
+	if (js_argcIsInsufficient(cx, argc, 1))
 		return JS_FALSE;
 
-	JS_SET_RVAL(cx, arglist, JSVAL_VOID);
-
-	if (js_argcIsInsufficient(cx, argc, 1))
+	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
-	if ((js_str = JS_ValueToString(cx, argv[0])) == NULL) {
-		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
-		return JS_TRUE;
-	}
+	if ((js_str = JS_ValueToString(cx, argv[0])) == NULL)
+		return JS_FALSE;
 
 	JSSTRING_TO_MSTRING(cx, js_str, p, NULL);
-	if (p == NULL) {
-		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
-		return JS_TRUE;
-	}
+	if (p == NULL)
+		return JS_FALSE;
 
 	rc = JS_SUSPENDREQUEST(cx);
 	sbbs->log(p);
@@ -1878,10 +1869,10 @@ js_finduser(JSContext *cx, uintN argc, jsval *arglist)
 	sbbs_t*    sbbs;
 	jsrefcount rc;
 
-	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
+	if (js_argcIsInsufficient(cx, argc, 1))
 		return JS_FALSE;
 
-	if (js_argcIsInsufficient(cx, argc, 1))
+	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
 	if ((js_str = JS_ValueToString(cx, argv[0])) == NULL) {
@@ -1913,10 +1904,10 @@ js_trashcan(JSContext *cx, uintN argc, jsval *arglist)
 	sbbs_t*    sbbs;
 	jsrefcount rc;
 
-	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
+	if (js_argcIsInsufficient(cx, argc, 2))
 		return JS_FALSE;
 
-	if (js_argcIsInsufficient(cx, argc, 2))
+	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
 	if ((js_can = JS_ValueToString(cx, argv[0])) == NULL) {
@@ -1995,10 +1986,10 @@ js_login(JSContext *cx, uintN argc, jsval *arglist)
 	sbbs_t*    sbbs;
 	jsrefcount rc;
 
-	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
+	if (js_argcIsInsufficient(cx, argc, 2))
 		return JS_FALSE;
 
-	if (js_argcIsInsufficient(cx, argc, 2))
+	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
 	if ((js_name = JS_ValueToString(cx, argv[0])) == NULL)
@@ -2249,14 +2240,14 @@ js_batchaddlist(JSContext *cx, uintN argc, jsval *arglist)
 	jsrefcount rc;
 	char*      cstr;
 
+	if (js_argcIsInsufficient(cx, argc, 1))
+		return JS_FALSE;
+
 	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
 	JS_SET_RVAL(cx, arglist, JSVAL_VOID);
 
-	if (js_argcIsInsufficient(cx, argc, 1))
-		return JS_FALSE;
-
 	JSVALUE_TO_MSTRING(cx, argv[0], cstr, NULL);
 	if (cstr == NULL)
 		return JS_FALSE;
@@ -2383,10 +2374,10 @@ js_viewfile(JSContext *cx, uintN argc, jsval *arglist)
 	jsrefcount rc;
 	char*      cstr;
 
-	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
+	if (js_argcIsInsufficient(cx, argc, 1))
 		return JS_FALSE;
 
-	if (js_argcIsInsufficient(cx, argc, 1))
+	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
 	JSVALUE_TO_MSTRING(cx, argv[0], cstr, NULL);
@@ -2413,10 +2404,10 @@ js_sendfile(JSContext *cx, uintN argc, jsval *arglist)
 	jsrefcount rc;
 	char*      cstr;
 
-	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
+	if (js_argcIsInsufficient(cx, argc, 1))
 		return JS_FALSE;
 
-	if (js_argcIsInsufficient(cx, argc, 1))
+	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
 	if (argc > 1) {
@@ -2460,10 +2451,10 @@ js_recvfile(JSContext *cx, uintN argc, jsval *arglist)
 	char*      cstr;
 	jsrefcount rc;
 
-	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
+	if (js_argcIsInsufficient(cx, argc, 1))
 		return JS_FALSE;
 
-	if (js_argcIsInsufficient(cx, argc, 1))
+	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
 	if (argc > 1) {
@@ -2889,14 +2880,14 @@ js_email(JSContext *cx, uintN argc, jsval *arglist)
 	smbmsg_t    msg;
 	jsrefcount  rc;
 
+	if (js_argcIsInsufficient(cx, argc, 1))
+		return JS_FALSE;
+
 	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
 	ZERO_VAR(msg);
 
-	if (js_argcIsInsufficient(cx, argc, 1))
-		return JS_FALSE;
-
 	if (JSVAL_IS_NUMBER(argv[0])) {
 		if (!JS_ValueToECMAUint32(cx, argv[0], &usernumber))
 			return JS_FALSE;
@@ -3152,10 +3143,10 @@ js_telnet_gate(JSContext *cx, uintN argc, jsval *arglist)
 	str_list_t send_strings = NULL;
 	jsrefcount rc;
 
-	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
+	if (js_argcIsInsufficient(cx, argc, 1))
 		return JS_FALSE;
 
-	if (js_argcIsInsufficient(cx, argc, 1))
+	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
 	if ((js_addr = JS_ValueToString(cx, argv[0])) == NULL)
@@ -3226,10 +3217,10 @@ js_rlogin_gate(JSContext *cx, uintN argc, jsval *arglist)
 	str_list_t send_strings = NULL;
 	jsrefcount rc;
 
-	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
+	if (js_argcIsInsufficient(cx, argc, 1))
 		return JS_FALSE;
 
-	if (js_argcIsInsufficient(cx, argc, 1))
+	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
 	if ((js_str = JS_ValueToString(cx, argv[0])) == NULL)
@@ -3343,8 +3334,8 @@ js_multinode_chat(JSContext *cx, uintN argc, jsval *arglist)
 
 	JS_SET_RVAL(cx, arglist, JSVAL_VOID);
 
-	if (argc > 1 && JSVAL_IS_NUMBER(argv[1])) {
-		if (!JS_ValueToInt32(cx, argv[1], &channel))
+	if (argc > 0 && JSVAL_IS_NUMBER(argv[0])) {
+		if (!JS_ValueToInt32(cx, argv[0], &channel))
 			return JS_FALSE;
 	}
 
@@ -3670,14 +3661,14 @@ js_cmdstr(JSContext *cx, uintN argc, jsval *arglist)
 	sbbs_t*     sbbs;
 	jsrefcount  rc;
 
+	if (js_argcIsInsufficient(cx, argc, 1))
+		return JS_FALSE;
+
 	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
 	JS_SET_RVAL(cx, arglist, JSVAL_VOID);
 
-	if (js_argcIsInsufficient(cx, argc, 1))
-		return JS_FALSE;
-
 	js_str = JS_ValueToString(cx, argv[0]);
 	if (!js_str)
 		return JS_FALSE;
@@ -3763,6 +3754,9 @@ js_export_filelist(JSContext *cx, uintN argc, jsval *arglist)
 	sbbs_t*    sbbs;
 	jsrefcount rc;
 
+	if (js_argcIsInsufficient(cx, argc, 1))
+		return JS_FALSE;
+
 	if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
 		return JS_FALSE;
 
@@ -5020,7 +5014,7 @@ static jsSyncMethodSpec js_bbs_functions[] = {
 	 , JSDOCSTR("Page the guru for chat.")
 	 , 310
 	},
-	{"multinode_chat",  js_multinode_chat,  0,  JSTYPE_VOID,    JSDOCSTR("")
+	{"multinode_chat",  js_multinode_chat,  0,  JSTYPE_VOID,    JSDOCSTR("[<i>number</i> channel=1]")
 	 , JSDOCSTR("Enter multi-node chat.")
 	 , 310
 	},