Annotation of sbbs/sbbs3/js_bbs.cpp, revision 1.1

1.1     ! root        1: /* js_bbs.cpp */
        !             2: 
        !             3: /* Synchronet JavaScript "bbs" Object */
        !             4: 
        !             5: /* $Id: js_bbs.cpp,v 1.69 2004/12/31 02:39:19 rswindell Exp $ */
        !             6: 
        !             7: /****************************************************************************
        !             8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
        !             9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
        !            10:  *                                                                                                                                                     *
        !            11:  * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html         *
        !            12:  *                                                                                                                                                     *
        !            13:  * This program is free software; you can redistribute it and/or                       *
        !            14:  * modify it under the terms of the GNU General Public License                         *
        !            15:  * as published by the Free Software Foundation; either version 2                      *
        !            16:  * of the License, or (at your option) any later version.                                      *
        !            17:  * See the GNU General Public License for more details: gpl.txt or                     *
        !            18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
        !            19:  *                                                                                                                                                     *
        !            20:  * Anonymous FTP access to the most recent released source is available at     *
        !            21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
        !            22:  *                                                                                                                                                     *
        !            23:  * Anonymous CVS access to the development source and modification history     *
        !            24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
        !            25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
        !            26:  *     (just hit return, no password is necessary)                                                     *
        !            27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
        !            28:  *                                                                                                                                                     *
        !            29:  * For Synchronet coding style and modification guidelines, see                                *
        !            30:  * http://www.synchro.net/source.html                                                                          *
        !            31:  *                                                                                                                                                     *
        !            32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
        !            33:  * format) via e-mail to [email protected]                                                                      *
        !            34:  *                                                                                                                                                     *
        !            35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
        !            36:  ****************************************************************************/
        !            37: 
        !            38: #include "sbbs.h"
        !            39: 
        !            40: #ifdef JAVASCRIPT
        !            41: 
        !            42: /*****************************/
        !            43: /* BBS Object Properites */
        !            44: /*****************************/
        !            45: enum {
        !            46:         BBS_PROP_SYS_STATUS
        !            47:        ,BBS_PROP_STARTUP_OPT
        !            48:        ,BBS_PROP_ANSWER_TIME
        !            49:        ,BBS_PROP_LOGON_TIME
        !            50:        ,BBS_PROP_NS_TIME
        !            51:        ,BBS_PROP_LAST_NS_TIME
        !            52:        ,BBS_PROP_ONLINE
        !            53:        ,BBS_PROP_TIMELEFT
        !            54:        ,BBS_PROP_EVENT_TIME
        !            55:        ,BBS_PROP_EVENT_CODE
        !            56: 
        !            57:        ,BBS_PROP_NODE_NUM
        !            58:        ,BBS_PROP_NODE_MISC
        !            59:        ,BBS_PROP_NODE_ACTION
        !            60:        ,BBS_PROP_NODE_VAL_USER
        !            61: 
        !            62:        ,BBS_PROP_LOGON_ULB
        !            63:        ,BBS_PROP_LOGON_DLB
        !            64:        ,BBS_PROP_LOGON_ULS
        !            65:        ,BBS_PROP_LOGON_DLS
        !            66:        ,BBS_PROP_LOGON_POSTS
        !            67:        ,BBS_PROP_LOGON_EMAILS
        !            68:        ,BBS_PROP_LOGON_FBACKS
        !            69:        ,BBS_PROP_POSTS_READ
        !            70: 
        !            71:        ,BBS_PROP_MENU_DIR
        !            72:        ,BBS_PROP_MENU_FILE
        !            73:        ,BBS_PROP_MAIN_CMDS
        !            74:        ,BBS_PROP_FILE_CMDS
        !            75: 
        !            76:        ,BBS_PROP_CURGRP
        !            77:        ,BBS_PROP_CURSUB
        !            78:        ,BBS_PROP_CURLIB
        !            79:        ,BBS_PROP_CURDIR
        !            80: 
        !            81:        ,BBS_PROP_CONNECTION            /* READ ONLY */
        !            82:        ,BBS_PROP_RLOGIN_NAME
        !            83:        ,BBS_PROP_CLIENT_NAME
        !            84: 
        !            85:        ,BBS_PROP_ALTUL
        !            86: 
        !            87:        ,BBS_PROP_ERRORLEVEL            /* READ ONLY */
        !            88: 
        !            89:        /* READ ONLY */
        !            90:        ,BBS_PROP_SMB_GROUP             
        !            91:        ,BBS_PROP_SMB_GROUP_DESC
        !            92:        ,BBS_PROP_SMB_GROUP_NUM
        !            93:        ,BBS_PROP_SMB_SUB
        !            94:        ,BBS_PROP_SMB_SUB_DESC
        !            95:        ,BBS_PROP_SMB_SUB_CODE
        !            96:        ,BBS_PROP_SMB_SUB_NUM
        !            97:        ,BBS_PROP_SMB_ATTR
        !            98:        ,BBS_PROP_SMB_LAST_MSG
        !            99:        ,BBS_PROP_SMB_TOTAL_MSGS
        !           100:        ,BBS_PROP_SMB_MSGS
        !           101:        ,BBS_PROP_SMB_CURMSG
        !           102: 
        !           103:        /* READ ONLY */
        !           104:        ,BBS_PROP_MSG_TO
        !           105:        ,BBS_PROP_MSG_TO_EXT
        !           106:        ,BBS_PROP_MSG_TO_NET
        !           107:        ,BBS_PROP_MSG_TO_AGENT
        !           108:        ,BBS_PROP_MSG_FROM
        !           109:        ,BBS_PROP_MSG_FROM_EXT
        !           110:        ,BBS_PROP_MSG_FROM_NET
        !           111:        ,BBS_PROP_MSG_FROM_AGENT
        !           112:        ,BBS_PROP_MSG_REPLYTO
        !           113:        ,BBS_PROP_MSG_REPLYTO_EXT
        !           114:        ,BBS_PROP_MSG_REPLYTO_NET
        !           115:        ,BBS_PROP_MSG_REPLYTO_AGENT
        !           116:        ,BBS_PROP_MSG_SUBJECT
        !           117:        ,BBS_PROP_MSG_DATE
        !           118:        ,BBS_PROP_MSG_TIMEZONE
        !           119:        ,BBS_PROP_MSG_DATE_IMPORTED
        !           120:        ,BBS_PROP_MSG_ATTR
        !           121:        ,BBS_PROP_MSG_AUXATTR
        !           122:        ,BBS_PROP_MSG_NETATTR
        !           123:        ,BBS_PROP_MSG_OFFSET
        !           124:        ,BBS_PROP_MSG_NUMBER
        !           125:        ,BBS_PROP_MSG_EXPIRATION
        !           126:        ,BBS_PROP_MSG_FORWARDED
        !           127:        ,BBS_PROP_MSG_THREAD_BACK
        !           128:        ,BBS_PROP_MSG_THREAD_NEXT
        !           129:        ,BBS_PROP_MSG_THREAD_FIRST
        !           130:        ,BBS_PROP_MSG_ID
        !           131:        ,BBS_PROP_MSG_REPLY_ID
        !           132:        ,BBS_PROP_MSG_DELIVERY_ATTEMPTS
        !           133: 
        !           134:        /* READ ONLY */
        !           135:        ,BBS_PROP_BATCH_UPLOAD_TOTAL
        !           136:        ,BBS_PROP_BATCH_DNLOAD_TOTAL
        !           137: 
        !           138: };
        !           139: 
        !           140: #ifdef _DEBUG
        !           141:        static char* bbs_prop_desc[] = {
        !           142:         "system status bitfield (see <tt>SS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
        !           143:        ,"startup options bitfield (see <tt>BBS_OPT_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
        !           144:        ,"answer time, in time_t format"
        !           145:        ,"logon time, in time_t format"
        !           146:        ,"file newscan time, in time_t format"
        !           147:        ,"previous newscan time, in time_t format"
        !           148:        ,"online (see <tt>ON_*</tt> in <tt>sbbsdefs.js</tt> for valid values)"
        !           149:        ,"time left (in seconds)"
        !           150:        ,"time of next exclusive event (in time_t format), or 0 if none"
        !           151:        ,"internal code of next exclusive event"
        !           152: 
        !           153:        ,"current node number"
        !           154:        ,"current node settings bitfield (see <tt>NM_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
        !           155:        ,"current node action (see <tt>nodedefs.js</tt> for valid values)"
        !           156:        ,"validation feedback user for this node (or 0 for no validation feedback required)"
        !           157: 
        !           158:        ,"bytes uploaded during this session"
        !           159:        ,"bytes downloaded during this session"
        !           160:        ,"files uploaded during this session"
        !           161:        ,"files downloaded during this session"
        !           162:        ,"messages posted during this session"
        !           163:        ,"e-mails sent during this session"
        !           164:        ,"feedback messages sent during this session"
        !           165:        ,"messages read during this session"
        !           166: 
        !           167:        ,"menu subdirectory (overrides default)"
        !           168:        ,"menu file (overrides default)"
        !           169:        ,"total main menu commands received from user during this session"
        !           170:        ,"total file menu commands received from user during this session"
        !           171: 
        !           172:        ,"current message group"
        !           173:        ,"current message sub-board"
        !           174:        ,"current file library"
        !           175:        ,"current file directory"
        !           176: 
        !           177:        ,"remote connection type"
        !           178:        ,"rlogin name"
        !           179:        ,"client name"
        !           180: 
        !           181:        ,"current alternate upload path number"
        !           182: 
        !           183:        ,"error level returned from last executed external program"
        !           184: 
        !           185:        /* READ ONLY */
        !           186:        ,"message group name of message being read"
        !           187:        ,"message group description of message being read"
        !           188:        ,"message group number of message being read"
        !           189:        ,"sub-board name of message being read"
        !           190:        ,"sub-board description of message being read"
        !           191:        ,"sub-board internal code of message being read"
        !           192:        ,"sub-board number of message being read"
        !           193:        ,"message base attributes"
        !           194:        ,"highest message number in message base"
        !           195:        ,"total number of messages in message base"
        !           196:        ,"number of messages loaded from message base"
        !           197:        ,"current message number in message base"
        !           198: 
        !           199:        /* READ ONLY */
        !           200:        ,"message recipient name"
        !           201:        ,"message recipient extension"
        !           202:        ,"message recipient network type"
        !           203:        ,"message recipient agent type"
        !           204:        ,"message sender name"
        !           205:        ,"message sender extension"
        !           206:        ,"message sender network type"
        !           207:        ,"message sender agent type"
        !           208:        ,"message reply-to name"
        !           209:        ,"message reply-to extension"
        !           210:        ,"message reply-to network type"
        !           211:        ,"message reply-to agent type"
        !           212:        ,"message subject"
        !           213:        ,"message date/time"
        !           214:        ,"message time zone"
        !           215:        ,"message date/time imported"
        !           216:        ,"message attributes"
        !           217:        ,"message auxillary attributes"
        !           218:        ,"message network attributes"
        !           219:        ,"message header offset"
        !           220:        ,"message number"
        !           221:        ,"message expiration"
        !           222:        ,"message forwarded"
        !           223:        ,"message thread, back message number (AKA msg_thread_orig)"
        !           224:        ,"message thread, next message number"
        !           225:        ,"message thread, first reply to this message"
        !           226:        ,"message identifier"
        !           227:        ,"message replied-to identifier"
        !           228:        ,"message delivery attempt counter"
        !           229: 
        !           230:        ,"number of files in batch upload queue"
        !           231:        ,"number of files in batch download queue"
        !           232: 
        !           233:        ,NULL
        !           234:        };
        !           235: #endif
        !           236: 
        !           237: static JSBool js_bbs_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
        !           238: {
        !           239:        char*           p=NULL;
        !           240:        char*           nulstr="";
        !           241:        ulong           val=0;
        !           242:     jsint       tiny;
        !           243:        sbbs_t*         sbbs;
        !           244: 
        !           245:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !           246:                return(JS_FALSE);
        !           247: 
        !           248:     tiny = JSVAL_TO_INT(id);
        !           249: 
        !           250:        switch(tiny) {
        !           251:                case BBS_PROP_SYS_STATUS:
        !           252:                        val=sbbs->sys_status;
        !           253:                        break;
        !           254:                case BBS_PROP_STARTUP_OPT:
        !           255:                        val=sbbs->startup->options;
        !           256:                        break;
        !           257:                case BBS_PROP_ANSWER_TIME:
        !           258:                        val=sbbs->answertime;
        !           259:                        break;
        !           260:                case BBS_PROP_LOGON_TIME:
        !           261:                        val=sbbs->logontime;
        !           262:                        break;
        !           263:                case BBS_PROP_NS_TIME:
        !           264:                        val=sbbs->ns_time;
        !           265:                        break;
        !           266:                case BBS_PROP_LAST_NS_TIME:
        !           267:                        val=sbbs->last_ns_time;
        !           268:                        break;
        !           269:                case BBS_PROP_ONLINE:
        !           270:                        val=sbbs->online;
        !           271:                        break;
        !           272:                case BBS_PROP_TIMELEFT:
        !           273:                        val=sbbs->timeleft;
        !           274:                        break;
        !           275:                case BBS_PROP_EVENT_TIME:
        !           276:                        val=sbbs->event_time;
        !           277:                        break;
        !           278:                case BBS_PROP_EVENT_CODE:
        !           279:                        p=sbbs->event_code;
        !           280:                        break;
        !           281: 
        !           282:                case BBS_PROP_NODE_NUM:
        !           283:                        val=sbbs->cfg.node_num;
        !           284:                        break;
        !           285:                case BBS_PROP_NODE_MISC:
        !           286:                        val=sbbs->cfg.node_misc;
        !           287:                        break;
        !           288:                case BBS_PROP_NODE_ACTION:
        !           289:                        val=sbbs->action;
        !           290:                        break;
        !           291:                case BBS_PROP_NODE_VAL_USER:
        !           292:                        val=sbbs->cfg.node_valuser;
        !           293:                        break;
        !           294: 
        !           295:                case BBS_PROP_LOGON_ULB:
        !           296:                        val=sbbs->logon_ulb;
        !           297:                        break;
        !           298:                case BBS_PROP_LOGON_DLB:
        !           299:                        val=sbbs->logon_dlb;
        !           300:                        break;
        !           301:                case BBS_PROP_LOGON_ULS:
        !           302:                        val=sbbs->logon_uls;
        !           303:                        break;
        !           304:                case BBS_PROP_LOGON_DLS:
        !           305:                        val=sbbs->logon_dls;
        !           306:                        break;
        !           307:                case BBS_PROP_LOGON_POSTS:
        !           308:                        val=sbbs->logon_posts;
        !           309:                        break;
        !           310:                case BBS_PROP_LOGON_EMAILS:
        !           311:                        val=sbbs->logon_emails;
        !           312:                        break;
        !           313:                case BBS_PROP_LOGON_FBACKS:
        !           314:                        val=sbbs->logon_fbacks;
        !           315:                        break;
        !           316:                case BBS_PROP_POSTS_READ:
        !           317:                        val=sbbs->posts_read;
        !           318:                        break;
        !           319: 
        !           320:                case BBS_PROP_MENU_DIR:
        !           321:                        p=sbbs->menu_dir;
        !           322:                        break;
        !           323:                case BBS_PROP_MENU_FILE:
        !           324:                        p=sbbs->menu_file;
        !           325:                        break;
        !           326:                case BBS_PROP_MAIN_CMDS:
        !           327:                        val=sbbs->main_cmds;
        !           328:                        break;
        !           329:                case BBS_PROP_FILE_CMDS:
        !           330:                        val=sbbs->xfer_cmds;
        !           331:                        break;
        !           332: 
        !           333:                case BBS_PROP_CURGRP:
        !           334:                        val=sbbs->curgrp;
        !           335:                        break;
        !           336:                case BBS_PROP_CURSUB:
        !           337:                        if(sbbs->curgrp<sbbs->usrgrps)
        !           338:                                val=sbbs->cursub[sbbs->curgrp];
        !           339:                        break;
        !           340:                case BBS_PROP_CURLIB:
        !           341:                        val=sbbs->curlib;
        !           342:                        break;
        !           343:                case BBS_PROP_CURDIR:
        !           344:                        if(sbbs->curlib<sbbs->usrlibs)
        !           345:                                val=sbbs->curdir[sbbs->curlib];
        !           346:                        break;
        !           347: 
        !           348:                case BBS_PROP_CONNECTION:
        !           349:                        p=sbbs->connection;
        !           350:                        break;
        !           351:                case BBS_PROP_RLOGIN_NAME:
        !           352:                        p=sbbs->rlogin_name;
        !           353:                        break;
        !           354:                case BBS_PROP_CLIENT_NAME:
        !           355:                        p=sbbs->client_name;
        !           356:                        break;
        !           357: 
        !           358:                case BBS_PROP_ALTUL:
        !           359:                        val=sbbs->altul;
        !           360:                        break;
        !           361: 
        !           362:                case BBS_PROP_ERRORLEVEL:
        !           363:                        val=sbbs->errorlevel;
        !           364:                        break;
        !           365: 
        !           366:                /* Currently Open Message Base (sbbs.smb) */
        !           367:                case BBS_PROP_SMB_GROUP:
        !           368:                        if(sbbs->smb.subnum==INVALID_SUB || sbbs->smb.subnum>=sbbs->cfg.total_subs)
        !           369:                                p=nulstr;
        !           370:                        else
        !           371:                                p=sbbs->cfg.grp[sbbs->cfg.sub[sbbs->smb.subnum]->grp]->sname;
        !           372:                        break;
        !           373:                case BBS_PROP_SMB_GROUP_DESC:
        !           374:                        if(sbbs->smb.subnum==INVALID_SUB || sbbs->smb.subnum>=sbbs->cfg.total_subs)
        !           375:                                p=nulstr;
        !           376:                        else
        !           377:                                p=sbbs->cfg.grp[sbbs->cfg.sub[sbbs->smb.subnum]->grp]->lname;
        !           378:                        break;
        !           379:                case BBS_PROP_SMB_GROUP_NUM:
        !           380:                        if(sbbs->smb.subnum!=INVALID_SUB && sbbs->smb.subnum<sbbs->cfg.total_subs) {
        !           381:                                uint ugrp;
        !           382:                                for(ugrp=0;ugrp<sbbs->usrgrps;ugrp++)
        !           383:                                        if(sbbs->usrgrp[ugrp]==sbbs->cfg.sub[sbbs->smb.subnum]->grp)
        !           384:                                                break;
        !           385:                                val=ugrp+1;
        !           386:                        }
        !           387:                        break;
        !           388:                case BBS_PROP_SMB_SUB:
        !           389:                        if(sbbs->smb.subnum==INVALID_SUB || sbbs->smb.subnum>=sbbs->cfg.total_subs)
        !           390:                                p=nulstr;
        !           391:                        else
        !           392:                                p=sbbs->cfg.sub[sbbs->smb.subnum]->sname;
        !           393:                        break;
        !           394:                case BBS_PROP_SMB_SUB_DESC:
        !           395:                        if(sbbs->smb.subnum==INVALID_SUB || sbbs->smb.subnum>=sbbs->cfg.total_subs)
        !           396:                                p=nulstr;
        !           397:                        else
        !           398:                                p=sbbs->cfg.sub[sbbs->smb.subnum]->lname;
        !           399:                        break;
        !           400:                case BBS_PROP_SMB_SUB_CODE:
        !           401:                        if(sbbs->smb.subnum==INVALID_SUB || sbbs->smb.subnum>=sbbs->cfg.total_subs)
        !           402:                                p=nulstr;
        !           403:                        else
        !           404:                                p=sbbs->cfg.sub[sbbs->smb.subnum]->code;
        !           405:                        break;
        !           406:                case BBS_PROP_SMB_SUB_NUM:
        !           407:                        if(sbbs->smb.subnum!=INVALID_SUB && sbbs->smb.subnum<sbbs->cfg.total_subs) {
        !           408:                                uint ugrp;
        !           409:                                for(ugrp=0;ugrp<sbbs->usrgrps;ugrp++)
        !           410:                                        if(sbbs->usrgrp[ugrp]==sbbs->cfg.sub[sbbs->smb.subnum]->grp)
        !           411:                                                break;
        !           412:                                uint usub;
        !           413:                                for(usub=0;usub<sbbs->usrsubs[ugrp];usub++)
        !           414:                                        if(sbbs->usrsub[ugrp][usub]==sbbs->smb.subnum)
        !           415:                                                break;
        !           416:                                val=usub+1;
        !           417:                        }
        !           418:                        break;
        !           419:                case BBS_PROP_SMB_ATTR:
        !           420:                        val=sbbs->smb.status.attr;
        !           421:                        break;
        !           422:                case BBS_PROP_SMB_LAST_MSG:
        !           423:                        val=sbbs->smb.status.last_msg;
        !           424:                        break;
        !           425:                case BBS_PROP_SMB_TOTAL_MSGS:
        !           426:                        val=sbbs->smb.status.total_msgs;
        !           427:                        break;
        !           428:                case BBS_PROP_SMB_MSGS:
        !           429:                        val=sbbs->smb.msgs;
        !           430:                        break;
        !           431:                case BBS_PROP_SMB_CURMSG:
        !           432:                        val=sbbs->smb.curmsg;
        !           433:                        break;
        !           434: 
        !           435:                /* Currently Displayed Message Header (sbbs.current_msg) */
        !           436:                case BBS_PROP_MSG_TO:
        !           437:                        if(sbbs->current_msg==NULL || sbbs->current_msg->to==NULL)
        !           438:                                p=nulstr;
        !           439:                        else
        !           440:                                p=sbbs->current_msg->to;
        !           441:                        break;
        !           442:                case BBS_PROP_MSG_TO_EXT:
        !           443:                        if(sbbs->current_msg==NULL || sbbs->current_msg->to_ext==NULL)
        !           444:                                p=nulstr;
        !           445:                        else
        !           446:                                p=sbbs->current_msg->to_ext;
        !           447:                        break;
        !           448:                case BBS_PROP_MSG_TO_NET:
        !           449:                        if(sbbs->current_msg==NULL || sbbs->current_msg->to_net.type==NET_NONE)
        !           450:                                p=nulstr;
        !           451:                        else
        !           452:                                p=smb_netaddr(&sbbs->current_msg->to_net);
        !           453:                        break;
        !           454:                case BBS_PROP_MSG_TO_AGENT:
        !           455:                        if(sbbs->current_msg!=NULL)
        !           456:                                val=sbbs->current_msg->to_agent;
        !           457:                        break;
        !           458:                case BBS_PROP_MSG_FROM:
        !           459:                        if(sbbs->current_msg==NULL || sbbs->current_msg->from==NULL)
        !           460:                                p=nulstr;
        !           461:                        else
        !           462:                                p=sbbs->current_msg->from;
        !           463:                        break;
        !           464:                case BBS_PROP_MSG_FROM_EXT:
        !           465:                        if(sbbs->current_msg==NULL || sbbs->current_msg->from_ext==NULL)
        !           466:                                p=nulstr;
        !           467:                        else
        !           468:                                p=sbbs->current_msg->from_ext;
        !           469:                        break;
        !           470:                case BBS_PROP_MSG_FROM_NET:
        !           471:                        if(sbbs->current_msg==NULL || sbbs->current_msg->from_net.type==NET_NONE)
        !           472:                                p=nulstr;
        !           473:                        else
        !           474:                                p=smb_netaddr(&sbbs->current_msg->from_net);
        !           475:                        break;
        !           476:                case BBS_PROP_MSG_FROM_AGENT:
        !           477:                        if(sbbs->current_msg!=NULL)
        !           478:                                val=sbbs->current_msg->from_agent;
        !           479:                        break;
        !           480:                case BBS_PROP_MSG_REPLYTO:
        !           481:                        if(sbbs->current_msg==NULL || sbbs->current_msg->replyto==NULL)
        !           482:                                p=nulstr;
        !           483:                        else
        !           484:                                p=sbbs->current_msg->replyto;
        !           485:                        break;
        !           486:                case BBS_PROP_MSG_REPLYTO_EXT:
        !           487:                        if(sbbs->current_msg==NULL || sbbs->current_msg->replyto_ext==NULL)
        !           488:                                p=nulstr;
        !           489:                        else
        !           490:                                p=sbbs->current_msg->replyto_ext;
        !           491:                        break;
        !           492:                case BBS_PROP_MSG_REPLYTO_NET:
        !           493:                        if(sbbs->current_msg==NULL || sbbs->current_msg->replyto_net.type==NET_NONE)
        !           494:                                p=nulstr;
        !           495:                        else
        !           496:                                p=smb_netaddr(&sbbs->current_msg->replyto_net);
        !           497:                        break;
        !           498:                case BBS_PROP_MSG_REPLYTO_AGENT:
        !           499:                        if(sbbs->current_msg!=NULL)
        !           500:                                val=sbbs->current_msg->replyto_agent;
        !           501:                        break;
        !           502: 
        !           503:                case BBS_PROP_MSG_SUBJECT:
        !           504:                        if(sbbs->current_msg==NULL || sbbs->current_msg->subj==NULL)
        !           505:                                p=nulstr;
        !           506:                        else
        !           507:                                p=sbbs->current_msg->subj;
        !           508:                        break;
        !           509:                case BBS_PROP_MSG_DATE:
        !           510:                        if(sbbs->current_msg!=NULL)
        !           511:                                val=sbbs->current_msg->hdr.when_written.time;
        !           512:                        break;
        !           513:                case BBS_PROP_MSG_TIMEZONE:
        !           514:                        if(sbbs->current_msg!=NULL)
        !           515:                                val=sbbs->current_msg->hdr.when_written.zone;
        !           516:                        break;
        !           517:                case BBS_PROP_MSG_DATE_IMPORTED:
        !           518:                        if(sbbs->current_msg!=NULL)
        !           519:                                val=sbbs->current_msg->hdr.when_imported.time;
        !           520:                        break;
        !           521:                case BBS_PROP_MSG_ATTR:
        !           522:                        if(sbbs->current_msg!=NULL)
        !           523:                                val=sbbs->current_msg->hdr.attr;
        !           524:                        break;
        !           525:                case BBS_PROP_MSG_AUXATTR:
        !           526:                        if(sbbs->current_msg!=NULL)
        !           527:                                val=sbbs->current_msg->hdr.auxattr;
        !           528:                        break;
        !           529:                case BBS_PROP_MSG_NETATTR:
        !           530:                        if(sbbs->current_msg!=NULL)
        !           531:                                val=sbbs->current_msg->hdr.netattr;
        !           532:                        break;
        !           533:                case BBS_PROP_MSG_OFFSET:
        !           534:                        if(sbbs->current_msg!=NULL)
        !           535:                                val=sbbs->current_msg->offset;
        !           536:                        break;
        !           537:                case BBS_PROP_MSG_NUMBER:
        !           538:                        if(sbbs->current_msg!=NULL)
        !           539:                                val=sbbs->current_msg->hdr.number;
        !           540:                        break;
        !           541:                case BBS_PROP_MSG_EXPIRATION:
        !           542:                        if(sbbs->current_msg!=NULL)
        !           543:                                val=sbbs->current_msg->expiration;
        !           544:                        break;
        !           545:                case BBS_PROP_MSG_FORWARDED:
        !           546:                        if(sbbs->current_msg!=NULL)
        !           547:                                val=sbbs->current_msg->forwarded;
        !           548:                        break;
        !           549:                case BBS_PROP_MSG_THREAD_BACK:
        !           550:                        if(sbbs->current_msg!=NULL)
        !           551:                                val=sbbs->current_msg->hdr.thread_back;
        !           552:                        break;
        !           553:                case BBS_PROP_MSG_THREAD_NEXT:
        !           554:                        if(sbbs->current_msg!=NULL)
        !           555:                                val=sbbs->current_msg->hdr.thread_next;
        !           556:                        break;
        !           557:                case BBS_PROP_MSG_THREAD_FIRST:
        !           558:                        if(sbbs->current_msg!=NULL)
        !           559:                                val=sbbs->current_msg->hdr.thread_first;
        !           560:                        break;
        !           561:                case BBS_PROP_MSG_DELIVERY_ATTEMPTS:
        !           562:                        if(sbbs->current_msg!=NULL)
        !           563:                                val=sbbs->current_msg->hdr.delivery_attempts;
        !           564:                        break;
        !           565:                case BBS_PROP_MSG_ID:
        !           566:                        if(sbbs->current_msg==NULL || sbbs->current_msg->id==NULL)
        !           567:                                p=nulstr;
        !           568:                        else
        !           569:                                p=sbbs->current_msg->id;
        !           570:                        break;
        !           571:                case BBS_PROP_MSG_REPLY_ID:
        !           572:                        if(sbbs->current_msg==NULL || sbbs->current_msg->reply_id==NULL)
        !           573:                                p=nulstr;
        !           574:                        else
        !           575:                                p=sbbs->current_msg->reply_id;
        !           576:                        break;
        !           577: 
        !           578:                case BBS_PROP_BATCH_UPLOAD_TOTAL:
        !           579:                        val=sbbs->batup_total;
        !           580:                        break;
        !           581:                case BBS_PROP_BATCH_DNLOAD_TOTAL:
        !           582:                        val=sbbs->batdn_total;
        !           583:                        break;
        !           584: 
        !           585:                default:
        !           586:                        return(JS_TRUE);
        !           587:        }
        !           588:        if(p!=NULL) {
        !           589:                JSString* js_str=JS_NewStringCopyZ(cx, p);
        !           590:                if(js_str==NULL)
        !           591:                        return(JS_FALSE);
        !           592:                *vp = STRING_TO_JSVAL(js_str);
        !           593:        } else
        !           594:                JS_NewNumberValue(cx,val,vp);
        !           595: 
        !           596:        return(JS_TRUE);
        !           597: }
        !           598: 
        !           599: static JSBool js_bbs_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
        !           600: {
        !           601:        char*           p=NULL;
        !           602:        int32           val=0;
        !           603:     jsint       tiny;
        !           604:        JSString*       js_str;
        !           605:        sbbs_t*         sbbs;
        !           606: 
        !           607:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !           608:                return(JS_FALSE);
        !           609: 
        !           610:     tiny = JSVAL_TO_INT(id);
        !           611: 
        !           612:        if(JSVAL_IS_NUMBER(*vp) || JSVAL_IS_BOOLEAN(*vp))
        !           613:                JS_ValueToInt32(cx, *vp, &val);
        !           614:        else if(JSVAL_IS_STRING(*vp)) {
        !           615:                if((js_str = JS_ValueToString(cx, *vp))==NULL)
        !           616:                        return(JS_FALSE);
        !           617:                p=JS_GetStringBytes(js_str);
        !           618:        }
        !           619: 
        !           620:        switch(tiny) {
        !           621:                case BBS_PROP_SYS_STATUS:
        !           622:                        sbbs->sys_status=val;
        !           623:                        break;
        !           624:                case BBS_PROP_STARTUP_OPT:
        !           625:                        sbbs->startup->options=val;
        !           626:                        break;
        !           627:                case BBS_PROP_ANSWER_TIME:
        !           628:                        sbbs->answertime=val;
        !           629:                        break;
        !           630:                case BBS_PROP_LOGON_TIME:
        !           631:                        sbbs->logontime=val;
        !           632:                        break;
        !           633:                case BBS_PROP_NS_TIME:
        !           634:                        sbbs->ns_time=val;
        !           635:                        break;
        !           636:                case BBS_PROP_LAST_NS_TIME:
        !           637:                        sbbs->last_ns_time=val;
        !           638:                        break;
        !           639:                case BBS_PROP_ONLINE:
        !           640:                        sbbs->online=val;
        !           641:                        break;
        !           642:                case BBS_PROP_NODE_MISC:
        !           643:                        sbbs->cfg.node_misc=val;
        !           644:                        break;
        !           645:                case BBS_PROP_NODE_ACTION:
        !           646:                        sbbs->action=(uchar)val;
        !           647:                        break;
        !           648:                case BBS_PROP_NODE_VAL_USER:
        !           649:                        sbbs->cfg.node_valuser=(ushort)val;
        !           650:                        break;
        !           651:                case BBS_PROP_LOGON_ULB:
        !           652:                        sbbs->logon_ulb=val;
        !           653:                        break;
        !           654:                case BBS_PROP_LOGON_DLB:
        !           655:                        sbbs->logon_dlb=val;
        !           656:                        break;
        !           657:                case BBS_PROP_LOGON_ULS:
        !           658:                        sbbs->logon_uls=val;
        !           659:                        break;
        !           660:                case BBS_PROP_LOGON_DLS:
        !           661:                        sbbs->logon_dls=val;
        !           662:                        break;
        !           663:                case BBS_PROP_LOGON_POSTS:
        !           664:                        sbbs->logon_posts=val;
        !           665:                        break;
        !           666:                case BBS_PROP_LOGON_EMAILS:
        !           667:                        sbbs->logon_emails=val;
        !           668:                        break;
        !           669:                case BBS_PROP_LOGON_FBACKS:
        !           670:                        sbbs->logon_fbacks=val;
        !           671:                        break;
        !           672:                case BBS_PROP_POSTS_READ:
        !           673:                        sbbs->posts_read=val;
        !           674:                        break;
        !           675:                case BBS_PROP_MENU_DIR:
        !           676:                        SAFECOPY(sbbs->menu_dir,p);
        !           677:                        break;
        !           678:                case BBS_PROP_MENU_FILE:
        !           679:                        SAFECOPY(sbbs->menu_file,p);
        !           680:                        break;
        !           681:                case BBS_PROP_MAIN_CMDS:
        !           682:                        sbbs->main_cmds=val;
        !           683:                        break;
        !           684:                case BBS_PROP_FILE_CMDS:
        !           685:                        sbbs->xfer_cmds=val;
        !           686:                        break;
        !           687: 
        !           688:                case BBS_PROP_CURGRP:
        !           689:                        if(p!=NULL) {   /* set by name */
        !           690:                                uint i;
        !           691:                                for(i=0;i<sbbs->usrgrps;i++)
        !           692:                                        if(!stricmp(sbbs->cfg.grp[sbbs->usrgrp[i]]->sname,p))
        !           693:                                                break;
        !           694:                                if(i<sbbs->usrgrps)
        !           695:                                        sbbs->curgrp=i;
        !           696:                                break;
        !           697:                        }
        !           698:                        if((uint)val<sbbs->cfg.total_grps && (uint)val<sbbs->usrgrps)
        !           699:                                sbbs->curgrp=val;
        !           700:                        break;
        !           701:                case BBS_PROP_CURSUB:
        !           702:                        if(p!=NULL) {   /* set by code */
        !           703:                                for(uint i=0;i<sbbs->usrgrps;i++)
        !           704:                                        for(uint j=0;j<sbbs->usrsubs[i];j++)
        !           705:                                                if(!stricmp(sbbs->cfg.sub[sbbs->usrsub[i][j]]->code,p)) {
        !           706:                                                        sbbs->curgrp=i;
        !           707:                                                        sbbs->cursub[i]=j;
        !           708:                                                        break; 
        !           709:                                                }
        !           710:                                break;
        !           711:                        }
        !           712:                        if(sbbs->curgrp<sbbs->cfg.total_grps && (uint)val<sbbs->usrsubs[sbbs->curgrp])
        !           713:                                sbbs->cursub[sbbs->curgrp]=val;
        !           714:                        break;
        !           715:                case BBS_PROP_CURLIB:
        !           716:                        if(p!=NULL) {   /* set by name */
        !           717:                                uint i;
        !           718:                                for(i=0;i<sbbs->usrlibs;i++)
        !           719:                                        if(!stricmp(sbbs->cfg.lib[sbbs->usrlib[i]]->sname,p))
        !           720:                                                break;
        !           721:                                if(i<sbbs->usrlibs)
        !           722:                                        sbbs->curlib=i;
        !           723:                                break;
        !           724:                        }
        !           725:                        if((uint)val<sbbs->cfg.total_libs && (uint)val<sbbs->usrlibs)
        !           726:                                sbbs->curlib=val;
        !           727:                        break;
        !           728:                case BBS_PROP_CURDIR:
        !           729:                        if(p!=NULL) {   /* set by code */
        !           730:                                for(uint i=0;i<sbbs->usrlibs;i++)
        !           731:                                        for(uint j=0;j<sbbs->usrdirs[i];j++)
        !           732:                                                if(!stricmp(sbbs->cfg.dir[sbbs->usrdir[i][j]]->code,p)) {
        !           733:                                                        sbbs->curlib=i;
        !           734:                                                        sbbs->curdir[i]=j;
        !           735:                                                        break; 
        !           736:                                                }
        !           737:                                break;
        !           738:                        }
        !           739:                        if(sbbs->curlib<sbbs->cfg.total_libs && (uint)val<sbbs->usrdirs[sbbs->curlib])
        !           740:                                sbbs->curdir[sbbs->curlib]=val;
        !           741:                        break;
        !           742: 
        !           743:                case BBS_PROP_RLOGIN_NAME:
        !           744:                        SAFECOPY(sbbs->rlogin_name,p);
        !           745:                        break;
        !           746:                case BBS_PROP_CLIENT_NAME:
        !           747:                        SAFECOPY(sbbs->client_name,p);
        !           748:                        break;
        !           749: 
        !           750:                case BBS_PROP_ALTUL:
        !           751:                        if(val<sbbs->cfg.altpaths)
        !           752:                                sbbs->altul=(ushort)val;
        !           753:                        break;
        !           754:                default:
        !           755:                        return(JS_TRUE);
        !           756:        }
        !           757: 
        !           758:        if(sbbs->usrgrps)
        !           759:                sbbs->cursubnum=sbbs->usrsub[sbbs->curgrp][sbbs->cursub[sbbs->curgrp]];         /* Used for ARS */
        !           760:        else
        !           761:                sbbs->cursubnum=INVALID_SUB;
        !           762:        if(sbbs->usrlibs) 
        !           763:                sbbs->curdirnum=sbbs->usrdir[sbbs->curlib][sbbs->curdir[sbbs->curlib]];         /* Used for ARS */
        !           764:        else 
        !           765:                sbbs->curdirnum=INVALID_DIR;
        !           766: 
        !           767:        return(JS_TRUE);
        !           768: }
        !           769: 
        !           770: #define PROP_READONLY JSPROP_ENUMERATE|JSPROP_READONLY
        !           771: 
        !           772: static jsSyncPropertySpec js_bbs_properties[] = {
        !           773: /*              name                           ,tinyid                                 ,flags                          ,ver    */
        !           774: 
        !           775:        {       "sys_status"            ,BBS_PROP_SYS_STATUS    ,JSPROP_ENUMERATE       ,310},
        !           776:        {       "startup_options"       ,BBS_PROP_STARTUP_OPT   ,JSPROP_ENUMERATE       ,310},
        !           777:        {       "answer_time"           ,BBS_PROP_ANSWER_TIME   ,JSPROP_ENUMERATE       ,310},
        !           778:        {       "logon_time"            ,BBS_PROP_LOGON_TIME    ,JSPROP_ENUMERATE       ,310},
        !           779:        {       "new_file_time"         ,BBS_PROP_NS_TIME               ,JSPROP_ENUMERATE       ,310},
        !           780:        {       "last_new_file_time",BBS_PROP_LAST_NS_TIME      ,JSPROP_ENUMERATE       ,310},
        !           781:        {       "online"                        ,BBS_PROP_ONLINE                ,JSPROP_ENUMERATE       ,310},
        !           782:        {       "timeleft"                      ,BBS_PROP_TIMELEFT              ,JSPROP_READONLY        ,310},  /* alias */
        !           783:        {       "time_left"                     ,BBS_PROP_TIMELEFT              ,PROP_READONLY          ,311},
        !           784:        {       "event_time"            ,BBS_PROP_EVENT_TIME    ,PROP_READONLY          ,311},
        !           785:        {       "event_code"            ,BBS_PROP_EVENT_CODE    ,PROP_READONLY          ,311},
        !           786:        {       "node_num"                      ,BBS_PROP_NODE_NUM              ,PROP_READONLY          ,310},
        !           787:        {       "node_settings"         ,BBS_PROP_NODE_MISC             ,JSPROP_ENUMERATE       ,310},
        !           788:        {       "node_action"           ,BBS_PROP_NODE_ACTION   ,JSPROP_ENUMERATE       ,310},
        !           789:        {       "node_val_user"         ,BBS_PROP_NODE_VAL_USER ,JSPROP_ENUMERATE       ,310},
        !           790:        {       "logon_ulb"                     ,BBS_PROP_LOGON_ULB             ,JSPROP_ENUMERATE       ,310},
        !           791:        {       "logon_dlb"                     ,BBS_PROP_LOGON_DLB             ,JSPROP_ENUMERATE       ,310},
        !           792:        {       "logon_uls"                     ,BBS_PROP_LOGON_ULS             ,JSPROP_ENUMERATE       ,310},
        !           793:        {       "logon_dls"                     ,BBS_PROP_LOGON_DLS             ,JSPROP_ENUMERATE       ,310},
        !           794:        {       "logon_posts"           ,BBS_PROP_LOGON_POSTS   ,JSPROP_ENUMERATE       ,310},
        !           795:        {       "logon_emails"          ,BBS_PROP_LOGON_EMAILS  ,JSPROP_ENUMERATE       ,310},
        !           796:        {       "logon_fbacks"          ,BBS_PROP_LOGON_FBACKS  ,JSPROP_ENUMERATE       ,310},
        !           797:        {       "posts_read"            ,BBS_PROP_POSTS_READ    ,JSPROP_ENUMERATE       ,310},
        !           798:        {       "menu_dir"                      ,BBS_PROP_MENU_DIR              ,JSPROP_ENUMERATE       ,310},
        !           799:        {       "menu_file"                     ,BBS_PROP_MENU_FILE             ,JSPROP_ENUMERATE       ,310},
        !           800:        {       "main_cmds"                     ,BBS_PROP_MAIN_CMDS             ,JSPROP_ENUMERATE       ,310},
        !           801:        {       "file_cmds"                     ,BBS_PROP_FILE_CMDS             ,JSPROP_ENUMERATE       ,310},
        !           802:        {       "curgrp"                        ,BBS_PROP_CURGRP                ,JSPROP_ENUMERATE       ,310},
        !           803:        {       "cursub"                        ,BBS_PROP_CURSUB                ,JSPROP_ENUMERATE       ,310},
        !           804:        {       "curlib"                        ,BBS_PROP_CURLIB                ,JSPROP_ENUMERATE       ,310},
        !           805:        {       "curdir"                        ,BBS_PROP_CURDIR                ,JSPROP_ENUMERATE       ,310},
        !           806:        {       "connection"            ,BBS_PROP_CONNECTION    ,PROP_READONLY          ,310},
        !           807:        {       "rlogin_name"           ,BBS_PROP_RLOGIN_NAME   ,JSPROP_ENUMERATE       ,310},
        !           808:        {       "client_name"           ,BBS_PROP_CLIENT_NAME   ,JSPROP_ENUMERATE       ,310},
        !           809:        {       "alt_ul_dir"            ,BBS_PROP_ALTUL                 ,JSPROP_ENUMERATE       ,310},
        !           810:        {       "errorlevel"            ,BBS_PROP_ERRORLEVEL    ,PROP_READONLY          ,312},
        !           811: 
        !           812:        {       "smb_group"                     ,BBS_PROP_SMB_GROUP                     ,PROP_READONLY  ,310},
        !           813:        {       "smb_group_desc"        ,BBS_PROP_SMB_GROUP_DESC        ,PROP_READONLY  ,310},
        !           814:        {       "smb_group_number"      ,BBS_PROP_SMB_GROUP_NUM         ,PROP_READONLY  ,310},
        !           815:        {       "smb_sub"                       ,BBS_PROP_SMB_SUB                       ,PROP_READONLY  ,310},
        !           816:        {       "smb_sub_desc"          ,BBS_PROP_SMB_SUB_DESC          ,PROP_READONLY  ,310},
        !           817:        {       "smb_sub_code"          ,BBS_PROP_SMB_SUB_CODE          ,PROP_READONLY  ,310},
        !           818:        {       "smb_sub_number"        ,BBS_PROP_SMB_SUB_NUM           ,PROP_READONLY  ,310},
        !           819:        {       "smb_attr"                      ,BBS_PROP_SMB_ATTR                      ,PROP_READONLY  ,310},
        !           820:        {       "smb_last_msg"          ,BBS_PROP_SMB_LAST_MSG          ,PROP_READONLY  ,310},
        !           821:        {       "smb_total_msgs"        ,BBS_PROP_SMB_TOTAL_MSGS        ,PROP_READONLY  ,310},
        !           822:        {       "smb_msgs"                      ,BBS_PROP_SMB_MSGS                      ,PROP_READONLY  ,310},
        !           823:        {       "smb_curmsg"            ,BBS_PROP_SMB_CURMSG            ,PROP_READONLY  ,310},
        !           824:                                                                                                                                                
        !           825:        {       "msg_to"                        ,BBS_PROP_MSG_TO                        ,PROP_READONLY  ,310},
        !           826:        {       "msg_to_ext"            ,BBS_PROP_MSG_TO_EXT            ,PROP_READONLY  ,310},
        !           827:        {       "msg_to_net"            ,BBS_PROP_MSG_TO_NET            ,PROP_READONLY  ,310},
        !           828:        {       "msg_to_agent"          ,BBS_PROP_MSG_TO_AGENT          ,PROP_READONLY  ,310},
        !           829:        {       "msg_from"                      ,BBS_PROP_MSG_FROM                      ,PROP_READONLY  ,310},
        !           830:        {       "msg_from_ext"          ,BBS_PROP_MSG_FROM_EXT          ,PROP_READONLY  ,310},
        !           831:        {       "msg_from_net"          ,BBS_PROP_MSG_FROM_NET          ,PROP_READONLY  ,310},
        !           832:        {       "msg_from_agent"        ,BBS_PROP_MSG_FROM_AGENT        ,PROP_READONLY  ,310},
        !           833:        {       "msg_replyto"           ,BBS_PROP_MSG_REPLYTO           ,PROP_READONLY  ,310},
        !           834:        {       "msg_replyto_ext"       ,BBS_PROP_MSG_REPLYTO_EXT       ,PROP_READONLY  ,310},
        !           835:        {       "msg_replyto_net"       ,BBS_PROP_MSG_REPLYTO_NET       ,PROP_READONLY  ,310},
        !           836:        {       "msg_replyto_agent"     ,BBS_PROP_MSG_REPLYTO_AGENT     ,PROP_READONLY  ,310},
        !           837:        {       "msg_subject"           ,BBS_PROP_MSG_SUBJECT           ,PROP_READONLY  ,310},
        !           838:        {       "msg_date"                      ,BBS_PROP_MSG_DATE                      ,PROP_READONLY  ,310},
        !           839:        {       "msg_timezone"          ,BBS_PROP_MSG_TIMEZONE          ,PROP_READONLY  ,310},
        !           840:        {       "msg_date_imported"     ,BBS_PROP_MSG_DATE_IMPORTED     ,PROP_READONLY  ,310},
        !           841:        {       "msg_attr"                      ,BBS_PROP_MSG_ATTR                      ,PROP_READONLY  ,310},
        !           842:        {       "msg_auxattr"           ,BBS_PROP_MSG_AUXATTR           ,PROP_READONLY  ,310},
        !           843:        {       "msg_netattr"           ,BBS_PROP_MSG_NETATTR           ,PROP_READONLY  ,310},
        !           844:        {       "msg_offset"            ,BBS_PROP_MSG_OFFSET            ,PROP_READONLY  ,310},
        !           845:        {       "msg_number"            ,BBS_PROP_MSG_NUMBER            ,PROP_READONLY  ,310},
        !           846:        {       "msg_expiration"        ,BBS_PROP_MSG_EXPIRATION        ,PROP_READONLY  ,310},
        !           847:        {       "msg_forwarded"         ,BBS_PROP_MSG_FORWARDED         ,PROP_READONLY  ,310},
        !           848:        {       "msg_thread_back"       ,BBS_PROP_MSG_THREAD_BACK       ,PROP_READONLY  ,312},
        !           849:        {       "msg_thread_orig"       ,BBS_PROP_MSG_THREAD_BACK       ,JSPROP_READONLY,310},  /* alias */
        !           850:        {       "msg_thread_next"       ,BBS_PROP_MSG_THREAD_NEXT       ,PROP_READONLY  ,310},
        !           851:        {       "msg_thread_first"      ,BBS_PROP_MSG_THREAD_FIRST      ,PROP_READONLY  ,310},
        !           852:        {       "msg_id"                        ,BBS_PROP_MSG_ID                        ,PROP_READONLY  ,310},
        !           853:        {       "msg_reply_id"          ,BBS_PROP_MSG_REPLY_ID          ,PROP_READONLY  ,310},
        !           854:        {       "msg_delivery_attempts" ,BBS_PROP_MSG_DELIVERY_ATTEMPTS
        !           855:                                                                                                                ,PROP_READONLY  ,310},
        !           856: 
        !           857:        {       "batch_upload_total",BBS_PROP_BATCH_UPLOAD_TOTAL,PROP_READONLY  ,310},
        !           858:        {       "batch_dnload_total",BBS_PROP_BATCH_DNLOAD_TOTAL,PROP_READONLY  ,310},
        !           859:        {0}
        !           860: };
        !           861: 
        !           862: /* Utility functions */
        !           863: static uint get_subnum(JSContext* cx, sbbs_t* sbbs, jsval val)
        !           864: {
        !           865:        uint subnum=INVALID_SUB;
        !           866: 
        !           867:        if(JSVAL_IS_STRING(val)) {
        !           868:                char* p=JS_GetStringBytes(JS_ValueToString(cx,val));
        !           869:                for(subnum=0;subnum<sbbs->cfg.total_subs;subnum++)
        !           870:                        if(!stricmp(sbbs->cfg.sub[subnum]->code,p))
        !           871:                                break;
        !           872:        } else if(JSVAL_IS_NUMBER(val))
        !           873:                JS_ValueToInt32(cx,val,(int32*)&subnum);
        !           874:        else if(sbbs->usrgrps>0)
        !           875:                subnum=sbbs->usrsub[sbbs->curgrp][sbbs->cursub[sbbs->curgrp]];
        !           876: 
        !           877:        return(subnum);
        !           878: }
        !           879: 
        !           880: static uint get_dirnum(JSContext* cx, sbbs_t* sbbs, jsval val)
        !           881: {
        !           882:        uint dirnum=INVALID_DIR;
        !           883: 
        !           884:        if(JSVAL_IS_STRING(val)) {
        !           885:                char* p=JS_GetStringBytes(JS_ValueToString(cx,val));
        !           886:                for(dirnum=0;dirnum<sbbs->cfg.total_dirs;dirnum++)
        !           887:                        if(!stricmp(sbbs->cfg.dir[dirnum]->code,p))
        !           888:                                break;
        !           889:        } else if(JSVAL_IS_NUMBER(val))
        !           890:                JS_ValueToInt32(cx,val,(int32*)&dirnum);
        !           891:        else if(sbbs->usrlibs>0)
        !           892:                dirnum=sbbs->usrdir[sbbs->curlib][sbbs->curdir[sbbs->curlib]];
        !           893: 
        !           894:        return(dirnum);
        !           895: }
        !           896: 
        !           897: /**************************/
        !           898: /* bbs Object Methods */
        !           899: /**************************/
        !           900: 
        !           901: static JSBool
        !           902: js_menu(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           903: {
        !           904:     JSString*  str;
        !           905:        sbbs_t*         sbbs;
        !           906:  
        !           907:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !           908:                return(JS_FALSE);
        !           909:  
        !           910:        str = JS_ValueToString(cx, argv[0]);
        !           911:        if (!str)
        !           912:                return(JS_FALSE);
        !           913:  
        !           914:        sbbs->menu(JS_GetStringBytes(str));
        !           915:        *rval=JSVAL_VOID;
        !           916: 
        !           917:     return(JS_TRUE);
        !           918: }
        !           919:  
        !           920: static JSBool
        !           921: js_hangup(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           922: {
        !           923:        sbbs_t*         sbbs;
        !           924: 
        !           925:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !           926:                return(JS_FALSE);
        !           927: 
        !           928:        sbbs->hangup();
        !           929:        *rval=JSVAL_VOID;
        !           930: 
        !           931:        return(JS_TRUE);
        !           932: }
        !           933: 
        !           934: static JSBool
        !           935: js_nodesync(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           936: {
        !           937:        sbbs_t*         sbbs;
        !           938: 
        !           939:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !           940:                return(JS_FALSE);
        !           941: 
        !           942:        sbbs->getnodedat(sbbs->cfg.node_num,&sbbs->thisnode,0);
        !           943:        sbbs->nodesync();
        !           944:        *rval=JSVAL_VOID;
        !           945: 
        !           946:        return(JS_TRUE);
        !           947: }
        !           948: 
        !           949: static JSBool
        !           950: js_exec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           951: {
        !           952:        uintN           i;
        !           953:        sbbs_t*         sbbs;
        !           954:        long            mode=0;
        !           955:     JSString*  cmd;
        !           956:        JSString*       startup_dir=NULL;
        !           957:        char*           p_startup_dir=NULL;
        !           958: 
        !           959:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !           960:                return(JS_FALSE);
        !           961: 
        !           962:        if((cmd=JS_ValueToString(cx, argv[0]))==NULL)
        !           963:                return(JS_FALSE);
        !           964: 
        !           965:        for(i=1;i<argc;i++) {
        !           966:                if(JSVAL_IS_NUMBER(argv[i]))
        !           967:                        JS_ValueToInt32(cx,argv[i],(int32*)&mode);
        !           968:                else if(JSVAL_IS_STRING(argv[i]))
        !           969:                        startup_dir=JS_ValueToString(cx,argv[i]);
        !           970:        }
        !           971: 
        !           972:        if(startup_dir!=NULL)
        !           973:                p_startup_dir=JS_GetStringBytes(startup_dir);
        !           974: 
        !           975:        *rval = INT_TO_JSVAL(sbbs->external(JS_GetStringBytes(cmd),mode,p_startup_dir));
        !           976: 
        !           977:     return(JS_TRUE);
        !           978: }
        !           979: 
        !           980: static JSBool
        !           981: js_exec_xtrn(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           982: {
        !           983:        int32           i=0;
        !           984:        char*           code;
        !           985:        sbbs_t*         sbbs;
        !           986:     JSString*  str;
        !           987: 
        !           988:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !           989:                return(JS_FALSE);
        !           990: 
        !           991:        if(JSVAL_IS_STRING(argv[0])) {
        !           992:                if((str=JS_ValueToString(cx, argv[0]))==NULL)
        !           993:                        return(JS_FALSE);
        !           994: 
        !           995:                if((code=JS_GetStringBytes(str))==NULL)
        !           996:                        return(JS_FALSE);
        !           997: 
        !           998:                for(i=0;i<sbbs->cfg.total_xtrns;i++)
        !           999:                        if(!stricmp(sbbs->cfg.xtrn[i]->code,code))
        !          1000:                                break;
        !          1001:        } else
        !          1002:                JS_ValueToInt32(cx,argv[0],&i);
        !          1003: 
        !          1004:        if(i>=sbbs->cfg.total_xtrns) {
        !          1005:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1006:                return(JS_TRUE);
        !          1007:        }
        !          1008: 
        !          1009:        *rval = BOOLEAN_TO_JSVAL(sbbs->exec_xtrn(i));
        !          1010:        return(JS_TRUE);
        !          1011: }
        !          1012: 
        !          1013: static JSBool
        !          1014: js_user_event(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1015: {
        !          1016:        int32           i=0;
        !          1017:        sbbs_t*         sbbs;
        !          1018: 
        !          1019:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1020:                return(JS_FALSE);
        !          1021: 
        !          1022:        JS_ValueToInt32(cx,argv[0],&i);
        !          1023:        *rval = BOOLEAN_TO_JSVAL(sbbs->user_event((user_event_t)i));
        !          1024:        return(JS_TRUE);
        !          1025: }
        !          1026: 
        !          1027: static JSBool
        !          1028: js_chksyspass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1029: {
        !          1030:        sbbs_t*         sbbs;
        !          1031: 
        !          1032:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1033:                return(JS_FALSE);
        !          1034: 
        !          1035:        *rval = BOOLEAN_TO_JSVAL(sbbs->chksyspass());
        !          1036:        return(JS_TRUE);
        !          1037: }
        !          1038: 
        !          1039: static JSBool
        !          1040: js_chkpass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1041: {
        !          1042:        sbbs_t*         sbbs;
        !          1043: 
        !          1044:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1045:                return(JS_FALSE);
        !          1046: 
        !          1047:        JSString* str=JS_ValueToString(cx,argv[0]);
        !          1048: 
        !          1049:        *rval = BOOLEAN_TO_JSVAL(sbbs->chkpass(JS_GetStringBytes(str),&sbbs->useron,true));
        !          1050:        return(JS_TRUE);
        !          1051: }
        !          1052: 
        !          1053: 
        !          1054: static JSBool
        !          1055: js_text(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1056: {
        !          1057:        int32           i=0;
        !          1058:        sbbs_t*         sbbs;
        !          1059: 
        !          1060:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1061:                return(JS_FALSE);
        !          1062: 
        !          1063:        JS_ValueToInt32(cx,argv[0],&i);
        !          1064:        i--;
        !          1065: 
        !          1066:        if(i<0 || i>=TOTAL_TEXT)
        !          1067:                *rval = JSVAL_NULL;
        !          1068:        else {
        !          1069:                JSString* js_str = JS_NewStringCopyZ(cx, sbbs->text[i]);
        !          1070:                if(js_str==NULL)
        !          1071:                        return(JS_FALSE);
        !          1072:                *rval = STRING_TO_JSVAL(js_str);
        !          1073:        }
        !          1074: 
        !          1075:        return(JS_TRUE);
        !          1076: }
        !          1077: 
        !          1078: static JSBool
        !          1079: js_replace_text(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1080: {
        !          1081:        char*           p;
        !          1082:        int32           i=0;
        !          1083:        int                     len;
        !          1084:        JSString*       js_str;
        !          1085:        sbbs_t*         sbbs;
        !          1086: 
        !          1087:        *rval = JSVAL_FALSE;
        !          1088: 
        !          1089:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1090:                return(JS_FALSE);
        !          1091: 
        !          1092:        JS_ValueToInt32(cx,argv[0],&i);
        !          1093:        i--;
        !          1094: 
        !          1095:        if(i<0 || i>=TOTAL_TEXT)
        !          1096:                return(JS_TRUE);
        !          1097: 
        !          1098:        if(sbbs->text[i]!=sbbs->text_sav[i] && sbbs->text[i]!=nulstr)
        !          1099:                FREE(sbbs->text[i]);
        !          1100: 
        !          1101:        if((js_str=JS_ValueToString(cx, argv[1]))==NULL)
        !          1102:                return(JS_TRUE);
        !          1103: 
        !          1104:        if((p=JS_GetStringBytes(js_str))==NULL)
        !          1105:                return(JS_TRUE);
        !          1106: 
        !          1107:        len=strlen(p);
        !          1108:        if(!len) {
        !          1109:                sbbs->text[i]=nulstr;
        !          1110:                *rval = BOOLEAN_TO_JSVAL(JS_TRUE);
        !          1111:        } else {
        !          1112:                sbbs->text[i]=(char *)MALLOC(len+1);
        !          1113:                if(sbbs->text[i]==NULL) {
        !          1114:                        sbbs->text[i]=sbbs->text_sav[i];
        !          1115:                } else {
        !          1116:                        strcpy(sbbs->text[i],p);
        !          1117:                        *rval = BOOLEAN_TO_JSVAL(JS_TRUE);
        !          1118:                }
        !          1119:        }
        !          1120: 
        !          1121:        return(JS_TRUE);
        !          1122: }
        !          1123: 
        !          1124: static JSBool
        !          1125: js_revert_text(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1126: {
        !          1127:        int32           i=0;
        !          1128:        sbbs_t*         sbbs;
        !          1129: 
        !          1130:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1131:                return(JS_FALSE);
        !          1132: 
        !          1133:        JS_ValueToInt32(cx,argv[0],&i);
        !          1134:        i--;
        !          1135: 
        !          1136:        if(i<0 || i>=TOTAL_TEXT) {
        !          1137:                for(i=0;i<TOTAL_TEXT;i++) {
        !          1138:                        if(sbbs->text[i]!=sbbs->text_sav[i] && sbbs->text[i]!=nulstr)
        !          1139:                                FREE(sbbs->text[i]);
        !          1140:                        sbbs->text[i]=sbbs->text_sav[i]; 
        !          1141:                }
        !          1142:        } else {
        !          1143:                if(sbbs->text[i]!=sbbs->text_sav[i] && sbbs->text[i]!=nulstr)
        !          1144:                        FREE(sbbs->text[i]);
        !          1145:                sbbs->text[i]=sbbs->text_sav[i];
        !          1146:        }
        !          1147: 
        !          1148:        *rval = BOOLEAN_TO_JSVAL(JS_TRUE);
        !          1149: 
        !          1150:        return(JS_TRUE);
        !          1151: }
        !          1152: 
        !          1153: static JSBool
        !          1154: js_load_text(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1155: {
        !          1156:        int                     i;
        !          1157:        char            path[MAX_PATH+1];
        !          1158:        FILE*           stream;
        !          1159:        JSString*       js_str;
        !          1160:        sbbs_t*         sbbs;
        !          1161: 
        !          1162:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1163:                return(JS_FALSE);
        !          1164: 
        !          1165:        if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
        !          1166:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1167:                return(JS_TRUE);
        !          1168:        }
        !          1169: 
        !          1170:        for(i=0;i<TOTAL_TEXT;i++) {
        !          1171:                if(sbbs->text[i]!=sbbs->text_sav[i]) {
        !          1172:                        if(sbbs->text[i]!=nulstr)
        !          1173:                                FREE(sbbs->text[i]);
        !          1174:                        sbbs->text[i]=sbbs->text_sav[i]; 
        !          1175:                }
        !          1176:        }
        !          1177:        sprintf(path,"%s%s.dat"
        !          1178:                ,sbbs->cfg.ctrl_dir,JS_GetStringBytes(js_str));
        !          1179: 
        !          1180:        if((stream=fnopen(NULL,path,O_RDONLY))==NULL) {
        !          1181:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1182:                return(JS_TRUE);
        !          1183:        }
        !          1184:        for(i=0;i<TOTAL_TEXT && !feof(stream);i++) {
        !          1185:                if((sbbs->text[i]=readtext((long *)NULL,stream))==NULL) {
        !          1186:                        i--;
        !          1187:                        continue; 
        !          1188:                }
        !          1189:                if(!strcmp(sbbs->text[i],sbbs->text_sav[i])) {  /* If identical */
        !          1190:                        FREE(sbbs->text[i]);                                    /* Don't alloc */
        !          1191:                        sbbs->text[i]=sbbs->text_sav[i]; 
        !          1192:                }
        !          1193:                else if(sbbs->text[i][0]==0) {
        !          1194:                        FREE(sbbs->text[i]);
        !          1195:                        sbbs->text[i]=nulstr; 
        !          1196:                } 
        !          1197:        }
        !          1198:        if(i<TOTAL_TEXT) 
        !          1199:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1200:        else
        !          1201:                *rval = BOOLEAN_TO_JSVAL(JS_TRUE);
        !          1202: 
        !          1203:        fclose(stream);
        !          1204: 
        !          1205:        return(JS_TRUE);
        !          1206: }
        !          1207: 
        !          1208: static JSBool
        !          1209: js_atcode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1210: {
        !          1211:        char            str[128];
        !          1212:        sbbs_t*         sbbs;
        !          1213: 
        !          1214:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1215:                return(JS_FALSE);
        !          1216: 
        !          1217:        char* p = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
        !          1218: 
        !          1219:        p=sbbs->atcode(p,str);
        !          1220: 
        !          1221:        if(p==NULL)
        !          1222:                *rval = JSVAL_NULL;
        !          1223:        else {
        !          1224:                JSString* js_str = JS_NewStringCopyZ(cx, p);
        !          1225:                if(js_str==NULL)
        !          1226:                        return(JS_FALSE);
        !          1227:                *rval = STRING_TO_JSVAL(js_str);
        !          1228:        }
        !          1229: 
        !          1230:        return(JS_TRUE);
        !          1231: }
        !          1232: 
        !          1233: 
        !          1234: static JSBool
        !          1235: js_logkey(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1236: {
        !          1237:        char*           p;
        !          1238:        JSBool          comma=false;
        !          1239:        JSString*       js_str;
        !          1240:        sbbs_t*         sbbs;
        !          1241: 
        !          1242:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1243:                return(JS_FALSE);
        !          1244: 
        !          1245:        if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
        !          1246:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1247:                return(JS_TRUE);
        !          1248:        }
        !          1249: 
        !          1250:        if(argc>1)
        !          1251:                comma=JS_ValueToBoolean(cx,argv[1],&comma);
        !          1252: 
        !          1253:        if((p=JS_GetStringBytes(js_str))==NULL) {
        !          1254:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1255:                return(JS_TRUE);
        !          1256:        }
        !          1257: 
        !          1258:        sbbs->logch(*p
        !          1259:                ,comma ? true:false     // This is a dumb bool conversion to make BC++ happy
        !          1260:                );
        !          1261: 
        !          1262:        *rval = BOOLEAN_TO_JSVAL(JS_TRUE);
        !          1263:        return(JS_TRUE);
        !          1264: }
        !          1265: 
        !          1266: static JSBool
        !          1267: js_logstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1268: {
        !          1269:        char*           p;
        !          1270:        JSString*       js_str;
        !          1271:        sbbs_t*         sbbs;
        !          1272: 
        !          1273:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1274:                return(JS_FALSE);
        !          1275: 
        !          1276:        if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
        !          1277:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1278:                return(JS_TRUE);
        !          1279:        }
        !          1280: 
        !          1281:        if((p=JS_GetStringBytes(js_str))==NULL) {
        !          1282:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1283:                return(JS_TRUE);
        !          1284:        }
        !          1285: 
        !          1286:        sbbs->log(p);
        !          1287: 
        !          1288:        *rval = BOOLEAN_TO_JSVAL(JS_TRUE);
        !          1289:        return(JS_TRUE);
        !          1290: }
        !          1291: 
        !          1292: static JSBool
        !          1293: js_finduser(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1294: {
        !          1295:        char*           p;
        !          1296:        JSString*       js_str;
        !          1297:        sbbs_t*         sbbs;
        !          1298: 
        !          1299:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1300:                return(JS_FALSE);
        !          1301: 
        !          1302:        if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
        !          1303:                *rval = INT_TO_JSVAL(0);
        !          1304:                return(JS_TRUE);
        !          1305:        }
        !          1306: 
        !          1307:        if((p=JS_GetStringBytes(js_str))==NULL) {
        !          1308:                *rval = INT_TO_JSVAL(0);
        !          1309:                return(JS_TRUE);
        !          1310:        }
        !          1311: 
        !          1312:        *rval = INT_TO_JSVAL(sbbs->finduser(p));
        !          1313:        return(JS_TRUE);
        !          1314: }
        !          1315: 
        !          1316: static JSBool
        !          1317: js_trashcan(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1318: {
        !          1319:        char*           str;
        !          1320:        char*           can;
        !          1321:        JSString*       js_str;
        !          1322:        JSString*       js_can;
        !          1323:        sbbs_t*         sbbs;
        !          1324: 
        !          1325:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1326:                return(JS_FALSE);
        !          1327: 
        !          1328:        if((js_can=JS_ValueToString(cx, argv[0]))==NULL) {
        !          1329:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1330:                return(JS_TRUE);
        !          1331:        }
        !          1332: 
        !          1333:        if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
        !          1334:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1335:                return(JS_TRUE);
        !          1336:        }
        !          1337: 
        !          1338:        if((can=JS_GetStringBytes(js_can))==NULL) {
        !          1339:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1340:                return(JS_TRUE);
        !          1341:        }
        !          1342: 
        !          1343:        if((str=JS_GetStringBytes(js_str))==NULL) {
        !          1344:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1345:                return(JS_TRUE);
        !          1346:        }
        !          1347: 
        !          1348:        *rval = BOOLEAN_TO_JSVAL(sbbs->trashcan(str,can));      // user args are reversed
        !          1349:        return(JS_TRUE);
        !          1350: }
        !          1351: 
        !          1352: static JSBool
        !          1353: js_newuser(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1354: {
        !          1355:        sbbs_t*         sbbs;
        !          1356: 
        !          1357:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1358:                return(JS_FALSE);
        !          1359: 
        !          1360:        *rval = BOOLEAN_TO_JSVAL(sbbs->newuser());
        !          1361:        return(JS_TRUE);
        !          1362: }
        !          1363: 
        !          1364: static JSBool
        !          1365: js_logon(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1366: {
        !          1367:        sbbs_t*         sbbs;
        !          1368: 
        !          1369:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1370:                return(JS_FALSE);
        !          1371: 
        !          1372:        *rval = BOOLEAN_TO_JSVAL(sbbs->logon());
        !          1373:        return(JS_TRUE);
        !          1374: }
        !          1375: 
        !          1376: static JSBool
        !          1377: js_login(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1378: {
        !          1379:        char*           name;
        !          1380:        char*           pw;
        !          1381:        JSString*       js_name;
        !          1382:        JSString*       js_pw;
        !          1383:        sbbs_t*         sbbs;
        !          1384: 
        !          1385:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1386:                return(JS_FALSE);
        !          1387: 
        !          1388:        if((js_name=JS_ValueToString(cx, argv[0]))==NULL) 
        !          1389:                return(JS_FALSE);
        !          1390: 
        !          1391:        if((js_pw=JS_ValueToString(cx, argv[1]))==NULL) 
        !          1392:                return(JS_FALSE);
        !          1393: 
        !          1394:        if((name=JS_GetStringBytes(js_name))==NULL) 
        !          1395:                return(JS_FALSE);
        !          1396: 
        !          1397:        if((pw=JS_GetStringBytes(js_pw))==NULL) 
        !          1398:                return(JS_FALSE);
        !          1399: 
        !          1400:        *rval = BOOLEAN_TO_JSVAL(sbbs->login(name,pw)==LOGIC_TRUE ? JS_TRUE:JS_FALSE);
        !          1401:        return(JS_TRUE);
        !          1402: }
        !          1403: 
        !          1404: 
        !          1405: static JSBool
        !          1406: js_logoff(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1407: {
        !          1408:        sbbs_t*         sbbs;
        !          1409: 
        !          1410:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1411:                return(JS_FALSE);
        !          1412: 
        !          1413:        if(!sbbs->noyes(sbbs->text[LogOffQ])) {
        !          1414:                if(sbbs->cfg.logoff_mod[0])
        !          1415:                        sbbs->exec_bin(sbbs->cfg.logoff_mod,&sbbs->main_csi);
        !          1416:                sbbs->user_event(EVENT_LOGOFF);
        !          1417:                sbbs->menu("logoff");
        !          1418:                sbbs->riosync(0);
        !          1419:                sbbs->hangup(); 
        !          1420:        }
        !          1421: 
        !          1422:        *rval = JSVAL_VOID;
        !          1423:        return(JS_TRUE);
        !          1424: }
        !          1425: 
        !          1426: static JSBool
        !          1427: js_logout(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1428: {
        !          1429:        sbbs_t*         sbbs;
        !          1430: 
        !          1431:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1432:                return(JS_FALSE);
        !          1433: 
        !          1434:        sbbs->logout();
        !          1435: 
        !          1436:        *rval = JSVAL_VOID;
        !          1437:        return(JS_TRUE);
        !          1438: }
        !          1439: 
        !          1440: static JSBool
        !          1441: js_automsg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1442: {
        !          1443:        sbbs_t*         sbbs;
        !          1444: 
        !          1445:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1446:                return(JS_FALSE);
        !          1447: 
        !          1448:        sbbs->automsg();
        !          1449: 
        !          1450:        *rval = JSVAL_VOID;
        !          1451:        return(JS_TRUE);
        !          1452: }
        !          1453: 
        !          1454: static JSBool
        !          1455: js_time_bank(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1456: {
        !          1457:        sbbs_t*         sbbs;
        !          1458: 
        !          1459:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1460:                return(JS_FALSE);
        !          1461: 
        !          1462:        sbbs->time_bank();
        !          1463: 
        !          1464:        *rval = JSVAL_VOID;
        !          1465:        return(JS_TRUE);
        !          1466: }
        !          1467: 
        !          1468: static JSBool
        !          1469: js_text_sec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1470: {
        !          1471:        sbbs_t*         sbbs;
        !          1472: 
        !          1473:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1474:                return(JS_FALSE);
        !          1475: 
        !          1476:        sbbs->text_sec();
        !          1477: 
        !          1478:        *rval = JSVAL_VOID;
        !          1479:        return(JS_TRUE);
        !          1480: }
        !          1481: 
        !          1482: static JSBool
        !          1483: js_qwk_sec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1484: {
        !          1485:        sbbs_t*         sbbs;
        !          1486: 
        !          1487:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1488:                return(JS_FALSE);
        !          1489: 
        !          1490:        sbbs->qwk_sec();
        !          1491: 
        !          1492:        *rval = JSVAL_VOID;
        !          1493:        return(JS_TRUE);
        !          1494: }
        !          1495: 
        !          1496: static JSBool
        !          1497: js_xtrn_sec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1498: {
        !          1499:        sbbs_t*         sbbs;
        !          1500: 
        !          1501:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1502:                return(JS_FALSE);
        !          1503: 
        !          1504:        sbbs->xtrn_sec();
        !          1505: 
        !          1506:        *rval = JSVAL_VOID;
        !          1507:        return(JS_TRUE);
        !          1508: }
        !          1509: 
        !          1510: static JSBool
        !          1511: js_xfer_policy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1512: {
        !          1513:        sbbs_t*         sbbs;
        !          1514: 
        !          1515:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1516:                return(JS_FALSE);
        !          1517: 
        !          1518:        sbbs->xfer_policy();
        !          1519: 
        !          1520:        *rval = JSVAL_VOID;
        !          1521:        return(JS_TRUE);
        !          1522: }
        !          1523: 
        !          1524: static JSBool
        !          1525: js_batchmenu(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1526: {
        !          1527:        sbbs_t*         sbbs;
        !          1528: 
        !          1529:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1530:                return(JS_FALSE);
        !          1531: 
        !          1532:        sbbs->batchmenu();
        !          1533: 
        !          1534:        *rval = JSVAL_VOID;
        !          1535:        return(JS_TRUE);
        !          1536: }
        !          1537: 
        !          1538: static JSBool
        !          1539: js_batchdownload(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1540: {
        !          1541:        sbbs_t*         sbbs;
        !          1542: 
        !          1543:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1544:                return(JS_FALSE);
        !          1545: 
        !          1546:        *rval = BOOLEAN_TO_JSVAL(sbbs->start_batch_download());
        !          1547:        return(JS_TRUE);
        !          1548: }
        !          1549: 
        !          1550: static JSBool
        !          1551: js_batchaddlist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1552: {
        !          1553:        sbbs_t*         sbbs;
        !          1554: 
        !          1555:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1556:                return(JS_FALSE);
        !          1557: 
        !          1558:        sbbs->batch_add_list(JS_GetStringBytes(JS_ValueToString(cx, argv[0])));
        !          1559: 
        !          1560:        *rval = JSVAL_VOID;
        !          1561:        return(JS_TRUE);
        !          1562: }
        !          1563: 
        !          1564: static JSBool
        !          1565: js_temp_xfer(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1566: {
        !          1567:        sbbs_t*         sbbs;
        !          1568: 
        !          1569:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1570:                return(JS_FALSE);
        !          1571: 
        !          1572:        sbbs->temp_xfer();
        !          1573: 
        !          1574:        *rval = JSVAL_VOID;
        !          1575:        return(JS_TRUE);
        !          1576: }
        !          1577: 
        !          1578: static JSBool
        !          1579: js_user_config(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1580: {
        !          1581:        sbbs_t*         sbbs;
        !          1582: 
        !          1583:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1584:                return(JS_FALSE);
        !          1585: 
        !          1586:        sbbs->maindflts(&sbbs->useron);
        !          1587:        if(!(sbbs->useron.rest&FLAG('G')))    /* not guest */
        !          1588:                getuserdat(&sbbs->cfg,&sbbs->useron);
        !          1589: 
        !          1590:        *rval = JSVAL_VOID;
        !          1591:        return(JS_TRUE);
        !          1592: }
        !          1593: 
        !          1594: static JSBool
        !          1595: js_user_sync(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1596: {
        !          1597:        sbbs_t*         sbbs;
        !          1598: 
        !          1599:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1600:                return(JS_FALSE);
        !          1601: 
        !          1602:        getuserdat(&sbbs->cfg,&sbbs->useron);
        !          1603: 
        !          1604:        *rval = JSVAL_VOID;
        !          1605:        return(JS_TRUE);
        !          1606: }
        !          1607: 
        !          1608: static JSBool
        !          1609: js_sys_info(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1610: {
        !          1611:        sbbs_t*         sbbs;
        !          1612: 
        !          1613:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1614:                return(JS_FALSE);
        !          1615: 
        !          1616:        sbbs->sys_info();
        !          1617: 
        !          1618:        *rval = JSVAL_VOID;
        !          1619:        return(JS_TRUE);
        !          1620: }
        !          1621: 
        !          1622: static JSBool
        !          1623: js_sub_info(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1624: {
        !          1625:        sbbs_t*         sbbs;
        !          1626: 
        !          1627:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1628:                return(JS_FALSE);
        !          1629: 
        !          1630:        uint subnum=get_subnum(cx,sbbs,argv[0]);
        !          1631: 
        !          1632:        if(subnum<sbbs->cfg.total_subs)
        !          1633:                sbbs->subinfo(subnum);
        !          1634: 
        !          1635:        *rval = JSVAL_VOID;
        !          1636:        return(JS_TRUE);
        !          1637: }
        !          1638: 
        !          1639: static JSBool
        !          1640: js_dir_info(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1641: {
        !          1642:        sbbs_t*         sbbs;
        !          1643: 
        !          1644:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1645:                return(JS_FALSE);
        !          1646: 
        !          1647:        uint dirnum=get_dirnum(cx,sbbs,argv[0]);
        !          1648:        if(dirnum<sbbs->cfg.total_dirs)
        !          1649:                sbbs->dirinfo(dirnum);
        !          1650: 
        !          1651:        *rval = JSVAL_VOID;
        !          1652:        return(JS_TRUE);
        !          1653: }
        !          1654: 
        !          1655: static JSBool
        !          1656: js_user_info(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1657: {
        !          1658:        sbbs_t*         sbbs;
        !          1659: 
        !          1660:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1661:                return(JS_FALSE);
        !          1662: 
        !          1663:        sbbs->user_info();
        !          1664: 
        !          1665:        *rval = JSVAL_VOID;
        !          1666:        return(JS_TRUE);
        !          1667: }
        !          1668: 
        !          1669: static JSBool
        !          1670: js_ver(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1671: {
        !          1672:        sbbs_t*         sbbs;
        !          1673: 
        !          1674:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1675:                return(JS_FALSE);
        !          1676: 
        !          1677:        sbbs->ver();
        !          1678: 
        !          1679:        *rval = JSVAL_VOID;
        !          1680:        return(JS_TRUE);
        !          1681: }
        !          1682: 
        !          1683: static JSBool
        !          1684: js_sys_stats(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1685: {
        !          1686:        sbbs_t*         sbbs;
        !          1687: 
        !          1688:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1689:                return(JS_FALSE);
        !          1690: 
        !          1691:        sbbs->sys_stats();
        !          1692: 
        !          1693:        *rval = JSVAL_VOID;
        !          1694:        return(JS_TRUE);
        !          1695: }
        !          1696: 
        !          1697: static JSBool
        !          1698: js_node_stats(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1699: {
        !          1700:        int32           node_num=0;
        !          1701:        sbbs_t*         sbbs;
        !          1702: 
        !          1703:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1704:                return(JS_FALSE);
        !          1705: 
        !          1706:        if(argc>0)
        !          1707:                JS_ValueToInt32(cx,argv[0],&node_num);
        !          1708: 
        !          1709:        sbbs->node_stats(node_num);
        !          1710: 
        !          1711:        *rval = JSVAL_VOID;
        !          1712:        return(JS_TRUE);
        !          1713: }
        !          1714: 
        !          1715: static JSBool
        !          1716: js_userlist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1717: {
        !          1718:        int32           mode=UL_ALL;
        !          1719:        sbbs_t*         sbbs;
        !          1720: 
        !          1721:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1722:                return(JS_FALSE);
        !          1723: 
        !          1724:        if(argc>0)
        !          1725:                JS_ValueToInt32(cx,argv[0],&mode);
        !          1726: 
        !          1727:        sbbs->userlist(mode);
        !          1728: 
        !          1729:        *rval = JSVAL_VOID;
        !          1730:        return(JS_TRUE);
        !          1731: }
        !          1732: 
        !          1733: static JSBool
        !          1734: js_useredit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1735: {
        !          1736:        int32           usernumber=0;
        !          1737:        sbbs_t*         sbbs;
        !          1738: 
        !          1739:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1740:                return(JS_FALSE);
        !          1741: 
        !          1742:        if(argc>0)
        !          1743:                JS_ValueToInt32(cx,argv[0],&usernumber);
        !          1744: 
        !          1745:        sbbs->useredit(usernumber);
        !          1746: 
        !          1747:        *rval = JSVAL_VOID;
        !          1748:        return(JS_TRUE);
        !          1749: }
        !          1750: 
        !          1751: static JSBool
        !          1752: js_change_user(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1753: {
        !          1754:        sbbs_t*         sbbs;
        !          1755: 
        !          1756:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1757:                return(JS_FALSE);
        !          1758: 
        !          1759:        sbbs->change_user();
        !          1760: 
        !          1761:        *rval = JSVAL_VOID;
        !          1762:        return(JS_TRUE);
        !          1763: }
        !          1764: 
        !          1765: static JSBool
        !          1766: js_logonlist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1767: {
        !          1768:        sbbs_t*         sbbs;
        !          1769: 
        !          1770:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1771:                return(JS_FALSE);
        !          1772: 
        !          1773:        sbbs->logonlist();
        !          1774: 
        !          1775:        *rval = JSVAL_VOID;
        !          1776:        return(JS_TRUE);
        !          1777: }
        !          1778: 
        !          1779: static JSBool
        !          1780: js_nodelist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1781: {
        !          1782:        sbbs_t*         sbbs;
        !          1783: 
        !          1784:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1785:                return(JS_FALSE);
        !          1786: 
        !          1787:        sbbs->nodelist();
        !          1788: 
        !          1789:        *rval = JSVAL_VOID;
        !          1790:        return(JS_TRUE);
        !          1791: }
        !          1792: 
        !          1793: static JSBool
        !          1794: js_whos_online(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1795: {
        !          1796:        sbbs_t*         sbbs;
        !          1797: 
        !          1798:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1799:                return(JS_FALSE);
        !          1800: 
        !          1801:        sbbs->whos_online(true);
        !          1802: 
        !          1803:        *rval = JSVAL_VOID;
        !          1804:        return(JS_TRUE);
        !          1805: }
        !          1806: 
        !          1807: static JSBool
        !          1808: js_spy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1809: {
        !          1810:        int32           node_num=1;
        !          1811:        sbbs_t*         sbbs;
        !          1812: 
        !          1813:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1814:                return(JS_FALSE);
        !          1815: 
        !          1816:        JS_ValueToInt32(cx,argv[0],&node_num);
        !          1817:        sbbs->spy(node_num);
        !          1818: 
        !          1819:        *rval = JSVAL_VOID;
        !          1820:        return(JS_TRUE);
        !          1821: }
        !          1822: 
        !          1823: static JSBool
        !          1824: js_readmail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1825: {
        !          1826:        int32           readwhich=MAIL_YOUR;
        !          1827:        int32           usernumber;
        !          1828:        sbbs_t*         sbbs;
        !          1829: 
        !          1830:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1831:                return(JS_FALSE);
        !          1832: 
        !          1833:        usernumber=sbbs->useron.number;
        !          1834:        if(argc>0)
        !          1835:                JS_ValueToInt32(cx,argv[0],&readwhich);
        !          1836:        if(argc>1)
        !          1837:                JS_ValueToInt32(cx,argv[1],&usernumber);
        !          1838: 
        !          1839:        sbbs->readmail(usernumber,readwhich);
        !          1840: 
        !          1841:        *rval = JSVAL_VOID;
        !          1842:        return(JS_TRUE);
        !          1843: }
        !          1844: 
        !          1845: static JSBool
        !          1846: js_email(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1847: {
        !          1848:        int32           usernumber=1;
        !          1849:        long            mode=WM_EMAIL;
        !          1850:        char*           top="";
        !          1851:        char*           subj="";
        !          1852:        JSString*       js_top=NULL;
        !          1853:        JSString*       js_subj=NULL;
        !          1854:        sbbs_t*         sbbs;
        !          1855: 
        !          1856:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1857:                return(JS_FALSE);
        !          1858: 
        !          1859:        JS_ValueToInt32(cx,argv[0],&usernumber);
        !          1860:        for(uintN i=1;i<argc;i++) {
        !          1861:                if(JSVAL_IS_NUMBER(argv[i]))
        !          1862:                        JS_ValueToInt32(cx,argv[i],(int32*)&mode);
        !          1863:                else if(JSVAL_IS_STRING(argv[i]) && js_top==NULL)
        !          1864:                        js_top=JS_ValueToString(cx,argv[i]);
        !          1865:                else if(JSVAL_IS_STRING(argv[i]))
        !          1866:                        js_subj=JS_ValueToString(cx,argv[i]);
        !          1867:        }
        !          1868: 
        !          1869:        if(js_top!=NULL)
        !          1870:                top=JS_GetStringBytes(js_top);
        !          1871:        if(js_subj!=NULL)
        !          1872:                subj=JS_GetStringBytes(js_subj);
        !          1873: 
        !          1874:        *rval = BOOLEAN_TO_JSVAL(sbbs->email(usernumber,top,subj,mode));
        !          1875:        return(JS_TRUE);
        !          1876: }
        !          1877: static JSBool
        !          1878: js_netmail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1879: {
        !          1880:        long            mode=0;
        !          1881:        char*           subj="";
        !          1882:        JSString*       js_to;
        !          1883:        JSString*       js_subj=NULL;
        !          1884:        sbbs_t*         sbbs;
        !          1885: 
        !          1886:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1887:                return(JS_FALSE);
        !          1888: 
        !          1889:        if((js_to=JS_ValueToString(cx, argv[0]))==NULL)
        !          1890:                return(JS_FALSE);
        !          1891: 
        !          1892:        for(uintN i=1;i<argc;i++) {
        !          1893:                if(JSVAL_IS_NUMBER(argv[i]))
        !          1894:                        JS_ValueToInt32(cx,argv[i],(int32*)&mode);
        !          1895:                else if(JSVAL_IS_STRING(argv[i]))
        !          1896:                        js_subj=JS_ValueToString(cx,argv[i]);
        !          1897:        }
        !          1898: 
        !          1899:        if(js_subj!=NULL)
        !          1900:                subj=JS_GetStringBytes(js_subj);
        !          1901: 
        !          1902:        *rval = BOOLEAN_TO_JSVAL(sbbs->netmail(JS_GetStringBytes(js_to),subj,mode));
        !          1903:        return(JS_TRUE);
        !          1904: }
        !          1905: 
        !          1906: static JSBool
        !          1907: js_bulkmail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1908: {
        !          1909:        uchar*          ar=(uchar*)"";
        !          1910:        JSString*       js_ars=NULL;
        !          1911:        sbbs_t*         sbbs;
        !          1912: 
        !          1913:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1914:                return(JS_FALSE);
        !          1915: 
        !          1916:        if(argc) {
        !          1917:                if((js_ars=JS_ValueToString(cx, argv[0]))==NULL)
        !          1918:                        return(JS_FALSE);
        !          1919: 
        !          1920:                ar=arstr(NULL,JS_GetStringBytes(js_ars), &sbbs->cfg);
        !          1921:        }
        !          1922:        sbbs->bulkmail(ar);
        !          1923:        if(ar && ar[0])
        !          1924:                FREE(ar);
        !          1925: 
        !          1926:        *rval = JSVAL_VOID;
        !          1927:        return(JS_TRUE);
        !          1928: }
        !          1929: 
        !          1930: static JSBool
        !          1931: js_upload_file(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1932: {
        !          1933:        uint            dirnum=0;
        !          1934:        sbbs_t*         sbbs;
        !          1935: 
        !          1936:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1937:                return(JS_FALSE);
        !          1938: 
        !          1939:        dirnum=get_dirnum(cx,sbbs,argv[0]);
        !          1940: 
        !          1941:        if(dirnum>=sbbs->cfg.total_dirs) {
        !          1942:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1943:                return(JS_TRUE);
        !          1944:        }
        !          1945: 
        !          1946:        *rval = BOOLEAN_TO_JSVAL(sbbs->upload(dirnum));
        !          1947:        return(JS_TRUE);
        !          1948: }
        !          1949: 
        !          1950: 
        !          1951: static JSBool
        !          1952: js_bulkupload(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1953: {
        !          1954:        uint            dirnum=0;
        !          1955:        sbbs_t*         sbbs;
        !          1956: 
        !          1957:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1958:                return(JS_FALSE);
        !          1959: 
        !          1960:        dirnum=get_dirnum(cx,sbbs,argv[0]);
        !          1961: 
        !          1962:        if(dirnum>=sbbs->cfg.total_dirs) {
        !          1963:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1964:                return(JS_TRUE);
        !          1965:        }
        !          1966: 
        !          1967:        *rval = BOOLEAN_TO_JSVAL(sbbs->bulkupload(dirnum)==0);
        !          1968:        return(JS_TRUE);
        !          1969: }
        !          1970: 
        !          1971: static JSBool
        !          1972: js_resort_dir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1973: {
        !          1974:        uint            dirnum=0;
        !          1975:        sbbs_t*         sbbs;
        !          1976: 
        !          1977:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          1978:                return(JS_FALSE);
        !          1979: 
        !          1980:        dirnum=get_dirnum(cx,sbbs,argv[0]);
        !          1981: 
        !          1982:        if(dirnum>=sbbs->cfg.total_dirs) {
        !          1983:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          1984:                return(JS_TRUE);
        !          1985:        }
        !          1986: 
        !          1987:        sbbs->resort(dirnum);
        !          1988: 
        !          1989:        *rval = BOOLEAN_TO_JSVAL(JS_TRUE);
        !          1990:        return(JS_TRUE);
        !          1991: }
        !          1992: 
        !          1993: static JSBool
        !          1994: js_telnet_gate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1995: {
        !          1996:        char*           addr;
        !          1997:        int32           mode=0;
        !          1998:        JSString*       js_addr;
        !          1999:        sbbs_t*         sbbs;
        !          2000: 
        !          2001:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2002:                return(JS_FALSE);
        !          2003: 
        !          2004:        if((js_addr=JS_ValueToString(cx, argv[0]))==NULL) 
        !          2005:                return(JS_FALSE);
        !          2006: 
        !          2007:        if((addr=JS_GetStringBytes(js_addr))==NULL) 
        !          2008:                return(JS_FALSE);
        !          2009: 
        !          2010:        if(argc>1)
        !          2011:                JS_ValueToInt32(cx,argv[1],&mode);
        !          2012: 
        !          2013:        sbbs->telnet_gate(addr,mode);
        !          2014:        
        !          2015:        *rval = JSVAL_VOID;
        !          2016:        return(JS_TRUE);
        !          2017: }
        !          2018: 
        !          2019: static JSBool
        !          2020: js_pagesysop(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2021: {
        !          2022:        sbbs_t*         sbbs;
        !          2023: 
        !          2024:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2025:                return(JS_FALSE);
        !          2026: 
        !          2027:        *rval = BOOLEAN_TO_JSVAL(sbbs->sysop_page());
        !          2028:        return(JS_TRUE);
        !          2029: }
        !          2030: 
        !          2031: static JSBool
        !          2032: js_pageguru(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2033: {
        !          2034:        sbbs_t*         sbbs;
        !          2035: 
        !          2036:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2037:                return(JS_FALSE);
        !          2038: 
        !          2039:        *rval = BOOLEAN_TO_JSVAL(sbbs->guru_page());
        !          2040:        return(JS_TRUE);
        !          2041: }
        !          2042: 
        !          2043: static JSBool
        !          2044: js_multinode_chat(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2045: {
        !          2046:        sbbs_t*         sbbs;
        !          2047:        int32           channel=1;
        !          2048: 
        !          2049:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2050:                return(JS_FALSE);
        !          2051: 
        !          2052:        if(argc>1)
        !          2053:                JS_ValueToInt32(cx,argv[1],&channel);
        !          2054: 
        !          2055:        sbbs->multinodechat(channel);
        !          2056: 
        !          2057:        *rval = JSVAL_VOID;
        !          2058:        return(JS_TRUE);
        !          2059: }
        !          2060: 
        !          2061: static JSBool
        !          2062: js_private_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2063: {
        !          2064:        sbbs_t*         sbbs;
        !          2065: 
        !          2066:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2067:                return(JS_FALSE);
        !          2068: 
        !          2069:        sbbs->nodemsg();
        !          2070: 
        !          2071:        *rval = JSVAL_VOID;
        !          2072:        return(JS_TRUE);
        !          2073: }
        !          2074: 
        !          2075: static JSBool
        !          2076: js_private_chat(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2077: {
        !          2078:        sbbs_t*         sbbs;
        !          2079: 
        !          2080:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2081:                return(JS_FALSE);
        !          2082: 
        !          2083:        sbbs->privchat();
        !          2084: 
        !          2085:        *rval = JSVAL_VOID;
        !          2086:        return(JS_TRUE);
        !          2087: }
        !          2088: 
        !          2089: static JSBool
        !          2090: js_get_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2091: {
        !          2092:        sbbs_t*         sbbs;
        !          2093: 
        !          2094:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2095:                return(JS_FALSE);
        !          2096: 
        !          2097:        sbbs->getnmsg();
        !          2098: 
        !          2099:        *rval = JSVAL_VOID;
        !          2100:        return(JS_TRUE);
        !          2101: }
        !          2102: 
        !          2103: static JSBool
        !          2104: js_put_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2105: {
        !          2106:        sbbs_t*         sbbs;
        !          2107:        int32           node=0;
        !          2108:        JSString*       js_msg;
        !          2109:        char*           msg;
        !          2110: 
        !          2111:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2112:                return(JS_FALSE);
        !          2113: 
        !          2114:        JS_ValueToInt32(cx,argv[0],&node);
        !          2115:        if(node<1)
        !          2116:                node=1;
        !          2117: 
        !          2118:        if((js_msg=JS_ValueToString(cx, argv[1]))==NULL) 
        !          2119:                return(JS_FALSE);
        !          2120: 
        !          2121:        if((msg=JS_GetStringBytes(js_msg))==NULL) 
        !          2122:                return(JS_FALSE);
        !          2123: 
        !          2124:        *rval = BOOLEAN_TO_JSVAL(putnmsg(&sbbs->cfg,node,msg)==0);
        !          2125: 
        !          2126:        return(JS_TRUE);
        !          2127: }
        !          2128: 
        !          2129: static JSBool
        !          2130: js_get_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2131: {
        !          2132:        sbbs_t*         sbbs;
        !          2133:        int32           usernumber;
        !          2134: 
        !          2135:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2136:                return(JS_FALSE);
        !          2137: 
        !          2138:        usernumber=sbbs->useron.number;
        !          2139:        if(argc)
        !          2140:                JS_ValueToInt32(cx,argv[0],&usernumber);
        !          2141: 
        !          2142:        sbbs->getsmsg(usernumber);
        !          2143: 
        !          2144:        *rval = JSVAL_VOID;
        !          2145:        return(JS_TRUE);
        !          2146: }
        !          2147: 
        !          2148: static JSBool
        !          2149: js_put_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2150: {
        !          2151:        sbbs_t*         sbbs;
        !          2152:        int32           usernumber=0;
        !          2153:        JSString*       js_msg;
        !          2154:        char*           msg;
        !          2155: 
        !          2156:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2157:                return(JS_FALSE);
        !          2158: 
        !          2159:        JS_ValueToInt32(cx,argv[0],&usernumber);
        !          2160:        if(usernumber<1)
        !          2161:                usernumber=1;
        !          2162: 
        !          2163:        if((js_msg=JS_ValueToString(cx, argv[1]))==NULL) 
        !          2164:                return(JS_FALSE);
        !          2165: 
        !          2166:        if((msg=JS_GetStringBytes(js_msg))==NULL) 
        !          2167:                return(JS_FALSE);
        !          2168: 
        !          2169:        *rval = BOOLEAN_TO_JSVAL(putsmsg(&sbbs->cfg,usernumber,msg)==0);
        !          2170: 
        !          2171:        return(JS_TRUE);
        !          2172: }
        !          2173: 
        !          2174: static JSBool
        !          2175: js_cmdstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2176: {
        !          2177:        char*           p;
        !          2178:        char*           fpath="";
        !          2179:        char*           fspec="";
        !          2180:        JSString*       js_str;
        !          2181:        sbbs_t*         sbbs;
        !          2182: 
        !          2183:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2184:                return(JS_FALSE);
        !          2185: 
        !          2186:        js_str = JS_ValueToString(cx, argv[0]);
        !          2187:        if (!js_str)
        !          2188:                return(JS_FALSE);
        !          2189: 
        !          2190:        p=JS_GetStringBytes(js_str);
        !          2191: 
        !          2192:        for(uintN i=1;i<argc;i++) {
        !          2193:                if(JSVAL_IS_STRING(argv[i])) {
        !          2194:                        js_str = JS_ValueToString(cx, argv[i]);
        !          2195:                        if(fpath==NULL)
        !          2196:                                fpath=JS_GetStringBytes(js_str);
        !          2197:                        else
        !          2198:                                fspec=JS_GetStringBytes(js_str);
        !          2199:                }
        !          2200:        }
        !          2201: 
        !          2202:        p=sbbs->cmdstr(p,fpath,fspec,NULL);
        !          2203: 
        !          2204:        if((js_str=JS_NewStringCopyZ(cx, p))==NULL)
        !          2205:                return(JS_FALSE);
        !          2206:        *rval = STRING_TO_JSVAL(js_str);
        !          2207:        return(JS_TRUE);
        !          2208: }
        !          2209: 
        !          2210: static JSBool
        !          2211: js_getfilespec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2212: {
        !          2213:        char*           p;
        !          2214:        char            tmp[128];
        !          2215:        sbbs_t*         sbbs;
        !          2216: 
        !          2217:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2218:                return(JS_FALSE);
        !          2219: 
        !          2220:        p=sbbs->getfilespec(tmp);
        !          2221: 
        !          2222:        if(p==NULL)
        !          2223:                *rval=JSVAL_NULL;
        !          2224:        else {
        !          2225:                JSString* js_str = JS_NewStringCopyZ(cx, p);
        !          2226:                if(js_str==NULL)
        !          2227:                        return(JS_FALSE);
        !          2228:                *rval = STRING_TO_JSVAL(js_str);
        !          2229:        }
        !          2230:        return(JS_TRUE);
        !          2231: }
        !          2232: 
        !          2233: static JSBool
        !          2234: js_listfiles(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2235: {
        !          2236:        long            mode=0;
        !          2237:        char*           fspec=ALLFILES;
        !          2238:        uint            dirnum;
        !          2239:     JSString*  js_str;
        !          2240:        sbbs_t*         sbbs;
        !          2241: 
        !          2242:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2243:                return(JS_FALSE);
        !          2244: 
        !          2245:        dirnum=get_dirnum(cx,sbbs,argv[0]);
        !          2246: 
        !          2247:        if(dirnum>=sbbs->cfg.total_dirs) {
        !          2248:                *rval = INT_TO_JSVAL(0);
        !          2249:                return(JS_TRUE);
        !          2250:        }
        !          2251: 
        !          2252:        for(uintN i=1;i<argc;i++) {
        !          2253:                if(JSVAL_IS_NUMBER(argv[i]))
        !          2254:                        JS_ValueToInt32(cx,argv[i],(int32*)&mode);
        !          2255:                else if(JSVAL_IS_STRING(argv[i])) {
        !          2256:                        js_str = JS_ValueToString(cx, argv[i]);
        !          2257:                        fspec=JS_GetStringBytes(js_str);
        !          2258:                }
        !          2259:        }
        !          2260: 
        !          2261:        *rval = INT_TO_JSVAL(sbbs->listfiles(dirnum,fspec,0 /* tofile */,mode));
        !          2262:        return(JS_TRUE);
        !          2263: }
        !          2264: 
        !          2265: 
        !          2266: static JSBool
        !          2267: js_listfileinfo(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2268: {
        !          2269:        long            mode=FI_INFO;
        !          2270:        char*           fspec=ALLFILES;
        !          2271:        uint            dirnum;
        !          2272:     JSString*  js_str;
        !          2273:        sbbs_t*         sbbs;
        !          2274: 
        !          2275:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2276:                return(JS_FALSE);
        !          2277: 
        !          2278:        dirnum=get_dirnum(cx,sbbs,argv[0]);
        !          2279: 
        !          2280:        if(dirnum>=sbbs->cfg.total_dirs) {
        !          2281:                *rval = INT_TO_JSVAL(0);
        !          2282:                return(JS_TRUE);
        !          2283:        }
        !          2284: 
        !          2285:        for(uintN i=1;i<argc;i++) {
        !          2286:                if(JSVAL_IS_NUMBER(argv[i]))
        !          2287:                        JS_ValueToInt32(cx,argv[i],(int32*)&mode);
        !          2288:                else if(JSVAL_IS_STRING(argv[i])) {
        !          2289:                        js_str = JS_ValueToString(cx, argv[i]);
        !          2290:                        fspec=JS_GetStringBytes(js_str);
        !          2291:                }
        !          2292:        }
        !          2293: 
        !          2294:        *rval = INT_TO_JSVAL(sbbs->listfileinfo(dirnum,fspec,mode));
        !          2295:        return(JS_TRUE);
        !          2296: }
        !          2297: 
        !          2298: static JSBool
        !          2299: js_postmsg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2300: {
        !          2301:        long            mode=0;
        !          2302:        uint            subnum;
        !          2303:        sbbs_t*         sbbs;
        !          2304: 
        !          2305:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2306:                return(JS_FALSE);
        !          2307: 
        !          2308:        subnum=get_subnum(cx,sbbs,argv[0]);
        !          2309: 
        !          2310:        if(subnum>=sbbs->cfg.total_subs) {      // invalid sub-board
        !          2311:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          2312:                return(JS_TRUE);
        !          2313:        }
        !          2314: 
        !          2315:        if(argc>1 && JSVAL_IS_NUMBER(argv[1]))
        !          2316:                JS_ValueToInt32(cx,argv[1],(int32*)&mode);
        !          2317: 
        !          2318:        *rval = BOOLEAN_TO_JSVAL(sbbs->postmsg(subnum,NULL,mode));
        !          2319:        return(JS_TRUE);
        !          2320: }
        !          2321: 
        !          2322: static JSBool
        !          2323: js_msgscan_cfg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2324: {
        !          2325:        long            mode=SUB_CFG_NSCAN;
        !          2326:        sbbs_t*         sbbs;
        !          2327: 
        !          2328:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2329:                return(JS_FALSE);
        !          2330: 
        !          2331:        if(argc && JSVAL_IS_NUMBER(argv[0]))
        !          2332:                JS_ValueToInt32(cx,argv[0],(int32*)&mode);
        !          2333: 
        !          2334:        sbbs->new_scan_cfg(mode);
        !          2335: 
        !          2336:        *rval = JSVAL_VOID;
        !          2337:        return(JS_TRUE);
        !          2338: }
        !          2339: 
        !          2340: 
        !          2341: static JSBool
        !          2342: js_msgscan_ptrs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2343: {
        !          2344:        sbbs_t*         sbbs;
        !          2345: 
        !          2346:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2347:                return(JS_FALSE);
        !          2348: 
        !          2349:        sbbs->new_scan_ptr_cfg();
        !          2350: 
        !          2351:        *rval = JSVAL_VOID;
        !          2352:        return(JS_TRUE);
        !          2353: }
        !          2354: 
        !          2355: static JSBool
        !          2356: js_msgscan_reinit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2357: {
        !          2358:        sbbs_t*         sbbs;
        !          2359: 
        !          2360:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2361:                return(JS_FALSE);
        !          2362: 
        !          2363:        for(uint i=0;i<sbbs->cfg.total_subs;i++) {
        !          2364:                sbbs->subscan[i].ptr=sbbs->subscan[i].sav_ptr;
        !          2365:                sbbs->subscan[i].last=sbbs->subscan[i].sav_last; 
        !          2366:        }
        !          2367:        sbbs->bputs(sbbs->text[MsgPtrsInitialized]);
        !          2368: 
        !          2369:        *rval = JSVAL_VOID;
        !          2370:        return(JS_TRUE);
        !          2371: }
        !          2372: 
        !          2373: static JSBool
        !          2374: js_scansubs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2375: {
        !          2376:        long            mode=SCAN_NEW;
        !          2377:        BOOL            all=FALSE;
        !          2378:        sbbs_t*         sbbs;
        !          2379: 
        !          2380:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2381:                return(JS_FALSE);
        !          2382: 
        !          2383:        for(uintN i=0;i<argc;i++) {
        !          2384:                if(JSVAL_IS_NUMBER(argv[i]))
        !          2385:                        JS_ValueToInt32(cx,argv[i],(int32*)&mode);
        !          2386:                else if(JSVAL_IS_BOOLEAN(argv[i]))
        !          2387:                        all=JSVAL_TO_BOOLEAN(argv[i]);
        !          2388:        }
        !          2389: 
        !          2390:        if(all)
        !          2391:                sbbs->scanallsubs(mode);
        !          2392:        else
        !          2393:                sbbs->scansubs(mode);
        !          2394: 
        !          2395:        *rval = JSVAL_VOID;
        !          2396:        return(JS_TRUE);
        !          2397: }
        !          2398: 
        !          2399: static JSBool
        !          2400: js_scandirs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2401: {
        !          2402:        long            mode=0;
        !          2403:        BOOL            all=FALSE;
        !          2404:        sbbs_t*         sbbs;
        !          2405: 
        !          2406:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2407:                return(JS_FALSE);
        !          2408: 
        !          2409:        for(uintN i=0;i<argc;i++) {
        !          2410:                if(JSVAL_IS_NUMBER(argv[i]))
        !          2411:                        JS_ValueToInt32(cx,argv[i],(int32*)&mode);
        !          2412:                else if(JSVAL_IS_BOOLEAN(argv[i]))
        !          2413:                        all=JSVAL_TO_BOOLEAN(argv[i]);
        !          2414:        }
        !          2415: 
        !          2416:        if(all)
        !          2417:                sbbs->scanalldirs(mode);
        !          2418:        else
        !          2419:                sbbs->scandirs(mode);
        !          2420: 
        !          2421:        *rval = JSVAL_VOID;
        !          2422:        return(JS_TRUE);
        !          2423: }
        !          2424: 
        !          2425: static JSBool
        !          2426: js_scanposts(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2427: {
        !          2428:        char*           find="";
        !          2429:        long            mode=0;
        !          2430:        uint            subnum;
        !          2431:        sbbs_t*         sbbs;
        !          2432: 
        !          2433:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2434:                return(JS_FALSE);
        !          2435: 
        !          2436:        subnum=get_subnum(cx,sbbs,argv[0]);
        !          2437: 
        !          2438:        if(subnum>=sbbs->cfg.total_subs) {      // invalid sub-board
        !          2439:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !          2440:                return(JS_TRUE);
        !          2441:        }
        !          2442: 
        !          2443:        for(uintN i=1;i<argc;i++) {
        !          2444:                if(JSVAL_IS_NUMBER(argv[i]))
        !          2445:                        JS_ValueToInt32(cx,argv[i],(int32*)&mode);
        !          2446:                else if(JSVAL_IS_STRING(argv[i]))
        !          2447:                        find=JS_GetStringBytes(JS_ValueToString(cx,argv[i]));
        !          2448:        }
        !          2449: 
        !          2450:        *rval = BOOLEAN_TO_JSVAL(sbbs->scanposts(subnum,mode,find)==0);
        !          2451:        return(JS_TRUE);
        !          2452: }
        !          2453: 
        !          2454: static JSBool
        !          2455: js_getnstime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2456: {
        !          2457:        time_t          t=time(NULL);
        !          2458:        sbbs_t*         sbbs;
        !          2459: 
        !          2460:        *rval = JSVAL_VOID;
        !          2461: 
        !          2462:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2463:                return(JS_FALSE);
        !          2464: 
        !          2465:        if(argc)
        !          2466:                JS_ValueToInt32(cx,argv[0],(int32*)&t);
        !          2467: 
        !          2468:        if(sbbs->inputnstime(&t)==true)
        !          2469:                JS_NewNumberValue(cx,t,rval);
        !          2470: 
        !          2471:        return(JS_TRUE);
        !          2472: }
        !          2473: 
        !          2474: static JSBool
        !          2475: js_select_shell(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2476: {
        !          2477:        sbbs_t*         sbbs;
        !          2478: 
        !          2479:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2480:                return(JS_FALSE);
        !          2481: 
        !          2482:        *rval = BOOLEAN_TO_JSVAL(sbbs->select_shell());
        !          2483:        return(JS_TRUE);
        !          2484: }
        !          2485: 
        !          2486: static JSBool
        !          2487: js_select_editor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          2488: {
        !          2489:        sbbs_t*         sbbs;
        !          2490: 
        !          2491:        if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
        !          2492:                return(JS_FALSE);
        !          2493: 
        !          2494:        *rval = BOOLEAN_TO_JSVAL(sbbs->select_editor());
        !          2495:        return(JS_TRUE);
        !          2496: }
        !          2497: 
        !          2498: static jsSyncMethodSpec js_bbs_functions[] = {
        !          2499:        {"atcode",                      js_atcode,                      1,      JSTYPE_STRING,  JSDOCSTR("string code")
        !          2500:        ,JSDOCSTR("returns @-code value, specified <i>code</i> string does not include @ character delimiters")
        !          2501:        ,310
        !          2502:        },
        !          2503:        /* text.dat */
        !          2504:        {"text",                        js_text,                        1,      JSTYPE_STRING,  JSDOCSTR("number line")
        !          2505:        ,JSDOCSTR("returns specified text string from text.dat")
        !          2506:        ,310
        !          2507:        },
        !          2508:        {"replace_text",        js_replace_text,        2,      JSTYPE_BOOLEAN, JSDOCSTR("number line, string text")
        !          2509:        ,JSDOCSTR("replaces specified text string in memory")
        !          2510:        ,310
        !          2511:        },
        !          2512:        {"revert_text",         js_revert_text,         1,      JSTYPE_BOOLEAN, JSDOCSTR("[number line]")
        !          2513:        ,JSDOCSTR("reverts specified text string to original text string; "
        !          2514:                "if <i>line</i> unspecified, reverts all text lines")
        !          2515:        ,310
        !          2516:        },
        !          2517:        {"load_text",           js_load_text,           1,      JSTYPE_BOOLEAN, JSDOCSTR("string basefilename")
        !          2518:        ,JSDOCSTR("load an alternate text.dat from ctrl directory, automatically appends '.dat' to basefilename")
        !          2519:        ,310
        !          2520:        },
        !          2521:        /* procedures */
        !          2522:        {"newuser",                     js_newuser,                     0,      JSTYPE_VOID,    ""
        !          2523:        ,JSDOCSTR("interactive new user procedure")
        !          2524:        ,310
        !          2525:        },
        !          2526:        {"login",                       js_login,                       2,      JSTYPE_BOOLEAN, JSDOCSTR("string username, password_prompt")
        !          2527:        ,JSDOCSTR("login with <i>username</i>, displaying <i>password_prompt</i> for password (if required)")
        !          2528:        ,310
        !          2529:        },
        !          2530:        {"logon",                       js_logon,                       0,      JSTYPE_BOOLEAN, ""
        !          2531:        ,JSDOCSTR("interactive logon procedure")
        !          2532:        ,310
        !          2533:        },
        !          2534:        {"logoff",                      js_logoff,                      0,      JSTYPE_VOID,    ""
        !          2535:        ,JSDOCSTR("interactive logoff procedure")
        !          2536:        ,310
        !          2537:        },
        !          2538:        {"logout",                      js_logout,                      0,      JSTYPE_VOID,    ""
        !          2539:        ,JSDOCSTR("non-interactive logout procedure")
        !          2540:        ,310
        !          2541:        },
        !          2542:        {"hangup",                      js_hangup,                      0,      JSTYPE_VOID,    ""
        !          2543:        ,JSDOCSTR("hangup (disconnect) immediately")
        !          2544:        ,310
        !          2545:        },
        !          2546:        {"node_sync",           js_nodesync,            0,      JSTYPE_ALIAS },
        !          2547:        {"nodesync",            js_nodesync,            0,      JSTYPE_VOID,    ""
        !          2548:        ,JSDOCSTR("synchronize with node database, checks for messages, interruption, etc. (AKA node_sync)")
        !          2549:        ,310
        !          2550:        },
        !          2551:        {"auto_msg",            js_automsg,                     0,      JSTYPE_VOID,    ""
        !          2552:        ,JSDOCSTR("read/create system's auto-message")
        !          2553:        ,310
        !          2554:        },              
        !          2555:        {"time_bank",           js_time_bank,           0,      JSTYPE_VOID,    ""
        !          2556:        ,JSDOCSTR("enter the time banking system")
        !          2557:        ,310
        !          2558:        },              
        !          2559:        {"qwk_sec",                     js_qwk_sec,                     0,      JSTYPE_VOID,    ""
        !          2560:        ,JSDOCSTR("enter the QWK message packet upload/download/config section")
        !          2561:        ,310
        !          2562:        },              
        !          2563:        {"text_sec",            js_text_sec,            0,      JSTYPE_VOID,    ""
        !          2564:        ,JSDOCSTR("enter the text files section")
        !          2565:        ,310
        !          2566:        },              
        !          2567:        {"xtrn_sec",            js_xtrn_sec,            0,      JSTYPE_VOID,    ""
        !          2568:        ,JSDOCSTR("enter the external programs section")
        !          2569:        ,310
        !          2570:        },              
        !          2571:        {"xfer_policy",         js_xfer_policy,         0,      JSTYPE_VOID,    ""
        !          2572:        ,JSDOCSTR("display the file transfer policy")
        !          2573:        ,310
        !          2574:        },              
        !          2575:        {"batch_menu",          js_batchmenu,           0,      JSTYPE_VOID,    ""
        !          2576:        ,JSDOCSTR("enter the batch file transfer menu")
        !          2577:        ,310
        !          2578:        },              
        !          2579:        {"batch_download",      js_batchdownload,       0,      JSTYPE_BOOLEAN, ""
        !          2580:        ,JSDOCSTR("start a batch download")
        !          2581:        ,310
        !          2582:        },              
        !          2583:        {"batch_add_list",      js_batchaddlist,        1,      JSTYPE_VOID,    JSDOCSTR("filename")
        !          2584:        ,JSDOCSTR("add file list to batch download queue")
        !          2585:        ,310
        !          2586:        },              
        !          2587:        {"temp_xfer",           js_temp_xfer,           0,      JSTYPE_VOID,    ""
        !          2588:        ,JSDOCSTR("enter the temporary file tranfer menu")
        !          2589:        ,310
        !          2590:        },              
        !          2591:        {"user_sync",           js_user_sync,           0,      JSTYPE_VOID,    ""
        !          2592:        ,JSDOCSTR("read the current user data from the database")
        !          2593:        ,310
        !          2594:        },              
        !          2595:        {"user_config",         js_user_config,         0,      JSTYPE_VOID,    ""
        !          2596:        ,JSDOCSTR("enter the user settings configuration menu")
        !          2597:        ,310
        !          2598:        },              
        !          2599:        {"sys_info",            js_sys_info,            0,      JSTYPE_VOID,    ""
        !          2600:        ,JSDOCSTR("display system information")
        !          2601:        ,310
        !          2602:        },              
        !          2603:        {"sub_info",            js_sub_info,            1,      JSTYPE_VOID,    JSDOCSTR("[subboard]")
        !          2604:        ,JSDOCSTR("display message sub-board information (current <i>subboard</i>, if unspecified)")
        !          2605:        ,310
        !          2606:        },              
        !          2607:        {"dir_info",            js_dir_info,            0,      JSTYPE_VOID,    JSDOCSTR("[directory]")
        !          2608:        ,JSDOCSTR("display file directory information (current <i>directory</i>, if unspecified)")
        !          2609:        ,310
        !          2610:        },              
        !          2611:        {"user_info",           js_user_info,           0,      JSTYPE_VOID,    ""
        !          2612:        ,JSDOCSTR("display current user information")
        !          2613:        ,310
        !          2614:        },              
        !          2615:        {"ver",                         js_ver,                         0,      JSTYPE_VOID,    ""
        !          2616:        ,JSDOCSTR("display software version information")
        !          2617:        ,310
        !          2618:        },              
        !          2619:        {"sys_stats",           js_sys_stats,           0,      JSTYPE_VOID,    ""
        !          2620:        ,JSDOCSTR("display system statistics")
        !          2621:        ,310
        !          2622:        },              
        !          2623:        {"node_stats",          js_node_stats,          0,      JSTYPE_VOID,    ""
        !          2624:        ,JSDOCSTR("display current node statistics")
        !          2625:        ,310
        !          2626:        },              
        !          2627:        {"list_users",          js_userlist,            0,      JSTYPE_VOID,    ""
        !          2628:        ,JSDOCSTR("display user list")
        !          2629:        ,310
        !          2630:        },              
        !          2631:        {"edit_user",           js_useredit,            0,      JSTYPE_VOID,    ""
        !          2632:        ,JSDOCSTR("enter the user editor")
        !          2633:        ,310
        !          2634:        },              
        !          2635:        {"change_user",         js_change_user,         0,      JSTYPE_VOID,    ""
        !          2636:        ,JSDOCSTR("change to a different user")
        !          2637:        ,310
        !          2638:        },              
        !          2639:        {"list_logons",         js_logonlist,           0,      JSTYPE_VOID,    ""
        !          2640:        ,JSDOCSTR("display the logon list")
        !          2641:        ,310
        !          2642:        },              
        !          2643:        {"read_mail",           js_readmail,            0,      JSTYPE_VOID,    ""
        !          2644:        ,JSDOCSTR("read private e-mail")
        !          2645:        ,310
        !          2646:        },              
        !          2647:        {"email",                       js_email,                       1,      JSTYPE_BOOLEAN, JSDOCSTR("number user [,number mode] [,string top] [,string subject]")
        !          2648:        ,JSDOCSTR("send private e-mail or netmail")
        !          2649:        ,310
        !          2650:        },              
        !          2651:        {"netmail",                     js_netmail,                     1,      JSTYPE_BOOLEAN, JSDOCSTR("string address [,number mode] [,string subject]")
        !          2652:        ,JSDOCSTR("send private netmail")
        !          2653:        ,310
        !          2654:        },              
        !          2655:        {"bulk_mail",           js_bulkmail,            0,      JSTYPE_VOID,    JSDOCSTR("[ars]")
        !          2656:        ,JSDOCSTR("send bulk private e-mail")
        !          2657:        ,310
        !          2658:        },              
        !          2659:        {"upload_file",         js_upload_file,         1,      JSTYPE_BOOLEAN, JSDOCSTR("directory")
        !          2660:        ,JSDOCSTR("upload file to file directory specified by number or internal code")
        !          2661:        ,310
        !          2662:        },              
        !          2663:        {"bulk_upload",         js_bulkupload,          1,      JSTYPE_BOOLEAN, JSDOCSTR("directory")
        !          2664:        ,JSDOCSTR("add files (already in local storage path) to file directory "
        !          2665:                "specified by number or internal code")
        !          2666:        ,310
        !          2667:        },              
        !          2668:        {"resort_dir",          js_resort_dir,          1,      JSTYPE_BOOLEAN, JSDOCSTR("directory")
        !          2669:        ,JSDOCSTR("re-sort the file directory specified by number or internal code)")
        !          2670:        ,310
        !          2671:        },              
        !          2672:        {"list_files",          js_listfiles,           1,      JSTYPE_NUMBER,  JSDOCSTR("directory [,string filespec] [,number mode]")
        !          2673:        ,JSDOCSTR("list files in the specified file directory, "
        !          2674:                "optionally specifying a file specification (wildcards) and <i>mode</i> (bitfield)")
        !          2675:        ,310
        !          2676:        },              
        !          2677:        {"list_file_info",      js_listfileinfo,        1,      JSTYPE_NUMBER,  JSDOCSTR("directory [,string filespec] [,number mode]")
        !          2678:        ,JSDOCSTR("list extended file information for files in the specified file directory")
        !          2679:        ,310
        !          2680:        },              
        !          2681:        {"post_msg",            js_postmsg,                     1,      JSTYPE_BOOLEAN, JSDOCSTR("sub-board [,number mode]")
        !          2682:        ,JSDOCSTR("post a message in the specified message sub-board (number or internal code) "
        !          2683:                "with optinal <i>mode</i> (bitfield)")
        !          2684:        ,310
        !          2685:        },              
        !          2686:        {"cfg_msg_scan",        js_msgscan_cfg,         0,      JSTYPE_VOID,    JSDOCSTR("[number type]")
        !          2687:        ,JSDOCSTR("configure message scan "
        !          2688:                "(<i>type</i> is either <tt>SCAN_CFG_NEW</tt> or <tt>SCAN_CFG_TOYOU</tt>)")
        !          2689:        ,310
        !          2690:        },              
        !          2691:        {"cfg_msg_ptrs",        js_msgscan_ptrs,        0,      JSTYPE_VOID,    JSDOCSTR("[number type]")
        !          2692:        ,JSDOCSTR("change message scan pointer values "
        !          2693:                "(<i>type</i> is either <tt>SCAN_CFG_NEW</tt> or <tt>SCAN_CFG_TOYOU</tt>)")
        !          2694:        ,310
        !          2695:        },              
        !          2696:        {"reinit_msg_ptrs",     js_msgscan_reinit,      0,      JSTYPE_VOID,    ""
        !          2697:        ,JSDOCSTR("re-initialize new message scan pointers")
        !          2698:        ,310
        !          2699:        },              
        !          2700:        {"scan_subs",           js_scansubs,            0,      JSTYPE_VOID,    JSDOCSTR("[number mode, boolean all]")
        !          2701:        ,JSDOCSTR("scan sub-boards for messages")
        !          2702:        ,310
        !          2703:        },              
        !          2704:        {"scan_dirs",           js_scandirs,            0,      JSTYPE_VOID,    JSDOCSTR("[number mode, boolean all]")
        !          2705:        ,JSDOCSTR("scan directories for files")
        !          2706:        ,310
        !          2707:        },              
        !          2708:        {"scan_posts",          js_scanposts,           1,      JSTYPE_BOOLEAN, JSDOCSTR("[sub-board, number mode, string find]")
        !          2709:        ,JSDOCSTR("scan posts in the specified message sub-board (number or internal code), "
        !          2710:                "optionally search for 'find' string")
        !          2711:        ,310
        !          2712:        },              
        !          2713:        /* menuing */
        !          2714:        {"menu",                        js_menu,                        1,      JSTYPE_VOID,    JSDOCSTR("base_filename")
        !          2715:        ,JSDOCSTR("display a menu file from the text/menu directory")
        !          2716:        ,310
        !          2717:        },              
        !          2718:        {"log_key",                     js_logkey,                      1,      JSTYPE_BOOLEAN, JSDOCSTR("key [,boolean comma]")
        !          2719:        ,JSDOCSTR("log key to node.log (comma optional)")
        !          2720:        ,310
        !          2721:        },              
        !          2722:        {"log_str",                     js_logstr,                      1,      JSTYPE_BOOLEAN, JSDOCSTR("text")
        !          2723:        ,JSDOCSTR("log string to node.log")
        !          2724:        ,310
        !          2725:        },              
        !          2726:        /* users */
        !          2727:        {"finduser",            js_finduser,            1,      JSTYPE_NUMBER,  JSDOCSTR("username_or_number")
        !          2728:        ,JSDOCSTR("find user name (partial name support), interactive")
        !          2729:        ,310
        !          2730:        },              
        !          2731:        {"trashcan",            js_trashcan,            2,      JSTYPE_BOOLEAN, JSDOCSTR("base_filename, search_string")
        !          2732:        ,JSDOCSTR("search file for psuedo-regexp (search string) in trashcan file (text/base_filename.can)")
        !          2733:        ,310
        !          2734:        },              
        !          2735:        /* xtrn programs/modules */
        !          2736:        {"exec",                        js_exec,                        2,      JSTYPE_NUMBER,  JSDOCSTR("cmdline [,number mode] [,string startup_dir]")
        !          2737:        ,JSDOCSTR("execute a program, optionally changing current directory to <i>startup_dir</i> "
        !          2738:        "(see <tt>EX_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> bits)")
        !          2739:        ,310
        !          2740:        },              
        !          2741:        {"exec_xtrn",           js_exec_xtrn,           1,      JSTYPE_BOOLEAN, JSDOCSTR("xtrn_number_or_code")
        !          2742:        ,JSDOCSTR("execute external program by internal code")
        !          2743:        ,310
        !          2744:        },              
        !          2745:        {"user_event",          js_user_event,          1,      JSTYPE_BOOLEAN, JSDOCSTR("number event_type")
        !          2746:        ,JSDOCSTR("execute user event by event type "
        !          2747:        "(see <tt>EVENT_*</tt> in <tt>sbbsdefs.js</tt> for valid values)")
        !          2748:        ,310
        !          2749:        },              
        !          2750:        {"telnet_gate",         js_telnet_gate,         1,      JSTYPE_VOID,    JSDOCSTR("string address [,number mode]")
        !          2751:        ,JSDOCSTR("external telnet gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> bits)")
        !          2752:        ,310
        !          2753:        },              
        !          2754:        /* security */
        !          2755:        {"check_syspass",       js_chksyspass,          0,      JSTYPE_BOOLEAN, ""
        !          2756:        ,JSDOCSTR("prompt for and verify system password")
        !          2757:        ,310
        !          2758:        },
        !          2759:        {"good_password",       js_chkpass,                     1,      JSTYPE_STRING,  JSDOCSTR("string password")
        !          2760:        ,JSDOCSTR("check if requested user password meets minimum password requirements "
        !          2761:                "(length, uniqueness, etc.)")
        !          2762:        ,310
        !          2763:        },
        !          2764:        /* chat/node stuff */
        !          2765:        {"page_sysop",          js_pagesysop,           0,      JSTYPE_BOOLEAN, ""
        !          2766:        ,JSDOCSTR("page the sysop for chat")
        !          2767:        ,310
        !          2768:        },              
        !          2769:        {"page_guru",           js_pageguru,            0,      JSTYPE_BOOLEAN, ""
        !          2770:        ,JSDOCSTR("page the guru for chat")
        !          2771:        ,310
        !          2772:        },              
        !          2773:        {"multinode_chat",      js_multinode_chat,      0,      JSTYPE_VOID,    ""
        !          2774:        ,JSDOCSTR("enter multi-node chat")
        !          2775:        ,310
        !          2776:        },              
        !          2777:        {"private_message",     js_private_message,     0,      JSTYPE_VOID,    ""
        !          2778:        ,JSDOCSTR("use the private inter-node message prompt")
        !          2779:        ,310
        !          2780:        },              
        !          2781:        {"private_chat",        js_private_chat,        0,      JSTYPE_VOID,    ""
        !          2782:        ,JSDOCSTR("enter private inter-node chat")
        !          2783:        ,310
        !          2784:        },              
        !          2785:        {"get_node_message",js_get_node_message,0,      JSTYPE_VOID,    ""
        !          2786:        ,JSDOCSTR("receive and display an inter-node message")
        !          2787:        ,310
        !          2788:        },              
        !          2789:        {"put_node_message",js_put_node_message,2,      JSTYPE_BOOLEAN, JSDOCSTR("number node, string text")
        !          2790:        ,JSDOCSTR("send an inter-node message")
        !          2791:        ,310
        !          2792:        },              
        !          2793:        {"get_telegram",        js_get_telegram,        1,      JSTYPE_VOID,    JSDOCSTR("[number usernum]")
        !          2794:        ,JSDOCSTR("receive and display a telegram")
        !          2795:        ,310
        !          2796:        },              
        !          2797:        {"put_telegram",        js_put_telegram,        2,      JSTYPE_BOOLEAN, JSDOCSTR("number user, string text")
        !          2798:        ,JSDOCSTR("send a telegram to a user")
        !          2799:        ,310
        !          2800:        },              
        !          2801:        {"list_nodes",          js_nodelist,            0,      JSTYPE_VOID,    ""
        !          2802:        ,JSDOCSTR("list all nodes")
        !          2803:        ,310
        !          2804:        },              
        !          2805:        {"whos_online",         js_whos_online,         0,      JSTYPE_VOID,    ""
        !          2806:        ,JSDOCSTR("list active nodes only (who's online)")
        !          2807:        ,310
        !          2808:        },              
        !          2809:        {"spy",                         js_spy,                         1,      JSTYPE_VOID,    JSDOCSTR("node_number")
        !          2810:        ,JSDOCSTR("spy on a node")
        !          2811:        ,310
        !          2812:        },              
        !          2813:        /* misc */
        !          2814:        {"cmdstr",                      js_cmdstr,                      1,      JSTYPE_STRING,  JSDOCSTR("string str [,string fpath] [,string fspec]")
        !          2815:        ,JSDOCSTR("return expanded command string using Synchronet command-line specifiers")
        !          2816:        ,310
        !          2817:        },              
        !          2818:        /* input */
        !          2819:        {"get_filespec",        js_getfilespec,         0,      JSTYPE_STRING,  ""      
        !          2820:        ,JSDOCSTR("returns a file specification input by the user (optionally with wildcards)")
        !          2821:        ,310
        !          2822:        },              
        !          2823:        {"get_newscantime",     js_getnstime,           1,      JSTYPE_NUMBER,  JSDOCSTR("number time")
        !          2824:        ,JSDOCSTR("confirm or change newscan time, returns new newscan time value (time_t format)")
        !          2825:        ,310
        !          2826:        },              
        !          2827:        {"select_shell",        js_select_shell,        0,      JSTYPE_BOOLEAN, ""
        !          2828:        ,JSDOCSTR("prompt user to select a new command shell")
        !          2829:        ,310
        !          2830:        },
        !          2831:        {"select_editor",       js_select_editor,       0,      JSTYPE_BOOLEAN, ""
        !          2832:        ,JSDOCSTR("prompt user to select a new external message editor")
        !          2833:        ,310
        !          2834:        },
        !          2835:        {0}
        !          2836: };
        !          2837: 
        !          2838: 
        !          2839: static JSClass js_bbs_class = {
        !          2840:      "BBS"                                     /* name                 */
        !          2841:     ,0                                         /* flags                */
        !          2842:        ,JS_PropertyStub                /* addProperty  */
        !          2843:        ,JS_PropertyStub                /* delProperty  */
        !          2844:        ,js_bbs_get                             /* getProperty  */
        !          2845:        ,js_bbs_set                             /* setProperty  */
        !          2846:        ,JS_EnumerateStub               /* enumerate    */
        !          2847:        ,JS_ResolveStub                 /* resolve              */
        !          2848:        ,JS_ConvertStub                 /* convert              */
        !          2849:        ,JS_FinalizeStub                /* finalize             */
        !          2850: };
        !          2851: 
        !          2852: JSObject* js_CreateBbsObject(JSContext* cx, JSObject* parent)
        !          2853: {
        !          2854:        JSObject* obj;
        !          2855:        JSObject* mods;
        !          2856: 
        !          2857:        obj = JS_DefineObject(cx, parent, "bbs", &js_bbs_class, NULL
        !          2858:                ,JSPROP_ENUMERATE|JSPROP_READONLY);
        !          2859: 
        !          2860:        if(obj==NULL)
        !          2861:                return(NULL);
        !          2862: 
        !          2863:        if(!js_DefineSyncProperties(cx, obj, js_bbs_properties))
        !          2864:                return(NULL);
        !          2865: 
        !          2866:        if (!js_DefineSyncMethods(cx, obj, js_bbs_functions, FALSE)) 
        !          2867:                return(NULL);
        !          2868: 
        !          2869:        if((mods=JS_DefineObject(cx, obj, "mods", NULL, NULL ,JSPROP_ENUMERATE))==NULL)
        !          2870:                return(NULL);
        !          2871: 
        !          2872: #ifdef _DEBUG
        !          2873:        js_DescribeSyncObject(cx,mods,"Global repository for 3rd party modifications",312);
        !          2874:        js_DescribeSyncObject(cx,obj,"Controls the Telnet/RLogin BBS experience",310);
        !          2875:        js_CreateArrayOfStrings(cx, obj, "_property_desc_list", bbs_prop_desc, JSPROP_READONLY);
        !          2876: #endif
        !          2877: 
        !          2878:        return(obj);
        !          2879: }
        !          2880: 
        !          2881: #endif /* JAVSCRIPT */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.