--- sbbs/src/sbbs3/js_bbs.cpp 2018/04/24 16:41:23 1.1.1.1 +++ sbbs/src/sbbs3/js_bbs.cpp 2018/04/24 16:42:44 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet JavaScript "bbs" Object */ -/* $Id: js_bbs.cpp,v 1.1.1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: js_bbs.cpp,v 1.1.1.2 2018/04/24 16:42:44 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * - * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2009 Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * @@ -36,6 +36,7 @@ ****************************************************************************/ #include "sbbs.h" +#include "js_request.h" #ifdef JAVASCRIPT @@ -83,6 +84,7 @@ enum { ,BBS_PROP_CONNECTION /* READ ONLY */ ,BBS_PROP_RLOGIN_NAME + ,BBS_PROP_RLOGIN_PASS ,BBS_PROP_CLIENT_NAME ,BBS_PROP_ALTUL @@ -182,7 +184,8 @@ enum { ,"current file directory internal code" ,"remote connection type" - ,"rlogin name" + ,"login name given during RLogin negotiation" + ,"password specified during RLogin negotiation" ,"client name" ,"current alternate upload path number" @@ -244,11 +247,13 @@ enum { static JSBool js_bbs_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { - char* p=NULL; - char* nulstr=""; + char tmp[128]; + const char* p=NULL; + const char* nulstr=""; ulong val=0; jsint tiny; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -281,7 +286,9 @@ static JSBool js_bbs_get(JSContext *cx, val=sbbs->online; break; case BBS_PROP_TIMELEFT: - val=sbbs->timeleft; + rc=JS_SUSPENDREQUEST(cx); + val=sbbs->gettimeleft(false); + JS_RESUMEREQUEST(cx, rc); break; case BBS_PROP_EVENT_TIME: val=sbbs->event_time; @@ -371,6 +378,9 @@ static JSBool js_bbs_get(JSContext *cx, case BBS_PROP_RLOGIN_NAME: p=sbbs->rlogin_name; break; + case BBS_PROP_RLOGIN_PASS: + p=sbbs->rlogin_pass; + break; case BBS_PROP_CLIENT_NAME: p=sbbs->client_name; break; @@ -469,7 +479,7 @@ static JSBool js_bbs_get(JSContext *cx, if(sbbs->current_msg==NULL || sbbs->current_msg->to_net.type==NET_NONE) p=nulstr; else - p=smb_netaddr(&sbbs->current_msg->to_net); + p=smb_netaddrstr(&sbbs->current_msg->to_net,tmp); break; case BBS_PROP_MSG_TO_AGENT: if(sbbs->current_msg!=NULL) @@ -491,7 +501,7 @@ static JSBool js_bbs_get(JSContext *cx, if(sbbs->current_msg==NULL || sbbs->current_msg->from_net.type==NET_NONE) p=nulstr; else - p=smb_netaddr(&sbbs->current_msg->from_net); + p=smb_netaddrstr(&sbbs->current_msg->from_net,tmp); break; case BBS_PROP_MSG_FROM_AGENT: if(sbbs->current_msg!=NULL) @@ -513,7 +523,7 @@ static JSBool js_bbs_get(JSContext *cx, if(sbbs->current_msg==NULL || sbbs->current_msg->replyto_net.type==NET_NONE) p=nulstr; else - p=smb_netaddr(&sbbs->current_msg->replyto_net); + p=smb_netaddrstr(&sbbs->current_msg->replyto_net,tmp); break; case BBS_PROP_MSG_REPLYTO_AGENT: if(sbbs->current_msg!=NULL) @@ -772,6 +782,9 @@ static JSBool js_bbs_set(JSContext *cx, case BBS_PROP_RLOGIN_NAME: SAFECOPY(sbbs->rlogin_name,p); break; + case BBS_PROP_RLOGIN_PASS: + SAFECOPY(sbbs->rlogin_pass,p); + break; case BBS_PROP_CLIENT_NAME: SAFECOPY(sbbs->client_name,p); break; @@ -842,6 +855,7 @@ static jsSyncPropertySpec js_bbs_propert { "curdir_code" ,BBS_PROP_CURDIR_CODE ,JSPROP_ENUMERATE ,314}, { "connection" ,BBS_PROP_CONNECTION ,PROP_READONLY ,310}, { "rlogin_name" ,BBS_PROP_RLOGIN_NAME ,JSPROP_ENUMERATE ,310}, + { "rlogin_password" ,BBS_PROP_RLOGIN_PASS ,JSPROP_ENUMERATE ,315}, { "client_name" ,BBS_PROP_CLIENT_NAME ,JSPROP_ENUMERATE ,310}, { "alt_ul_dir" ,BBS_PROP_ALTUL ,JSPROP_ENUMERATE ,310}, { "errorlevel" ,BBS_PROP_ERRORLEVEL ,PROP_READONLY ,312}, @@ -942,6 +956,7 @@ js_menu(JSContext *cx, JSObject *obj, ui { JSString* str; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -950,7 +965,9 @@ js_menu(JSContext *cx, JSObject *obj, ui if (!str) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->menu(JS_GetStringBytes(str)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -959,11 +976,14 @@ static JSBool js_hangup(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->hangup(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -972,12 +992,15 @@ static JSBool js_nodesync(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->getnodedat(sbbs->cfg.node_num,&sbbs->thisnode,0); sbbs->nodesync(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -987,10 +1010,12 @@ js_exec(JSContext *cx, JSObject *obj, ui { uintN i; sbbs_t* sbbs; - long mode=0; + int32 mode=0; JSString* cmd; JSString* startup_dir=NULL; char* p_startup_dir=NULL; + jsrefcount rc; + char* cstr; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1000,7 +1025,7 @@ js_exec(JSContext *cx, JSObject *obj, ui for(i=1;iexternal(JS_GetStringBytes(cmd),mode,p_startup_dir)); + cstr=JS_GetStringBytes(cmd); + rc=JS_SUSPENDREQUEST(cx); + *rval = INT_TO_JSVAL(sbbs->external(cstr,mode,p_startup_dir)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1020,6 +1048,7 @@ js_exec_xtrn(JSContext *cx, JSObject *ob char* code; sbbs_t* sbbs; JSString* str; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1042,7 +1071,9 @@ js_exec_xtrn(JSContext *cx, JSObject *ob return(JS_TRUE); } + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->exec_xtrn(i)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1051,13 +1082,16 @@ js_user_event(JSContext *cx, JSObject *o { int32 i=0; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); if(JSVAL_IS_NUM(argv[0])) JS_ValueToInt32(cx,argv[0],&i); + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->user_event((user_event_t)i)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1065,11 +1099,14 @@ static JSBool js_chksyspass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->chksyspass()); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1077,13 +1114,18 @@ static JSBool js_chkpass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + char* cstr; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); JSString* str=JS_ValueToString(cx,argv[0]); - *rval = BOOLEAN_TO_JSVAL(sbbs->chkpass(JS_GetStringBytes(str),&sbbs->useron,true)); + cstr=JS_GetStringBytes(str); + rc=JS_SUSPENDREQUEST(cx); + *rval = BOOLEAN_TO_JSVAL(sbbs->chkpass(cstr,&sbbs->useron,true)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1198,6 +1240,8 @@ js_load_text(JSContext *cx, JSObject *ob FILE* stream; JSString* js_str; sbbs_t* sbbs; + char* cstr; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1206,7 +1250,9 @@ js_load_text(JSContext *cx, JSObject *ob *rval = JSVAL_FALSE; return(JS_TRUE); } + cstr=JS_GetStringBytes(js_str); + rc=JS_SUSPENDREQUEST(cx); for(i=0;itext[i]!=sbbs->text_sav[i]) { if(sbbs->text[i]!=nulstr) @@ -1215,14 +1261,15 @@ js_load_text(JSContext *cx, JSObject *ob } } sprintf(path,"%s%s.dat" - ,sbbs->cfg.ctrl_dir,JS_GetStringBytes(js_str)); + ,sbbs->cfg.ctrl_dir,cstr); if((stream=fnopen(NULL,path,O_RDONLY))==NULL) { *rval = JSVAL_FALSE; + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } for(i=0;itext[i]=readtext((long *)NULL,stream))==NULL) { + if((sbbs->text[i]=readtext((long *)NULL,stream,i))==NULL) { i--; continue; } @@ -1241,6 +1288,7 @@ js_load_text(JSContext *cx, JSObject *ob *rval = JSVAL_TRUE; fclose(stream); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1248,20 +1296,51 @@ js_load_text(JSContext *cx, JSObject *ob static JSBool js_atcode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - char str[128]; sbbs_t* sbbs; + char str[128],str2[128],*p; + char *instr; + int disp_len; + bool padded_left=false; + bool padded_right=false; + const char *cp; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); - char* p = JS_GetStringBytes(JS_ValueToString(cx, argv[0])); + instr = strdup(JS_GetStringBytes(JS_ValueToString(cx, argv[0]))); + if(instr==NULL) + return(JS_FALSE); - p=sbbs->atcode(p,str,sizeof(str)); + disp_len=strlen(instr); + if((p=strstr(instr,"-L"))!=NULL) + padded_left=true; + else if((p=strstr(instr,"-R"))!=NULL) + padded_right=true; + if(p!=NULL) { + if(*(p+2) && isdigit(*(p+2))) + disp_len=atoi(p+2); + *p=0; + } - if(p==NULL) + if(disp_len >= sizeof(str)) + disp_len=sizeof(str)-1; + + rc=JS_SUSPENDREQUEST(cx); + cp=sbbs->atcode(instr,str2,sizeof(str2)); + free(instr); + JS_RESUMEREQUEST(cx, rc); + if(cp==NULL) *rval = JSVAL_NULL; else { - JSString* js_str = JS_NewStringCopyZ(cx, p); + if(padded_left) + sprintf(str,"%-*.*s",disp_len,disp_len,cp); + else if(padded_right) + sprintf(str,"%*.*s",disp_len,disp_len,cp); + else + SAFECOPY(str,cp); + + JSString* js_str = JS_NewStringCopyZ(cx, str); if(js_str==NULL) return(JS_FALSE); *rval = STRING_TO_JSVAL(js_str); @@ -1278,6 +1357,7 @@ js_logkey(JSContext *cx, JSObject *obj, JSBool comma=false; JSString* js_str; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1295,9 +1375,11 @@ js_logkey(JSContext *cx, JSObject *obj, return(JS_TRUE); } + rc=JS_SUSPENDREQUEST(cx); sbbs->logch(*p ,comma ? true:false // This is a dumb bool conversion to make BC++ happy ); + JS_RESUMEREQUEST(cx, rc); *rval = JSVAL_TRUE; return(JS_TRUE); @@ -1309,6 +1391,7 @@ js_logstr(JSContext *cx, JSObject *obj, char* p; JSString* js_str; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1323,7 +1406,9 @@ js_logstr(JSContext *cx, JSObject *obj, return(JS_TRUE); } + rc=JS_SUSPENDREQUEST(cx); sbbs->log(p); + JS_RESUMEREQUEST(cx, rc); *rval = JSVAL_TRUE; return(JS_TRUE); @@ -1335,6 +1420,7 @@ js_finduser(JSContext *cx, JSObject *obj char* p; JSString* js_str; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1349,7 +1435,9 @@ js_finduser(JSContext *cx, JSObject *obj return(JS_TRUE); } + rc=JS_SUSPENDREQUEST(cx); *rval = INT_TO_JSVAL(sbbs->finduser(p)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1361,6 +1449,7 @@ js_trashcan(JSContext *cx, JSObject *obj JSString* js_str; JSString* js_can; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1385,7 +1474,9 @@ js_trashcan(JSContext *cx, JSObject *obj return(JS_TRUE); } + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->trashcan(str,can)); // user args are reversed + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1393,11 +1484,14 @@ static JSBool js_newuser(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->newuser()); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1405,11 +1499,14 @@ static JSBool js_logon(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->logon()); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1421,6 +1518,7 @@ js_login(JSContext *cx, JSObject *obj, u JSString* js_name; JSString* js_pw; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1437,7 +1535,9 @@ js_login(JSContext *cx, JSObject *obj, u if((pw=JS_GetStringBytes(js_pw))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->login(name,pw)==LOGIC_TRUE ? JS_TRUE:JS_FALSE); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1446,17 +1546,24 @@ static JSBool js_logoff(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; + JSBool prompt=JS_TRUE; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); - if(!sbbs->noyes(sbbs->text[LogOffQ])) { + if(argc) + JS_ValueToBoolean(cx,argv[0],&prompt); + + rc=JS_SUSPENDREQUEST(cx); + if(!prompt || !sbbs->noyes(sbbs->text[LogOffQ])) { if(sbbs->cfg.logoff_mod[0]) sbbs->exec_bin(sbbs->cfg.logoff_mod,&sbbs->main_csi); sbbs->user_event(EVENT_LOGOFF); sbbs->menu("logoff"); sbbs->hangup(); } + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1465,11 +1572,14 @@ static JSBool js_logout(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->logout(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1478,11 +1588,14 @@ static JSBool js_automsg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->automsg(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1491,11 +1604,14 @@ static JSBool js_time_bank(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->time_bank(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1504,11 +1620,14 @@ static JSBool js_text_sec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->text_sec(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1517,11 +1636,14 @@ static JSBool js_qwk_sec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->qwk_sec(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1530,11 +1652,14 @@ static JSBool js_xtrn_sec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->xtrn_sec(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1543,11 +1668,14 @@ static JSBool js_xfer_policy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->xfer_policy(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1556,11 +1684,14 @@ static JSBool js_batchmenu(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->batchmenu(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1569,11 +1700,14 @@ static JSBool js_batchdownload(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->start_batch_download()); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1581,11 +1715,16 @@ static JSBool js_batchaddlist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; + char* cstr; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); - sbbs->batch_add_list(JS_GetStringBytes(JS_ValueToString(cx, argv[0]))); + cstr=JS_GetStringBytes(JS_ValueToString(cx, argv[0])); + rc=JS_SUSPENDREQUEST(cx); + sbbs->batch_add_list(cstr); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1596,6 +1735,8 @@ js_sendfile(JSContext *cx, JSObject *obj sbbs_t* sbbs; char prot=0; char* p; + jsrefcount rc; + char* cstr; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1603,7 +1744,10 @@ js_sendfile(JSContext *cx, JSObject *obj if(argc>1 && (p=js_ValueToStringBytes(cx, argv[1], NULL))!=NULL) prot=*p; - *rval = BOOLEAN_TO_JSVAL(sbbs->sendfile(JS_GetStringBytes(JS_ValueToString(cx, argv[0])),prot)); + cstr=JS_GetStringBytes(JS_ValueToString(cx, argv[0])); + rc=JS_SUSPENDREQUEST(cx); + *rval = BOOLEAN_TO_JSVAL(sbbs->sendfile(cstr,prot)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1614,6 +1758,8 @@ js_recvfile(JSContext *cx, JSObject *obj sbbs_t* sbbs; char prot=0; char* p; + char* cstr; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1621,7 +1767,10 @@ js_recvfile(JSContext *cx, JSObject *obj if(argc>1 && (p=js_ValueToStringBytes(cx, argv[1], NULL))!=NULL) prot=*p; - *rval = BOOLEAN_TO_JSVAL(sbbs->recvfile(JS_GetStringBytes(JS_ValueToString(cx, argv[0])),prot)); + cstr=JS_GetStringBytes(JS_ValueToString(cx, argv[0])); + rc=JS_SUSPENDREQUEST(cx); + *rval = BOOLEAN_TO_JSVAL(sbbs->recvfile(cstr,prot)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1630,11 +1779,14 @@ static JSBool js_temp_xfer(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->temp_xfer(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1643,13 +1795,16 @@ static JSBool js_user_config(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->maindflts(&sbbs->useron); if(!(sbbs->useron.rest&FLAG('G'))) /* not guest */ getuserdat(&sbbs->cfg,&sbbs->useron); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1658,11 +1813,14 @@ static JSBool js_user_sync(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); getuserdat(&sbbs->cfg,&sbbs->useron); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1671,11 +1829,14 @@ static JSBool js_sys_info(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->sys_info(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1684,14 +1845,17 @@ static JSBool js_sub_info(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); uint subnum=get_subnum(cx,sbbs,argv[0]); + rc=JS_SUSPENDREQUEST(cx); if(subnumcfg.total_subs) sbbs->subinfo(subnum); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1700,13 +1864,16 @@ static JSBool js_dir_info(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); uint dirnum=get_dirnum(cx,sbbs,argv[0]); + rc=JS_SUSPENDREQUEST(cx); if(dirnumcfg.total_dirs) sbbs->dirinfo(dirnum); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1715,11 +1882,14 @@ static JSBool js_user_info(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->user_info(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1728,11 +1898,14 @@ static JSBool js_ver(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->ver(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1741,11 +1914,14 @@ static JSBool js_sys_stats(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->sys_stats(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1755,6 +1931,7 @@ js_node_stats(JSContext *cx, JSObject *o { int32 node_num=0; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1762,7 +1939,9 @@ js_node_stats(JSContext *cx, JSObject *o if(argc>0 && JSVAL_IS_NUM(argv[0])) JS_ValueToInt32(cx,argv[0],&node_num); + rc=JS_SUSPENDREQUEST(cx); sbbs->node_stats(node_num); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1772,6 +1951,7 @@ js_userlist(JSContext *cx, JSObject *obj { int32 mode=UL_ALL; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1779,7 +1959,9 @@ js_userlist(JSContext *cx, JSObject *obj if(argc>0 && JSVAL_IS_NUM(argv[0])) JS_ValueToInt32(cx,argv[0],&mode); + rc=JS_SUSPENDREQUEST(cx); sbbs->userlist(mode); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1789,6 +1971,7 @@ js_useredit(JSContext *cx, JSObject *obj { int32 usernumber=0; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1796,7 +1979,9 @@ js_useredit(JSContext *cx, JSObject *obj if(argc>0 && JSVAL_IS_NUM(argv[0])) JS_ValueToInt32(cx,argv[0],&usernumber); + rc=JS_SUSPENDREQUEST(cx); sbbs->useredit(usernumber); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1805,11 +1990,14 @@ static JSBool js_change_user(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->change_user(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1818,11 +2006,14 @@ static JSBool js_logonlist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->logonlist(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1831,11 +2022,14 @@ static JSBool js_nodelist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->nodelist(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1844,11 +2038,14 @@ static JSBool js_whos_online(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->whos_online(true); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1858,13 +2055,16 @@ js_spy(JSContext *cx, JSObject *obj, uin { int32 node_num=0; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); if(argc && JSVAL_IS_NUM(argv[0])) JS_ValueToInt32(cx,argv[0],&node_num); + rc=JS_SUSPENDREQUEST(cx); sbbs->spy(node_num); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1875,6 +2075,7 @@ js_readmail(JSContext *cx, JSObject *obj int32 readwhich=MAIL_YOUR; int32 usernumber; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1885,7 +2086,9 @@ js_readmail(JSContext *cx, JSObject *obj if(argc>1 && JSVAL_IS_NUM(argv[1])) JS_ValueToInt32(cx,argv[1],&usernumber); + rc=JS_SUSPENDREQUEST(cx); sbbs->readmail(usernumber,readwhich); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1894,12 +2097,13 @@ static JSBool js_email(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { int32 usernumber=1; - long mode=WM_EMAIL; - char* top=""; - char* subj=""; + int32 mode=WM_EMAIL; + const char* top=""; + const char* subj=""; JSString* js_top=NULL; JSString* js_subj=NULL; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1908,7 +2112,7 @@ js_email(JSContext *cx, JSObject *obj, u JS_ValueToInt32(cx,argv[0],&usernumber); for(uintN i=1;iemail(usernumber,top,subj,mode)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } static JSBool js_netmail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - long mode=0; - char* subj=""; + int32 mode=0; + const char* subj=""; JSString* js_to; JSString* js_subj=NULL; sbbs_t* sbbs; + char* cstr; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1940,7 +2148,7 @@ js_netmail(JSContext *cx, JSObject *obj, for(uintN i=1;inetmail(JS_GetStringBytes(js_to),subj,mode)); + cstr=JS_GetStringBytes(js_to); + rc=JS_SUSPENDREQUEST(cx); + *rval = BOOLEAN_TO_JSVAL(sbbs->netmail(cstr,subj,mode)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1958,6 +2169,7 @@ js_bulkmail(JSContext *cx, JSObject *obj uchar* ar=(uchar*)""; JSString* js_ars=NULL; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1968,9 +2180,11 @@ js_bulkmail(JSContext *cx, JSObject *obj ar=arstr(NULL,JS_GetStringBytes(js_ars), &sbbs->cfg); } + rc=JS_SUSPENDREQUEST(cx); sbbs->bulkmail(ar); if(ar && ar[0]) free(ar); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -1980,6 +2194,7 @@ js_upload_file(JSContext *cx, JSObject * { uint dirnum=0; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -1991,7 +2206,9 @@ js_upload_file(JSContext *cx, JSObject * return(JS_TRUE); } + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->upload(dirnum)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2001,6 +2218,7 @@ js_bulkupload(JSContext *cx, JSObject *o { uint dirnum=0; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2012,7 +2230,9 @@ js_bulkupload(JSContext *cx, JSObject *o return(JS_TRUE); } + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->bulkupload(dirnum)==0); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2021,6 +2241,7 @@ js_resort_dir(JSContext *cx, JSObject *o { uint dirnum=0; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2032,7 +2253,9 @@ js_resort_dir(JSContext *cx, JSObject *o return(JS_TRUE); } + rc=JS_SUSPENDREQUEST(cx); sbbs->resort(dirnum); + JS_RESUMEREQUEST(cx, rc); *rval = JSVAL_TRUE; return(JS_TRUE); @@ -2045,6 +2268,7 @@ js_telnet_gate(JSContext *cx, JSObject * int32 mode=0; JSString* js_addr; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2058,7 +2282,9 @@ js_telnet_gate(JSContext *cx, JSObject * if(argc>1 && JSVAL_IS_NUM(argv[1])) JS_ValueToInt32(cx,argv[1],&mode); + rc=JS_SUSPENDREQUEST(cx); sbbs->telnet_gate(addr,mode); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2067,11 +2293,14 @@ static JSBool js_pagesysop(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->sysop_page()); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2079,11 +2308,14 @@ static JSBool js_pageguru(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->guru_page()); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2092,6 +2324,7 @@ js_multinode_chat(JSContext *cx, JSObjec { sbbs_t* sbbs; int32 channel=1; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2099,7 +2332,9 @@ js_multinode_chat(JSContext *cx, JSObjec if(argc>1 && JSVAL_IS_NUM(argv[1])) JS_ValueToInt32(cx,argv[1],&channel); + rc=JS_SUSPENDREQUEST(cx); sbbs->multinodechat(channel); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2108,11 +2343,14 @@ static JSBool js_private_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->nodemsg(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2122,6 +2360,7 @@ js_private_chat(JSContext *cx, JSObject { sbbs_t* sbbs; JSBool local=false; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2129,7 +2368,9 @@ js_private_chat(JSContext *cx, JSObject if(argc) JS_ValueToBoolean(cx,argv[0],&local); + rc=JS_SUSPENDREQUEST(cx); sbbs->privchat(local ? true:false); // <- eliminates stupid msvc6 "performance warning" + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2138,11 +2379,14 @@ static JSBool js_get_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->getnmsg(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2154,6 +2398,7 @@ js_put_node_message(JSContext *cx, JSObj int32 node=0; JSString* js_msg; char* msg; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2169,7 +2414,9 @@ js_put_node_message(JSContext *cx, JSObj if((msg=JS_GetStringBytes(js_msg))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(putnmsg(&sbbs->cfg,node,msg)==0); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2179,6 +2426,7 @@ js_get_telegram(JSContext *cx, JSObject { sbbs_t* sbbs; int32 usernumber; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2187,7 +2435,9 @@ js_get_telegram(JSContext *cx, JSObject if(argc && JSVAL_IS_NUM(argv[0])) JS_ValueToInt32(cx,argv[0],&usernumber); + rc=JS_SUSPENDREQUEST(cx); sbbs->getsmsg(usernumber); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2199,6 +2449,7 @@ js_put_telegram(JSContext *cx, JSObject int32 usernumber=0; JSString* js_msg; char* msg; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2214,7 +2465,9 @@ js_put_telegram(JSContext *cx, JSObject if((msg=JS_GetStringBytes(js_msg))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(putsmsg(&sbbs->cfg,usernumber,msg)==0); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2223,10 +2476,11 @@ static JSBool js_cmdstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; - char* fpath=""; - char* fspec=""; + const char* fpath=""; + const char* fspec=""; JSString* js_str; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2247,7 +2501,9 @@ js_cmdstr(JSContext *cx, JSObject *obj, } } + rc=JS_SUSPENDREQUEST(cx); p=sbbs->cmdstr(p,fpath,fspec,NULL); + JS_RESUMEREQUEST(cx, rc); if((js_str=JS_NewStringCopyZ(cx, p))==NULL) return(JS_FALSE); @@ -2261,11 +2517,14 @@ js_getfilespec(JSContext *cx, JSObject * char* p; char tmp[128]; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); p=sbbs->getfilespec(tmp); + JS_RESUMEREQUEST(cx, rc); if(p==NULL) *rval=JSVAL_NULL; @@ -2281,12 +2540,13 @@ js_getfilespec(JSContext *cx, JSObject * static JSBool js_listfiles(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - long mode=0; - char* fspec=ALLFILES; + int32 mode=0; + const char* fspec=ALLFILES; char buf[MAX_PATH+1]; uint dirnum; JSString* js_str; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2300,17 +2560,19 @@ js_listfiles(JSContext *cx, JSObject *ob for(uintN i=1;ilistfiles(dirnum,fspec,0 /* tofile */,mode)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2318,12 +2580,13 @@ js_listfiles(JSContext *cx, JSObject *ob static JSBool js_listfileinfo(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - long mode=FI_INFO; - char* fspec=ALLFILES; + int32 mode=FI_INFO; + const char* fspec=ALLFILES; char buf[MAX_PATH+1]; uint dirnum; JSString* js_str; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2337,27 +2600,30 @@ js_listfileinfo(JSContext *cx, JSObject for(uintN i=1;ilistfileinfo(dirnum,padfname(fspec,buf),mode)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } static JSBool js_postmsg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - long mode=0; + int32 mode=0; uint subnum; uintN n; JSObject* hdrobj; sbbs_t* sbbs; smbmsg_t* remsg=NULL; smbmsg_t msg; + jsrefcount rc; *rval = JSVAL_FALSE; @@ -2373,7 +2639,7 @@ js_postmsg(JSContext *cx, JSObject *obj, for(n=1; npostmsg(subnum,remsg,mode)); smb_freemsgmem(&msg); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2392,16 +2660,19 @@ js_postmsg(JSContext *cx, JSObject *obj, static JSBool js_msgscan_cfg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - long mode=SUB_CFG_NSCAN; + int32 mode=SUB_CFG_NSCAN; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); if(argc && JSVAL_IS_NUM(argv[0])) - JS_ValueToInt32(cx,argv[0],(int32*)&mode); + JS_ValueToInt32(cx,argv[0],&mode); + rc=JS_SUSPENDREQUEST(cx); sbbs->new_scan_cfg(mode); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2411,11 +2682,14 @@ static JSBool js_msgscan_ptrs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); sbbs->new_scan_ptr_cfg(); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2424,15 +2698,18 @@ static JSBool js_msgscan_reinit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); for(uint i=0;icfg.total_subs;i++) { sbbs->subscan[i].ptr=sbbs->subscan[i].sav_ptr; sbbs->subscan[i].last=sbbs->subscan[i].sav_last; } sbbs->bputs(sbbs->text[MsgPtrsInitialized]); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2440,24 +2717,27 @@ js_msgscan_reinit(JSContext *cx, JSObjec static JSBool js_scansubs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - long mode=SCAN_NEW; + int32 mode=SCAN_NEW; BOOL all=FALSE; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); for(uintN i=0;iscanallsubs(mode); else sbbs->scansubs(mode); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2465,24 +2745,27 @@ js_scansubs(JSContext *cx, JSObject *obj static JSBool js_scandirs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - long mode=0; + int32 mode=0; BOOL all=FALSE; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); for(uintN i=0;iscanalldirs(mode); else sbbs->scandirs(mode); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2490,10 +2773,11 @@ js_scandirs(JSContext *cx, JSObject *obj static JSBool js_scanposts(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - char* find=""; - long mode=0; + const char* find=""; + int32 mode=0; uint subnum; sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2507,7 +2791,7 @@ js_scanposts(JSContext *cx, JSObject *ob for(uintN i=1;iscanposts(subnum,mode,find)==0); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } static JSBool js_listmsgs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - char* find=""; - long mode=0; - long start=0; + const char* find=""; + int32 mode=0; + int32 start=0; uint subnum; sbbs_t* sbbs; uintN argn=0; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); @@ -2540,13 +2827,15 @@ js_listmsgs(JSContext *cx, JSObject *obj return(JS_TRUE); if(JSVAL_IS_NUM(argv[argn])) - JS_ValueToInt32(cx,argv[argn++],(int32*)&mode); + JS_ValueToInt32(cx,argv[argn++],&mode); if(JSVAL_IS_NUM(argv[argn])) - JS_ValueToInt32(cx,argv[argn++],(int32*)&start); + JS_ValueToInt32(cx,argv[argn++],&start); if(JSVAL_IS_STRING(argv[argn])) find=JS_GetStringBytes(JS_ValueToString(cx,argv[argn++])); + rc=JS_SUSPENDREQUEST(cx); *rval = INT_TO_JSVAL(sbbs->listsub(subnum,mode,start,find)); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2555,6 +2844,7 @@ js_getnstime(JSContext *cx, JSObject *ob { time_t t=time(NULL); sbbs_t* sbbs; + jsrefcount rc; *rval = JSVAL_NULL; @@ -2564,8 +2854,13 @@ js_getnstime(JSContext *cx, JSObject *ob if(argc && JSVAL_IS_NUM(argv[0])) JS_ValueToInt32(cx,argv[0],(int32*)&t); - if(sbbs->inputnstime(&t)==true) + rc=JS_SUSPENDREQUEST(cx); + if(sbbs->inputnstime(&t)==true) { + JS_RESUMEREQUEST(cx, rc); JS_NewNumberValue(cx,t,rval); + } + else + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2574,11 +2869,14 @@ static JSBool js_select_shell(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->select_shell()); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } @@ -2586,14 +2884,58 @@ static JSBool js_select_editor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { sbbs_t* sbbs; + jsrefcount rc; if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) return(JS_FALSE); + rc=JS_SUSPENDREQUEST(cx); *rval = BOOLEAN_TO_JSVAL(sbbs->select_editor()); + JS_RESUMEREQUEST(cx, rc); + return(JS_TRUE); +} + +static JSBool +js_get_time_left(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + sbbs_t* sbbs; + jsrefcount rc; + + if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) + return(JS_FALSE); + + rc=JS_SUSPENDREQUEST(cx); + *rval = INT_TO_JSVAL(sbbs->gettimeleft()); + JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } +static JSBool +js_chk_ar(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + uchar* ar; + JSString* js_str; + sbbs_t* sbbs; + jsrefcount rc; + + if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) + return JS_FALSE; + + if((js_str=JS_ValueToString(cx, argv[0]))==NULL) + return JS_FALSE; + + rc=JS_SUSPENDREQUEST(cx); + ar = arstr(NULL,JS_GetStringBytes(js_str),&sbbs->cfg); + + *rval = BOOLEAN_TO_JSVAL(sbbs->chk_ar(ar,&sbbs->useron,&sbbs->client)); + + if(ar!=NULL && ar!=nular) + free(ar); + JS_RESUMEREQUEST(cx, rc); + + return JS_TRUE; +} + static jsSyncMethodSpec js_bbs_functions[] = { {"atcode", js_atcode, 1, JSTYPE_STRING, JSDOCSTR("code_string") ,JSDOCSTR("returns @-code value, specified code string does not include @ character delimiters") @@ -2630,9 +2972,9 @@ static jsSyncMethodSpec js_bbs_functions ,JSDOCSTR("interactive logon procedure") ,310 }, - {"logoff", js_logoff, 0, JSTYPE_VOID, JSDOCSTR("") - ,JSDOCSTR("interactive logoff procedure") - ,310 + {"logoff", js_logoff, 1, JSTYPE_VOID, JSDOCSTR("[prompt=true]") + ,JSDOCSTR("interactive logoff procedure, pass false for prompt argument to avoid yes/no prompt") + ,315 }, {"logout", js_logout, 0, JSTYPE_VOID, JSDOCSTR("") ,JSDOCSTR("non-interactive logout procedure") @@ -2951,9 +3293,32 @@ static jsSyncMethodSpec js_bbs_functions ,JSDOCSTR("prompt user to select a new external message editor") ,310 }, + {"get_time_left", js_get_time_left, 0, JSTYPE_NUMBER, JSDOCSTR("") + ,JSDOCSTR("check the user's available remaining time online and return the value, in seconds
" + "This method will inform (and disconnect) the user when they are out of time") + ,31401 + }, + {"compare_ars", js_chk_ar, 1, JSTYPE_BOOLEAN, JSDOCSTR("string ars") + ,JSDOCSTR("verify the current user online meets the specified Access Requirements String") + ,315 + }, {0} }; +static JSBool js_bbs_resolve(JSContext *cx, JSObject *obj, jsval id) +{ + char* name=NULL; + + if(id != JSVAL_NULL) + name=JS_GetStringBytes(JSVAL_TO_STRING(id)); + + return(js_SyncResolve(cx, obj, name, js_bbs_properties, js_bbs_functions, NULL, 0)); +} + +static JSBool js_bbs_enumerate(JSContext *cx, JSObject *obj) +{ + return(js_bbs_resolve(cx, obj, JSVAL_NULL)); +} static JSClass js_bbs_class = { "BBS" /* name */ @@ -2962,8 +3327,8 @@ static JSClass js_bbs_class = { ,JS_PropertyStub /* delProperty */ ,js_bbs_get /* getProperty */ ,js_bbs_set /* setProperty */ - ,JS_EnumerateStub /* enumerate */ - ,JS_ResolveStub /* resolve */ + ,js_bbs_enumerate /* enumerate */ + ,js_bbs_resolve /* resolve */ ,JS_ConvertStub /* convert */ ,JS_FinalizeStub /* finalize */ }; @@ -2979,18 +3344,12 @@ JSObject* js_CreateBbsObject(JSContext* if(obj==NULL) return(NULL); - if(!js_DefineSyncProperties(cx, obj, js_bbs_properties)) - return(NULL); - - if (!js_DefineSyncMethods(cx, obj, js_bbs_functions, FALSE)) - return(NULL); - if((mods=JS_DefineObject(cx, obj, "mods", NULL, NULL ,JSPROP_ENUMERATE))==NULL) return(NULL); #ifdef BUILD_JSDOCS js_DescribeSyncObject(cx,mods,"Global repository for 3rd party modifications",312); - js_DescribeSyncObject(cx,obj,"Controls the Telnet/RLogin BBS experience",310); + js_DescribeSyncObject(cx,obj,"Controls the Telnet/SSH/RLogin BBS experience",310); js_CreateArrayOfStrings(cx, obj, "_property_desc_list", bbs_prop_desc, JSPROP_READONLY); #endif