Annotation of sbbs/src/sbbs3/js_system.c, revision 1.1

1.1     ! root        1: /* js_system.c */
        !             2: 
        !             3: /* Synchronet JavaScript "system" Object */
        !             4: 
        !             5: /* $Id: js_system.c,v 1.107 2006/06/15 03:20:00 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 2006 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: /* System Object Properites */
        !            43: enum {
        !            44:         SYS_PROP_NAME
        !            45:        ,SYS_PROP_OP
        !            46:        ,SYS_PROP_ID
        !            47:        ,SYS_PROP_MISC
        !            48:        ,SYS_PROP_PSNAME
        !            49:        ,SYS_PROP_PSNUM
        !            50:        ,SYS_PROP_INETADDR
        !            51:        ,SYS_PROP_LOCATION
        !            52:        ,SYS_PROP_TIMEZONE
        !            53:        ,SYS_PROP_PWDAYS
        !            54:        ,SYS_PROP_DELDAYS
        !            55: 
        !            56:        ,SYS_PROP_LASTUSER
        !            57:        ,SYS_PROP_LASTUSERON
        !            58:        ,SYS_PROP_FREEDISKSPACE
        !            59:        ,SYS_PROP_FREEDISKSPACEK
        !            60: 
        !            61:        ,SYS_PROP_NODES
        !            62:        ,SYS_PROP_LASTNODE
        !            63: 
        !            64:        ,SYS_PROP_NEW_PASS
        !            65:        ,SYS_PROP_NEW_MAGIC
        !            66:        ,SYS_PROP_NEW_LEVEL
        !            67:        ,SYS_PROP_NEW_FLAGS1
        !            68:        ,SYS_PROP_NEW_FLAGS2
        !            69:        ,SYS_PROP_NEW_FLAGS3
        !            70:        ,SYS_PROP_NEW_FLAGS4
        !            71:        ,SYS_PROP_NEW_REST
        !            72:        ,SYS_PROP_NEW_EXEMPT
        !            73:        ,SYS_PROP_NEW_CDT
        !            74:        ,SYS_PROP_NEW_MIN
        !            75:        ,SYS_PROP_NEW_SHELL
        !            76:        ,SYS_PROP_NEW_XEDIT
        !            77:        ,SYS_PROP_NEW_MISC
        !            78:        ,SYS_PROP_NEW_PROT
        !            79:        ,SYS_PROP_NEW_EXPIRE
        !            80:        ,SYS_PROP_NEW_UQ
        !            81: 
        !            82:        ,SYS_PROP_EXPIRED_LEVEL
        !            83:        ,SYS_PROP_EXPIRED_FLAGS1
        !            84:        ,SYS_PROP_EXPIRED_FLAGS2
        !            85:        ,SYS_PROP_EXPIRED_FLAGS3
        !            86:        ,SYS_PROP_EXPIRED_FLAGS4
        !            87:        ,SYS_PROP_EXPIRED_REST
        !            88:        ,SYS_PROP_EXPIRED_EXEMPT
        !            89: 
        !            90:        /* directories */
        !            91:        ,SYS_PROP_NODE_DIR
        !            92:        ,SYS_PROP_CTRL_DIR
        !            93:        ,SYS_PROP_DATA_DIR
        !            94:        ,SYS_PROP_TEXT_DIR
        !            95:        ,SYS_PROP_TEMP_DIR
        !            96:        ,SYS_PROP_EXEC_DIR
        !            97:        ,SYS_PROP_MODS_DIR
        !            98:        ,SYS_PROP_LOGS_DIR
        !            99: 
        !           100:        /* msclock() access */
        !           101:        ,SYS_PROP_CLOCK
        !           102:        ,SYS_PROP_CLOCK_PER_SEC
        !           103:        ,SYS_PROP_TIMER
        !           104: 
        !           105:        /* filenames */
        !           106:        ,SYS_PROP_DEVNULL
        !           107:        ,SYS_PROP_TEMP_PATH
        !           108:        ,SYS_PROP_CMD_SHELL
        !           109: 
        !           110:        /* last */
        !           111:        ,SYS_PROP_LOCAL_HOSTNAME
        !           112: };
        !           113: 
        !           114: static JSBool js_system_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
        !           115: {
        !           116:        char            str[128];
        !           117:        char*           p=NULL;
        !           118:     jsint       tiny;
        !           119:        JSString*       js_str;
        !           120:        ulong           val;
        !           121:        scfg_t*         cfg;
        !           122: 
        !           123:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !           124:                return(JS_FALSE);
        !           125: 
        !           126:     tiny = JSVAL_TO_INT(id);
        !           127: 
        !           128:        switch(tiny) {
        !           129:                case SYS_PROP_NAME:
        !           130:                p=cfg->sys_name;
        !           131:                        break;
        !           132:                case SYS_PROP_OP:
        !           133:                        p=cfg->sys_op;
        !           134:                        break;
        !           135:                case SYS_PROP_ID:
        !           136:                        p=cfg->sys_id;
        !           137:                        break;
        !           138:                case SYS_PROP_MISC:
        !           139:                        JS_NewNumberValue(cx,cfg->sys_misc,vp);
        !           140:                        break;
        !           141:                case SYS_PROP_PSNAME:
        !           142:                        p=cfg->sys_psname;
        !           143:                        break;
        !           144:                case SYS_PROP_PSNUM:
        !           145:                        *vp = INT_TO_JSVAL(cfg->sys_psnum);
        !           146:                        break;
        !           147:                case SYS_PROP_INETADDR:
        !           148:                        p=cfg->sys_inetaddr;
        !           149:                        break;
        !           150:                case SYS_PROP_LOCATION:
        !           151:                        p=cfg->sys_location;
        !           152:                        break;
        !           153:                case SYS_PROP_TIMEZONE:
        !           154:                        sys_timezone(cfg);
        !           155:                        *vp = INT_TO_JSVAL(cfg->sys_timezone);
        !           156:                        break;
        !           157:                case SYS_PROP_NODES:
        !           158:                        *vp = INT_TO_JSVAL(cfg->sys_nodes);
        !           159:                        break;
        !           160:                case SYS_PROP_LASTNODE:
        !           161:                        *vp = INT_TO_JSVAL(cfg->sys_lastnode);
        !           162:                        break;
        !           163:                case SYS_PROP_PWDAYS:
        !           164:                        *vp = INT_TO_JSVAL(cfg->sys_pwdays);
        !           165:                        break;
        !           166:                case SYS_PROP_DELDAYS:
        !           167:                        *vp = INT_TO_JSVAL(cfg->sys_deldays);
        !           168:                        break;
        !           169:                case SYS_PROP_LASTUSER:
        !           170:                        *vp = INT_TO_JSVAL(lastuser(cfg));
        !           171:                        break;
        !           172:                case SYS_PROP_LASTUSERON:
        !           173:                        p=lastuseron;
        !           174:                        break;
        !           175:                case SYS_PROP_FREEDISKSPACE:
        !           176:                case SYS_PROP_FREEDISKSPACEK:
        !           177:                        if(tiny==SYS_PROP_FREEDISKSPACE)
        !           178:                                val = getfreediskspace(cfg->temp_dir,0);
        !           179:                        else
        !           180:                                val = getfreediskspace(cfg->temp_dir,1024);
        !           181:                        JS_NewNumberValue(cx,val,vp);
        !           182:                        break;
        !           183: 
        !           184:                case SYS_PROP_NEW_PASS:
        !           185:                        p=cfg->new_pass;
        !           186:                        break;
        !           187:                case SYS_PROP_NEW_MAGIC:
        !           188:                        p=cfg->new_magic;
        !           189:                        break;
        !           190:                case SYS_PROP_NEW_LEVEL:
        !           191:                        *vp = INT_TO_JSVAL(cfg->new_level);
        !           192:                        break;
        !           193:                case SYS_PROP_NEW_FLAGS1:
        !           194:                        *vp = INT_TO_JSVAL(cfg->new_flags1);
        !           195:                        break;
        !           196:                case SYS_PROP_NEW_FLAGS2:
        !           197:                        *vp = INT_TO_JSVAL(cfg->new_flags2);
        !           198:                        break;
        !           199:                case SYS_PROP_NEW_FLAGS3:
        !           200:                        *vp = INT_TO_JSVAL(cfg->new_flags3);
        !           201:                        break;
        !           202:                case SYS_PROP_NEW_FLAGS4:
        !           203:                        *vp = INT_TO_JSVAL(cfg->new_flags4);
        !           204:                        break;
        !           205:                case SYS_PROP_NEW_REST:
        !           206:                        *vp = INT_TO_JSVAL(cfg->new_rest);
        !           207:                        break;
        !           208:                case SYS_PROP_NEW_EXEMPT:
        !           209:                        *vp = INT_TO_JSVAL(cfg->new_exempt);
        !           210:                        break;
        !           211:                case SYS_PROP_NEW_CDT:
        !           212:                        JS_NewNumberValue(cx,cfg->new_cdt,vp);
        !           213:                        break;
        !           214:                case SYS_PROP_NEW_MIN:
        !           215:                        JS_NewNumberValue(cx,cfg->new_min,vp);
        !           216:                        break;
        !           217:                case SYS_PROP_NEW_SHELL:
        !           218:                        *vp = INT_TO_JSVAL(cfg->new_shell);
        !           219:                        break;
        !           220:                case SYS_PROP_NEW_XEDIT:
        !           221:                        p=cfg->new_xedit;
        !           222:                        break;
        !           223:                case SYS_PROP_NEW_MISC:
        !           224:                        JS_NewNumberValue(cx,cfg->new_misc,vp);
        !           225:                        break;
        !           226:                case SYS_PROP_NEW_PROT:
        !           227:                        sprintf(str,"%c",cfg->new_prot);
        !           228:                        p=str;
        !           229:                        break;
        !           230:                case SYS_PROP_NEW_EXPIRE:
        !           231:                        JS_NewNumberValue(cx,cfg->new_expire,vp);
        !           232:                        break;
        !           233:                case SYS_PROP_NEW_UQ:
        !           234:                        JS_NewNumberValue(cx,cfg->uq,vp);
        !           235:                        break;
        !           236: 
        !           237:                case SYS_PROP_EXPIRED_LEVEL:
        !           238:                        *vp = INT_TO_JSVAL(cfg->expired_level);
        !           239:                        break;
        !           240:                case SYS_PROP_EXPIRED_FLAGS1:
        !           241:                        *vp = INT_TO_JSVAL(cfg->expired_flags1);
        !           242:                        break;
        !           243:                case SYS_PROP_EXPIRED_FLAGS2:
        !           244:                        *vp = INT_TO_JSVAL(cfg->expired_flags2);
        !           245:                        break;
        !           246:                case SYS_PROP_EXPIRED_FLAGS3:
        !           247:                        *vp = INT_TO_JSVAL(cfg->expired_flags3);
        !           248:                        break;
        !           249:                case SYS_PROP_EXPIRED_FLAGS4:
        !           250:                        *vp = INT_TO_JSVAL(cfg->expired_flags4);
        !           251:                        break;
        !           252:                case SYS_PROP_EXPIRED_REST:
        !           253:                        *vp = INT_TO_JSVAL(cfg->expired_rest);
        !           254:                        break;
        !           255:                case SYS_PROP_EXPIRED_EXEMPT:
        !           256:                        *vp = INT_TO_JSVAL(cfg->expired_exempt);
        !           257:                        break;
        !           258:                case SYS_PROP_NODE_DIR:
        !           259:                        p=cfg->node_dir;
        !           260:                        break;
        !           261:                case SYS_PROP_CTRL_DIR:
        !           262:                        p=cfg->ctrl_dir;
        !           263:                        break;
        !           264:                case SYS_PROP_DATA_DIR:
        !           265:                        p=cfg->data_dir;
        !           266:                        break;
        !           267:                case SYS_PROP_TEXT_DIR:
        !           268:                        p=cfg->text_dir;
        !           269:                        break;
        !           270:                case SYS_PROP_TEMP_DIR:
        !           271:                        p=cfg->temp_dir;
        !           272:                        break;
        !           273:                case SYS_PROP_EXEC_DIR:
        !           274:                        p=cfg->exec_dir;
        !           275:                        break;
        !           276:                case SYS_PROP_MODS_DIR:
        !           277:                        p=cfg->mods_dir;
        !           278:                        break;
        !           279:                case SYS_PROP_LOGS_DIR:
        !           280:                        p=cfg->logs_dir;
        !           281:                        break;
        !           282: 
        !           283:                case SYS_PROP_DEVNULL:
        !           284:                        p=_PATH_DEVNULL;
        !           285:                        break;
        !           286:                case SYS_PROP_TEMP_PATH:
        !           287:                        p=_PATH_TMP;
        !           288:                        break;
        !           289: 
        !           290:                case SYS_PROP_CMD_SHELL:
        !           291:                        p=os_cmdshell();
        !           292:                        break;
        !           293: 
        !           294:                case SYS_PROP_CLOCK:
        !           295:                        JS_NewNumberValue(cx,msclock(),vp);
        !           296:                        break;
        !           297:                case SYS_PROP_CLOCK_PER_SEC:
        !           298:                        JS_NewNumberValue(cx,MSCLOCKS_PER_SEC,vp);
        !           299:                        break;
        !           300:                case SYS_PROP_TIMER:
        !           301:                        JS_NewNumberValue(cx,xp_timer(),vp);
        !           302:                        break;
        !           303: 
        !           304:                case SYS_PROP_LOCAL_HOSTNAME:
        !           305:                        gethostname(str,sizeof(str));
        !           306:                        p=str;
        !           307:                        break;
        !           308:        }
        !           309: 
        !           310:        if(p!=NULL) {   /* string property */
        !           311:                if((js_str=JS_NewStringCopyZ(cx, p))==NULL)
        !           312:                        return(JS_FALSE);
        !           313:                *vp = STRING_TO_JSVAL(js_str);
        !           314:        }
        !           315: 
        !           316:        return(JS_TRUE);
        !           317: }
        !           318: 
        !           319: static JSBool js_system_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
        !           320: {
        !           321:     jsint       tiny;
        !           322:        scfg_t*         cfg;
        !           323: 
        !           324:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !           325:                return(JS_FALSE);
        !           326: 
        !           327:     tiny = JSVAL_TO_INT(id);
        !           328: 
        !           329:        switch(tiny) {
        !           330:                case SYS_PROP_MISC:
        !           331:                        JS_ValueToInt32(cx, *vp, (int32*)&cfg->sys_misc);
        !           332:                        break;
        !           333:        }
        !           334: 
        !           335:        return(TRUE);
        !           336: }
        !           337: 
        !           338: 
        !           339: #define SYSOBJ_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
        !           340: 
        !           341: static jsSyncPropertySpec js_system_properties[] = {
        !           342: /*              name,                                          tinyid,                         flags,                          ver     */
        !           343: 
        !           344:        {       "name",                                         SYS_PROP_NAME,          SYSOBJ_FLAGS,           310  },
        !           345:        {       "operator",                                     SYS_PROP_OP,            SYSOBJ_FLAGS,           310  },
        !           346:        {       "qwk_id",                                       SYS_PROP_ID,            SYSOBJ_FLAGS,           310  },
        !           347:        {       "settings",                                     SYS_PROP_MISC,          JSPROP_ENUMERATE,       310  },
        !           348:        {       "psname",                                       SYS_PROP_PSNAME,        SYSOBJ_FLAGS,           310  },
        !           349:        {       "psnum",                                        SYS_PROP_PSNUM,         SYSOBJ_FLAGS,           310  },
        !           350:        {       "inetaddr",                                     SYS_PROP_INETADDR,      JSPROP_READONLY,        310  }, /* alias */
        !           351:        {       "inet_addr",                            SYS_PROP_INETADDR,      SYSOBJ_FLAGS,           311  },
        !           352:        {       "location",                                     SYS_PROP_LOCATION,      SYSOBJ_FLAGS,           310  },
        !           353:        {       "timezone",                                     SYS_PROP_TIMEZONE,      SYSOBJ_FLAGS,           310  },
        !           354:        {       "pwdays",                                       SYS_PROP_PWDAYS,        SYSOBJ_FLAGS,           310  },
        !           355:        {       "deldays",                                      SYS_PROP_DELDAYS,       SYSOBJ_FLAGS,           310  },
        !           356: 
        !           357:        {       "lastuser",                                     SYS_PROP_LASTUSER               ,SYSOBJ_FLAGS,  311  },
        !           358:        {       "lastuseron",                           SYS_PROP_LASTUSERON             ,SYSOBJ_FLAGS,  310  },
        !           359:        {       "freediskspace",                        SYS_PROP_FREEDISKSPACE  ,SYSOBJ_FLAGS,  310  },
        !           360:        {       "freediskspacek",                       SYS_PROP_FREEDISKSPACEK ,SYSOBJ_FLAGS,  310  },
        !           361: 
        !           362:        {       "nodes",                                        SYS_PROP_NODES,         SYSOBJ_FLAGS,           310  },
        !           363:        {       "lastnode",                                     SYS_PROP_LASTNODE,      SYSOBJ_FLAGS,           310  },
        !           364: 
        !           365:        {       "newuser_password",                     SYS_PROP_NEW_PASS               ,SYSOBJ_FLAGS,  310  },
        !           366:        {       "newuser_magic_word",           SYS_PROP_NEW_MAGIC              ,SYSOBJ_FLAGS,  310  },
        !           367:        {       "newuser_level",                        SYS_PROP_NEW_LEVEL              ,SYSOBJ_FLAGS,  310  },
        !           368:        {       "newuser_flags1",                       SYS_PROP_NEW_FLAGS1             ,SYSOBJ_FLAGS,  310  },
        !           369:        {       "newuser_flags2",                       SYS_PROP_NEW_FLAGS2             ,SYSOBJ_FLAGS,  310  },
        !           370:        {       "newuser_flags3",                       SYS_PROP_NEW_FLAGS3             ,SYSOBJ_FLAGS,  310  },
        !           371:        {       "newuser_flags4",                       SYS_PROP_NEW_FLAGS4             ,SYSOBJ_FLAGS,  310  },
        !           372:        {       "newuser_restrictions",         SYS_PROP_NEW_REST               ,SYSOBJ_FLAGS,  310  },
        !           373:        {       "newuser_exemptions",           SYS_PROP_NEW_EXEMPT             ,SYSOBJ_FLAGS,  310  },
        !           374:        {       "newuser_credits",                      SYS_PROP_NEW_CDT                ,SYSOBJ_FLAGS,  310  },
        !           375:        {       "newuser_minutes",                      SYS_PROP_NEW_MIN                ,SYSOBJ_FLAGS,  310  },
        !           376:        {       "newuser_command_shell",        SYS_PROP_NEW_SHELL              ,SYSOBJ_FLAGS,  310  },
        !           377:        {       "newuser_editor",                       SYS_PROP_NEW_XEDIT              ,SYSOBJ_FLAGS,  310  },
        !           378:        {       "newuser_settings",                     SYS_PROP_NEW_MISC               ,SYSOBJ_FLAGS,  310  },
        !           379:        {       "newuser_download_protocol",SYS_PROP_NEW_PROT           ,SYSOBJ_FLAGS,  310  },
        !           380:        {       "newuser_expiration_days",      SYS_PROP_NEW_EXPIRE             ,SYSOBJ_FLAGS,  310  },
        !           381:        {       "newuser_questions",            SYS_PROP_NEW_UQ                 ,SYSOBJ_FLAGS,  310  },
        !           382: 
        !           383:        {       "expired_level",                        SYS_PROP_EXPIRED_LEVEL  ,SYSOBJ_FLAGS,  310  },
        !           384:        {       "expired_flags1",                       SYS_PROP_EXPIRED_FLAGS1 ,SYSOBJ_FLAGS,  310  },
        !           385:        {       "expired_flags2",                       SYS_PROP_EXPIRED_FLAGS2 ,SYSOBJ_FLAGS,  310  },
        !           386:        {       "expired_flags3",                       SYS_PROP_EXPIRED_FLAGS3 ,SYSOBJ_FLAGS,  310  },
        !           387:        {       "expired_flags4",                       SYS_PROP_EXPIRED_FLAGS4 ,SYSOBJ_FLAGS,  310  },
        !           388:        {       "expired_restrictions",         SYS_PROP_EXPIRED_REST   ,SYSOBJ_FLAGS,  310  },
        !           389:        {       "expired_exemptions",           SYS_PROP_EXPIRED_EXEMPT ,SYSOBJ_FLAGS,  310  }, 
        !           390: 
        !           391:        /* directories */
        !           392:        {       "node_dir",                                     SYS_PROP_NODE_DIR               ,SYSOBJ_FLAGS,  310  }, 
        !           393:        {       "ctrl_dir",                                     SYS_PROP_CTRL_DIR               ,SYSOBJ_FLAGS,  310  }, 
        !           394:        {       "data_dir",                                     SYS_PROP_DATA_DIR               ,SYSOBJ_FLAGS,  310  }, 
        !           395:        {       "text_dir",                                     SYS_PROP_TEXT_DIR               ,SYSOBJ_FLAGS,  310  }, 
        !           396:        {       "temp_dir",                                     SYS_PROP_TEMP_DIR               ,SYSOBJ_FLAGS,  310  }, 
        !           397:        {       "exec_dir",                                     SYS_PROP_EXEC_DIR               ,SYSOBJ_FLAGS,  310  }, 
        !           398:        {       "mods_dir",                                     SYS_PROP_MODS_DIR               ,SYSOBJ_FLAGS,  310  }, 
        !           399:        {       "logs_dir",                                     SYS_PROP_LOGS_DIR               ,SYSOBJ_FLAGS,  310  }, 
        !           400: 
        !           401:        /* filenames */
        !           402:        {       "devnull",                                      SYS_PROP_DEVNULL                ,SYSOBJ_FLAGS,  311  },
        !           403:        {       "temp_path",                            SYS_PROP_TEMP_PATH              ,SYSOBJ_FLAGS,  312      },
        !           404:        {       "cmd_shell",                            SYS_PROP_CMD_SHELL              ,SYSOBJ_FLAGS,  314      },
        !           405: 
        !           406:        /* clock access */
        !           407:        {       "clock_ticks",                          SYS_PROP_CLOCK                  ,SYSOBJ_FLAGS,  311  },
        !           408:        {       "clock_ticks_per_second",       SYS_PROP_CLOCK_PER_SEC  ,SYSOBJ_FLAGS,  311  },
        !           409:        {       "timer",                                        SYS_PROP_TIMER                  ,SYSOBJ_FLAGS,  314      },
        !           410: 
        !           411:        /* last */
        !           412:        {       "local_host_name",                      SYS_PROP_LOCAL_HOSTNAME ,SYSOBJ_FLAGS,  311  },
        !           413:        {0}
        !           414: };
        !           415: 
        !           416: #ifdef BUILD_JSDOCS
        !           417: static char* sys_prop_desc[] = {
        !           418:         "BBS name"
        !           419:        ,"operator name"
        !           420:        ,"system QWK-ID (for QWK packets)"
        !           421:        ,"settings bitfield (see <tt>SS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
        !           422:        ,"PostLink name"
        !           423:        ,"PostLink system number"
        !           424:        ,"Internet address (host or domain name)"
        !           425:        ,"location (city, state)"
        !           426:        ,"timezone (use <i>system.zonestr()</i> to get string representation)"
        !           427:        ,"days between forced password changes"
        !           428:        ,"days to preserve deleted user records"
        !           429: 
        !           430:        ,"last user record number in user database (includes deleted and inactive user records)"
        !           431:        ,"name of last user to logoff"
        !           432:        ,"amount of free disk space (in bytes)"
        !           433:        ,"amount of free disk space (in kilobytes)"
        !           434: 
        !           435:        ,"total number of BBS nodes"
        !           436:        ,"last displayable node number"
        !           437: 
        !           438:        ,"new user password"
        !           439:        ,"new user magic word"
        !           440:        ,"new user level"
        !           441:        ,"new user flag set #1"
        !           442:        ,"new user flag set #2"
        !           443:        ,"new user flag set #3"
        !           444:        ,"new user flag set #4"
        !           445:        ,"new user restriction flags"
        !           446:        ,"new user exemption flags"
        !           447:        ,"new user credits"
        !           448:        ,"new user extra minutes"
        !           449:        ,"new user command shell"
        !           450:        ,"new user external editor"
        !           451:        ,"new user settings"
        !           452:        ,"new user file transfer protocol (command key)"
        !           453:        ,"new user expiration days"
        !           454:        ,"new user questions bitfield (see <tt>UQ_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
        !           455: 
        !           456:        ,"expired user level"
        !           457:        ,"expired user flag set #1"
        !           458:        ,"expired user flag set #2"
        !           459:        ,"expired user flag set #3"
        !           460:        ,"expired user flag set #4"
        !           461:        ,"expired user restriction flags"
        !           462:        ,"expired user exemption flags"
        !           463: 
        !           464:        /* directories */
        !           465:        ,"node directory"
        !           466:        ,"control file directory"
        !           467:        ,"data file directory"
        !           468:        ,"text file directory"
        !           469:        ,"temporary file directory"
        !           470:        ,"executable file directory"
        !           471:        ,"modified modules directory (optional)"
        !           472:        ,"log file directory"
        !           473: 
        !           474:        /* filenames */
        !           475:        ,"platform-specific \"null\" device filename"
        !           476:        ,"platform-specific temporary file directory"
        !           477:        ,"platform-specific command processor/shell"
        !           478: 
        !           479:        /* clock */
        !           480:        ,"amount of elapsed processor time in clock 'ticks'"
        !           481:        ,"number of clock ticks per second"
        !           482:        ,"high-resolution timer, in seconds (fractional seconds supported)"
        !           483: 
        !           484:        /* INSERT new tabled properties here */
        !           485:        ,"private host name that uniquely identifies this system on the local network"
        !           486: 
        !           487:        /* Manually created (non-tabled) properties */
        !           488:        ,"public host name that uniquely identifies this system on the Internet (usually the same as <i>system.inet_addr</i>)"
        !           489:        ,"Synchronet version number (e.g. '3.10')"
        !           490:        ,"Synchronet revision letter (e.g. 'k')"
        !           491:        ,"Synchronet alpha/beta designation (e.g. ' beta')"
        !           492:        ,"Synchronet full version information (e.g. '3.10k Beta Debug')"
        !           493:        ,"Synchronet version notice (includes version and platform)"
        !           494:        ,"Synchronet version number in decimal (e.g. 31301 for v3.13b)"
        !           495:        ,"Synchronet version number in hexadecimal (e.g. 0x31301 for v3.13b)"
        !           496:        ,"platform description (e.g. 'Win32', 'Linux', 'FreeBSD')"
        !           497:        ,"socket library version information"
        !           498:        ,"message base library version information"
        !           499:        ,"compiler used to build Synchronet"
        !           500:        ,"date and time compiled"
        !           501:        ,"Synchronet copyright display"
        !           502:        ,"JavaScript engine version information"
        !           503:        ,"operating system version information"
        !           504:        ,"time/date system was brought online (in time_t format)"
        !           505: 
        !           506:        ,"array of FidoNet Technology Network (FTN) addresses associated with this system"
        !           507:        ,NULL
        !           508: };
        !           509: #endif
        !           510: 
        !           511: 
        !           512: static JSClass js_system_class = {
        !           513:      "System"                          /* name                 */
        !           514:     ,JSCLASS_HAS_PRIVATE       /* flags                */
        !           515:        ,JS_PropertyStub                /* addProperty  */
        !           516:        ,JS_PropertyStub                /* delProperty  */
        !           517:        ,js_system_get                  /* getProperty  */
        !           518:        ,js_system_set                  /* setProperty  */
        !           519:        ,JS_EnumerateStub               /* enumerate    */
        !           520:        ,JS_ResolveStub                 /* resolve              */
        !           521:        ,JS_ConvertStub                 /* convert              */
        !           522:        ,JS_FinalizeStub                /* finalize             */
        !           523: };
        !           524: 
        !           525: /* System Stats Propertiess */
        !           526: enum {
        !           527:         SYSSTAT_PROP_LOGONS
        !           528:        ,SYSSTAT_PROP_LTODAY
        !           529:        ,SYSSTAT_PROP_TIMEON
        !           530:        ,SYSSTAT_PROP_TTODAY
        !           531:        ,SYSSTAT_PROP_ULS
        !           532:        ,SYSSTAT_PROP_ULB
        !           533:        ,SYSSTAT_PROP_DLS
        !           534:        ,SYSSTAT_PROP_DLB
        !           535:        ,SYSSTAT_PROP_PTODAY
        !           536:        ,SYSSTAT_PROP_ETODAY
        !           537:        ,SYSSTAT_PROP_FTODAY
        !           538:        ,SYSSTAT_PROP_NUSERS
        !           539: 
        !           540:        ,SYSSTAT_PROP_TOTALUSERS
        !           541:        ,SYSSTAT_PROP_TOTALFILES
        !           542:        ,SYSSTAT_PROP_TOTALMSGS
        !           543:        ,SYSSTAT_PROP_TOTALMAIL
        !           544:        ,SYSSTAT_PROP_FEEDBACK
        !           545: };
        !           546: 
        !           547: static JSBool js_sysstats_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
        !           548: {
        !           549:     jsint       tiny;
        !           550:        scfg_t*         cfg;
        !           551:        stats_t         stats;
        !           552:        uint            i;
        !           553:        ulong           l;
        !           554: 
        !           555:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !           556:                return(JS_FALSE);
        !           557: 
        !           558:     tiny = JSVAL_TO_INT(id);
        !           559: 
        !           560:        if(!getstats(cfg, 0, &stats))
        !           561:                return(FALSE);
        !           562: 
        !           563:        switch(tiny) {
        !           564:                case SYSSTAT_PROP_LOGONS:
        !           565:                        JS_NewNumberValue(cx,stats.logons,vp);
        !           566:                        break;
        !           567:                case SYSSTAT_PROP_LTODAY:
        !           568:                        JS_NewNumberValue(cx,stats.ltoday,vp);
        !           569:                        break;
        !           570:                case SYSSTAT_PROP_TIMEON:
        !           571:                        JS_NewNumberValue(cx,stats.timeon,vp);
        !           572:                        break;
        !           573:                case SYSSTAT_PROP_TTODAY:
        !           574:                        JS_NewNumberValue(cx,stats.ttoday,vp);
        !           575:                        break;
        !           576:                case SYSSTAT_PROP_ULS:
        !           577:                        JS_NewNumberValue(cx,stats.uls,vp);
        !           578:                        break;
        !           579:                case SYSSTAT_PROP_ULB:
        !           580:                        JS_NewNumberValue(cx,stats.ulb,vp);
        !           581:                        break;
        !           582:                case SYSSTAT_PROP_DLS:
        !           583:                        JS_NewNumberValue(cx,stats.dls,vp);
        !           584:                        break;
        !           585:                case SYSSTAT_PROP_DLB:
        !           586:                        JS_NewNumberValue(cx,stats.dlb,vp);
        !           587:                        break;
        !           588:                case SYSSTAT_PROP_PTODAY:
        !           589:                        JS_NewNumberValue(cx,stats.ptoday,vp);
        !           590:                        break;
        !           591:                case SYSSTAT_PROP_ETODAY:
        !           592:                        JS_NewNumberValue(cx,stats.etoday,vp);
        !           593:                        break;
        !           594:                case SYSSTAT_PROP_FTODAY:
        !           595:                        JS_NewNumberValue(cx,stats.ftoday,vp);
        !           596:                        break;
        !           597:                case SYSSTAT_PROP_NUSERS:
        !           598:                        JS_NewNumberValue(cx,stats.nusers,vp);
        !           599:                        break;
        !           600: 
        !           601:                case SYSSTAT_PROP_TOTALUSERS:
        !           602:                        *vp = INT_TO_JSVAL(total_users(cfg));
        !           603:                        break;
        !           604:                case SYSSTAT_PROP_TOTALMSGS:
        !           605:                        l=0;
        !           606:                        for(i=0;i<cfg->total_subs;i++)
        !           607:                                l+=getposts(cfg,i); 
        !           608:                        JS_NewNumberValue(cx,l,vp); 
        !           609:                        break;
        !           610:                case SYSSTAT_PROP_TOTALFILES:
        !           611:                        l=0;
        !           612:                        for(i=0;i<cfg->total_dirs;i++)
        !           613:                                l+=getfiles(cfg,i);
        !           614:                        JS_NewNumberValue(cx,l,vp);
        !           615:                        break;
        !           616:                case SYSSTAT_PROP_TOTALMAIL:
        !           617:                        *vp = INT_TO_JSVAL(getmail(cfg, 0,0));
        !           618:                        break;
        !           619:                case SYSSTAT_PROP_FEEDBACK:
        !           620:                        *vp = INT_TO_JSVAL(getmail(cfg, 1,0));
        !           621:                        break;
        !           622:        }
        !           623: 
        !           624:        return(TRUE);
        !           625: }
        !           626: 
        !           627: #define SYSSTAT_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
        !           628: 
        !           629: static jsSyncPropertySpec js_sysstats_properties[] = {
        !           630: /*              name,                                          tinyid,                                         flags,                  ver     */
        !           631: 
        !           632:        {       "total_logons",                         SYSSTAT_PROP_LOGONS,            SYSSTAT_FLAGS,  310 },
        !           633:        {       "logons_today",                         SYSSTAT_PROP_LTODAY,            SYSSTAT_FLAGS,  310 },
        !           634:        {       "total_timeon",                         SYSSTAT_PROP_TIMEON,            SYSSTAT_FLAGS,  310 },
        !           635:        {       "timeon_today",                         SYSSTAT_PROP_TTODAY,            SYSSTAT_FLAGS,  310 },
        !           636:        {       "total_files",                          SYSSTAT_PROP_TOTALFILES,        SYSSTAT_FLAGS,  310 },
        !           637:        {       "files_uploaded_today",         SYSSTAT_PROP_ULS,                       SYSSTAT_FLAGS,  310 },
        !           638:        {       "bytes_uploaded_today",         SYSSTAT_PROP_ULB,                       SYSSTAT_FLAGS,  310 },
        !           639:        {       "files_downloaded_today",       SYSSTAT_PROP_DLS,                       SYSSTAT_FLAGS,  310 },
        !           640:        {       "bytes_downloaded_today",       SYSSTAT_PROP_DLB,                       SYSSTAT_FLAGS,  310 },
        !           641:        {       "total_messages",                       SYSSTAT_PROP_TOTALMSGS,         SYSSTAT_FLAGS,  310 },
        !           642:        {       "messages_posted_today",        SYSSTAT_PROP_PTODAY,            SYSSTAT_FLAGS,  310 },
        !           643:        {       "total_email",                          SYSSTAT_PROP_TOTALMAIL,         SYSSTAT_FLAGS,  310 },
        !           644:        {       "email_sent_today",                     SYSSTAT_PROP_ETODAY,            SYSSTAT_FLAGS,  310 },
        !           645:        {       "total_feedback",                       SYSSTAT_PROP_FEEDBACK,          SYSSTAT_FLAGS,  310 },
        !           646:        {       "feedback_sent_today",          SYSSTAT_PROP_FTODAY,            SYSSTAT_FLAGS,  310 },
        !           647:        {       "total_users",                          SYSSTAT_PROP_TOTALUSERS,        SYSSTAT_FLAGS,  310 },
        !           648:        {       "new_users_today",                      SYSSTAT_PROP_NUSERS,            SYSSTAT_FLAGS,  310 },
        !           649:        {0}
        !           650: };
        !           651: 
        !           652: #ifdef BUILD_JSDOCS
        !           653: static char* sysstat_prop_desc[] = {
        !           654:         "total logons"
        !           655:        ,"logons today"
        !           656:        ,"total time used"
        !           657:        ,"time used today"
        !           658:        ,"total files in file bases"
        !           659:        ,"files uploaded today"
        !           660:        ,"bytes uploaded today"
        !           661:        ,"files downloaded today"
        !           662:        ,"bytes downloaded today"
        !           663:        ,"total messages in message bases"
        !           664:        ,"messages posted today"
        !           665:        ,"total messages in mail base"
        !           666:        ,"email sent today"
        !           667:        ,"total feedback messages waiting"
        !           668:        ,"feedback sent today"
        !           669:        ,"total user records (does not include deleted or inactive user records)"
        !           670:        ,"new users today"
        !           671:        ,NULL
        !           672: };
        !           673: #endif
        !           674: 
        !           675: 
        !           676: static JSClass js_sysstats_class = {
        !           677:      "Stats"                           /* name                 */
        !           678:     ,JSCLASS_HAS_PRIVATE       /* flags                */
        !           679:        ,JS_PropertyStub                /* addProperty  */
        !           680:        ,JS_PropertyStub                /* delProperty  */
        !           681:        ,js_sysstats_get                /* getProperty  */
        !           682:        ,JS_PropertyStub                /* setProperty  */
        !           683:        ,JS_EnumerateStub               /* enumerate    */
        !           684:        ,JS_ResolveStub                 /* resolve              */
        !           685:        ,JS_ConvertStub                 /* convert              */
        !           686:        ,JS_FinalizeStub                /* finalize             */
        !           687: };
        !           688: 
        !           689: static JSBool
        !           690: js_alias(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           691: {
        !           692:        char*           p;
        !           693:        char            buf[128];
        !           694:        JSString*       js_str;
        !           695:        scfg_t*         cfg;
        !           696: 
        !           697:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !           698:                return(JS_FALSE);
        !           699: 
        !           700:        if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
        !           701:                *rval = INT_TO_JSVAL(0);
        !           702:                return(JS_TRUE);
        !           703:        }
        !           704: 
        !           705:        if((p=JS_GetStringBytes(js_str))==NULL) {
        !           706:                *rval = INT_TO_JSVAL(0);
        !           707:                return(JS_TRUE);
        !           708:        }
        !           709: 
        !           710:        p=alias(cfg,p,buf);
        !           711: 
        !           712:        if((js_str = JS_NewStringCopyZ(cx, p))==NULL)
        !           713:                return(JS_FALSE);
        !           714: 
        !           715:        *rval = STRING_TO_JSVAL(js_str);
        !           716:        return(JS_TRUE);
        !           717: }
        !           718: 
        !           719: static JSBool
        !           720: js_username(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           721: {
        !           722:        int32           val;
        !           723:        char            buf[128];
        !           724:        JSString*       js_str;
        !           725:        scfg_t*         cfg;
        !           726: 
        !           727:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !           728:                return(JS_FALSE);
        !           729: 
        !           730:        val=0;
        !           731:        JS_ValueToInt32(cx,argv[0],&val);
        !           732: 
        !           733:        if((js_str = JS_NewStringCopyZ(cx, username(cfg,val,buf)))==NULL)
        !           734:                return(JS_FALSE);
        !           735: 
        !           736:        *rval = STRING_TO_JSVAL(js_str);
        !           737:        return(JS_TRUE);
        !           738: }
        !           739: 
        !           740: 
        !           741: static JSBool
        !           742: js_matchuser(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           743: {
        !           744:        char*           p;
        !           745:        JSString*       js_str;
        !           746:        scfg_t*         cfg;
        !           747:        BOOL            sysop_alias=TRUE;
        !           748: 
        !           749:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !           750:                return(JS_FALSE);
        !           751: 
        !           752:        if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
        !           753:                *rval = INT_TO_JSVAL(0);
        !           754:                return(JS_TRUE);
        !           755:        }
        !           756: 
        !           757:        if(argc>1)
        !           758:                JS_ValueToBoolean(cx,argv[1],&sysop_alias);
        !           759: 
        !           760:        if((p=JS_GetStringBytes(js_str))==NULL) {
        !           761:                *rval = INT_TO_JSVAL(0);
        !           762:                return(JS_TRUE);
        !           763:        }
        !           764: 
        !           765:        *rval = INT_TO_JSVAL(matchuser(cfg,p,sysop_alias));
        !           766:        return(JS_TRUE);
        !           767: }
        !           768: 
        !           769: static JSBool
        !           770: js_matchuserdata(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           771: {
        !           772:        char*           p;
        !           773:        JSString*       js_str;
        !           774:        int32           offset=0;
        !           775:        int32           usernumber=0;
        !           776:        int                     len;
        !           777:        scfg_t*         cfg;
        !           778: 
        !           779:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !           780:                return(JS_FALSE);
        !           781: 
        !           782:        JS_ValueToInt32(cx,argv[0],&offset);
        !           783:        if((len=user_rec_len(offset))<0)
        !           784:                return(JS_FALSE);
        !           785: 
        !           786:        if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
        !           787:                *rval = INT_TO_JSVAL(0);
        !           788:                return(JS_TRUE);
        !           789:        }
        !           790: 
        !           791:        if(argc>2)
        !           792:                JS_ValueToInt32(cx,argv[2],&usernumber);
        !           793: 
        !           794:        if((p=JS_GetStringBytes(js_str))==NULL) {
        !           795:                *rval = INT_TO_JSVAL(0);
        !           796:                return(JS_TRUE);
        !           797:        }
        !           798: 
        !           799:        *rval = INT_TO_JSVAL(userdatdupe(cfg,usernumber,offset,len,p,FALSE /* deleted users */));
        !           800:        return(JS_TRUE);
        !           801: }
        !           802: 
        !           803: static JSBool
        !           804: js_trashcan(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           805: {
        !           806:        char*           str;
        !           807:        char*           can;
        !           808:        JSString*       js_str;
        !           809:        JSString*       js_can;
        !           810:        scfg_t*         cfg;
        !           811: 
        !           812:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !           813:                return(JS_FALSE);
        !           814: 
        !           815:        if((js_can=JS_ValueToString(cx, argv[0]))==NULL) {
        !           816:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !           817:                return(JS_TRUE);
        !           818:        }
        !           819: 
        !           820:        if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
        !           821:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !           822:                return(JS_TRUE);
        !           823:        }
        !           824: 
        !           825:        if((can=JS_GetStringBytes(js_can))==NULL) {
        !           826:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !           827:                return(JS_TRUE);
        !           828:        }
        !           829: 
        !           830:        if((str=JS_GetStringBytes(js_str))==NULL) {
        !           831:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !           832:                return(JS_TRUE);
        !           833:        }
        !           834: 
        !           835:        *rval = BOOLEAN_TO_JSVAL(trashcan(cfg,str,can));        /* user args are reversed */
        !           836:        return(JS_TRUE);
        !           837: }
        !           838: 
        !           839: static JSBool
        !           840: js_findstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           841: {
        !           842:        char*           str;
        !           843:        char*           fname;
        !           844:        JSString*       js_str;
        !           845:        JSString*       js_fname;
        !           846: 
        !           847:        if((js_fname=JS_ValueToString(cx, argv[0]))==NULL) {
        !           848:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !           849:                return(JS_TRUE);
        !           850:        }
        !           851: 
        !           852:        if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
        !           853:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !           854:                return(JS_TRUE);
        !           855:        }
        !           856: 
        !           857:        if((fname=JS_GetStringBytes(js_fname))==NULL) {
        !           858:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !           859:                return(JS_TRUE);
        !           860:        }
        !           861: 
        !           862:        if((str=JS_GetStringBytes(js_str))==NULL) {
        !           863:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
        !           864:                return(JS_TRUE);
        !           865:        }
        !           866: 
        !           867:        *rval = BOOLEAN_TO_JSVAL(findstr(str,fname));   /* user args are reversed */
        !           868:        return(JS_TRUE);
        !           869: }
        !           870: 
        !           871: 
        !           872: static JSBool
        !           873: js_zonestr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           874: {
        !           875:        JSString*       js_str;
        !           876:        short           zone;
        !           877:        int32           val=0;
        !           878:        scfg_t*         cfg;
        !           879: 
        !           880:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !           881:                return(JS_FALSE);
        !           882: 
        !           883:        if(argc<1)
        !           884:                zone=sys_timezone(cfg);
        !           885:        else {
        !           886:                JS_ValueToInt32(cx,argv[0],&val);
        !           887:                zone=(short)val;
        !           888:        }
        !           889: 
        !           890:        if((js_str = JS_NewStringCopyZ(cx, smb_zonestr(zone,NULL)))==NULL)
        !           891:                return(JS_FALSE);
        !           892: 
        !           893:        *rval = STRING_TO_JSVAL(js_str);
        !           894:        return(JS_TRUE);
        !           895: }
        !           896: 
        !           897: /* Returns a ctime()-like string in the system-preferred time format */
        !           898: static JSBool
        !           899: js_timestr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           900: {
        !           901:        char            str[128];
        !           902:        int32           i=0;
        !           903:        time_t          t;
        !           904:        JSString*       js_str;
        !           905:        scfg_t*         cfg;
        !           906: 
        !           907:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !           908:                return(JS_FALSE);
        !           909: 
        !           910:        if(argc<1)
        !           911:                i=time(NULL);   /* use current time */
        !           912:        else
        !           913:                JS_ValueToInt32(cx,argv[0],&i);
        !           914:        t=i;
        !           915:        timestr(cfg,&t,str);
        !           916:        if((js_str = JS_NewStringCopyZ(cx, str))==NULL)
        !           917:                return(JS_FALSE);
        !           918: 
        !           919:        *rval = STRING_TO_JSVAL(js_str);
        !           920:        return(JS_TRUE);
        !           921: }
        !           922: 
        !           923: 
        !           924: /* Returns a mm/dd/yy or dd/mm/yy formated string */
        !           925: static JSBool
        !           926: js_datestr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           927: {
        !           928:        char            str[128];
        !           929:        time_t          t;
        !           930:        JSString*       js_str;
        !           931:        scfg_t*         cfg;
        !           932: 
        !           933:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !           934:                return(JS_FALSE);
        !           935: 
        !           936:        if(argc<1)
        !           937:                t=time(NULL);   /* use current time */
        !           938:        else {
        !           939:                if(JSVAL_IS_STRING(argv[0])) {  /* convert from string to time_t? */
        !           940:                        *rval = INT_TO_JSVAL(
        !           941:                                dstrtounix(cfg,JS_GetStringBytes(JS_ValueToString(cx, argv[0]))));
        !           942:                        return(JS_TRUE);
        !           943:                }
        !           944:                JS_ValueToInt32(cx,argv[0],(int32*)&t);
        !           945:        }
        !           946:        unixtodstr(cfg,t,str);
        !           947:        if((js_str = JS_NewStringCopyZ(cx, str))==NULL)
        !           948:                return(JS_FALSE);
        !           949: 
        !           950:        *rval = STRING_TO_JSVAL(js_str);
        !           951:        return(JS_TRUE);
        !           952: }
        !           953: 
        !           954: static JSBool
        !           955: js_secondstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           956: {
        !           957:        char            str[128];
        !           958:        int32           t=0;
        !           959:        JSString*       js_str;
        !           960: 
        !           961:        *rval = JSVAL_NULL;
        !           962: 
        !           963:        if(argc<1)
        !           964:                return(JS_TRUE);
        !           965: 
        !           966:        JS_ValueToInt32(cx,argv[0],&t);
        !           967:        sectostr(t,str);
        !           968:        if((js_str = JS_NewStringCopyZ(cx, str))==NULL)
        !           969:                return(JS_FALSE);
        !           970: 
        !           971:        *rval = STRING_TO_JSVAL(js_str);
        !           972:        return(JS_TRUE);
        !           973: }
        !           974: 
        !           975: static JSBool
        !           976: js_spamlog(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           977: {
        !           978:        uintN           i;
        !           979:        char*           p;
        !           980:        char*           prot=NULL;
        !           981:        char*           action=NULL;
        !           982:        char*           reason=NULL;
        !           983:        char*           host=NULL;
        !           984:        char*           ip_addr=NULL;
        !           985:        char*           to=NULL;
        !           986:        char*           from=NULL;
        !           987:        scfg_t*         cfg;
        !           988: 
        !           989:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !           990:                return(JS_FALSE);
        !           991: 
        !           992:        for(i=0;i<argc;i++) {
        !           993:                if(!JSVAL_IS_STRING(argv[i]))
        !           994:                        continue;
        !           995:                p=JS_GetStringBytes(JS_ValueToString(cx, argv[i]));
        !           996:                if(p==NULL)
        !           997:                        continue;
        !           998:                if(prot==NULL)
        !           999:                        prot=p;
        !          1000:                else if(action==NULL)
        !          1001:                        action=p;
        !          1002:                else if(reason==NULL)
        !          1003:                        reason=p;
        !          1004:                else if(host==NULL)
        !          1005:                        host=p;
        !          1006:                else if(ip_addr==NULL)
        !          1007:                        ip_addr=p;
        !          1008:                else if(to==NULL)
        !          1009:                        to=p;
        !          1010:                else if(from==NULL)
        !          1011:                        from=p;
        !          1012:        }
        !          1013:        *rval = BOOLEAN_TO_JSVAL(spamlog(cfg,prot,action,reason,host,ip_addr,to,from));
        !          1014:        return(JS_TRUE);
        !          1015: }
        !          1016: 
        !          1017: static JSBool
        !          1018: js_hacklog(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1019: {
        !          1020:        uintN           i;
        !          1021:        int32           i32=0;
        !          1022:        char*           p;
        !          1023:        char*           prot=NULL;
        !          1024:        char*           user=NULL;
        !          1025:        char*           text=NULL;
        !          1026:        char*           host=NULL;
        !          1027:        SOCKADDR_IN     addr;
        !          1028:        scfg_t*         cfg;
        !          1029: 
        !          1030:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !          1031:                return(JS_FALSE);
        !          1032: 
        !          1033:        memset(&addr,0,sizeof(addr));
        !          1034:        for(i=0;i<argc;i++) {
        !          1035:                if(JSVAL_IS_NUMBER(argv[i])) {
        !          1036:                        JS_ValueToInt32(cx,argv[i],&i32);
        !          1037:                        if(addr.sin_addr.s_addr==0)
        !          1038:                                addr.sin_addr.s_addr=i32;
        !          1039:                        else
        !          1040:                                addr.sin_port=(ushort)i32;
        !          1041:                        continue;
        !          1042:                }
        !          1043:                if(!JSVAL_IS_STRING(argv[i]))
        !          1044:                        continue;
        !          1045:                p=JS_GetStringBytes(JS_ValueToString(cx, argv[i]));
        !          1046:                if(p==NULL)
        !          1047:                        continue;
        !          1048:                if(prot==NULL)
        !          1049:                        prot=p;
        !          1050:                else if(user==NULL)
        !          1051:                        user=p;
        !          1052:                else if(text==NULL)
        !          1053:                        text=p;
        !          1054:                else if(host==NULL)
        !          1055:                        host=p;
        !          1056:        }
        !          1057:        *rval = BOOLEAN_TO_JSVAL(hacklog(cfg,prot,user,text,host,&addr));
        !          1058:        return(JS_TRUE);
        !          1059: }
        !          1060: 
        !          1061: static JSBool
        !          1062: js_filter_ip(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1063: {
        !          1064:        uintN           i;
        !          1065:        char*           p;
        !          1066:        char*           prot=NULL;
        !          1067:        char*           reason=NULL;
        !          1068:        char*           host=NULL;
        !          1069:        char*           ip_addr=NULL;
        !          1070:        char*           from=NULL;
        !          1071:        char*           fname=NULL;
        !          1072:        scfg_t*         cfg;
        !          1073: 
        !          1074:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !          1075:                return(JS_FALSE);
        !          1076: 
        !          1077:        for(i=0;i<argc;i++) {
        !          1078:                if(!JSVAL_IS_STRING(argv[i]))
        !          1079:                        continue;
        !          1080:                p=JS_GetStringBytes(JS_ValueToString(cx, argv[i]));
        !          1081:                if(p==NULL)
        !          1082:                        continue;
        !          1083:                if(prot==NULL)
        !          1084:                        prot=p;
        !          1085:                else if(reason==NULL)
        !          1086:                        reason=p;
        !          1087:                else if(host==NULL)
        !          1088:                        host=p;
        !          1089:                else if(ip_addr==NULL)
        !          1090:                        ip_addr=p;
        !          1091:                else if(from==NULL)
        !          1092:                        from=p;
        !          1093:                else if(fname==NULL)
        !          1094:                        fname=p;
        !          1095:        }
        !          1096:        *rval = BOOLEAN_TO_JSVAL(filter_ip(cfg,prot,reason,host,ip_addr,from,fname));
        !          1097:        return(JS_TRUE);
        !          1098: }
        !          1099: 
        !          1100: static JSBool
        !          1101: js_get_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1102: {
        !          1103:        char*           buf;
        !          1104:        int32           node_num;
        !          1105:        JSString*       js_str;
        !          1106:        scfg_t*         cfg;
        !          1107: 
        !          1108:        *rval = JSVAL_NULL;
        !          1109: 
        !          1110:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !          1111:                return(JS_FALSE);
        !          1112: 
        !          1113:        node_num=cfg->node_num;
        !          1114:        if(argc) 
        !          1115:                JS_ValueToInt32(cx,argv[0],&node_num);
        !          1116:        if(node_num<1)
        !          1117:                node_num=1;
        !          1118: 
        !          1119:        if((buf=getnmsg(cfg,node_num))==NULL)
        !          1120:                return(JS_TRUE);
        !          1121: 
        !          1122:        js_str=JS_NewStringCopyZ(cx, buf);
        !          1123:        free(buf);
        !          1124: 
        !          1125:        if(js_str==NULL)
        !          1126:                return(JS_FALSE);
        !          1127:        *rval = STRING_TO_JSVAL(js_str);
        !          1128:        return(JS_TRUE);
        !          1129: }
        !          1130: 
        !          1131: 
        !          1132: static JSBool
        !          1133: js_put_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1134: {
        !          1135:        int32           node=1;
        !          1136:        JSString*       js_msg;
        !          1137:        char*           msg;
        !          1138:        scfg_t*         cfg;
        !          1139: 
        !          1140:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !          1141:                return(JS_FALSE);
        !          1142: 
        !          1143:        JS_ValueToInt32(cx,argv[0],&node);
        !          1144:        if(node<1)
        !          1145:                node=1;
        !          1146: 
        !          1147:        if((js_msg=JS_ValueToString(cx, argv[1]))==NULL) 
        !          1148:                return(JS_FALSE);
        !          1149: 
        !          1150:        if((msg=JS_GetStringBytes(js_msg))==NULL) 
        !          1151:                return(JS_FALSE);
        !          1152: 
        !          1153:        *rval = BOOLEAN_TO_JSVAL(putnmsg(cfg,node,msg)==0);
        !          1154: 
        !          1155:        return(JS_TRUE);
        !          1156: }
        !          1157: 
        !          1158: static JSBool
        !          1159: js_get_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1160: {
        !          1161:        char*           buf;
        !          1162:        int32           usernumber=1;
        !          1163:        JSString*       js_str;
        !          1164:        scfg_t*         cfg;
        !          1165: 
        !          1166:        *rval = JSVAL_NULL;
        !          1167: 
        !          1168:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !          1169:                return(JS_FALSE);
        !          1170: 
        !          1171:        JS_ValueToInt32(cx,argv[0],&usernumber);
        !          1172:        if(usernumber<1)
        !          1173:                usernumber=1;
        !          1174: 
        !          1175:        if((buf=getsmsg(cfg,usernumber))==NULL)
        !          1176:                return(JS_TRUE);
        !          1177: 
        !          1178:        js_str=JS_NewStringCopyZ(cx, buf);
        !          1179:        free(buf);
        !          1180: 
        !          1181:        if(js_str==NULL)
        !          1182:                return(JS_FALSE);
        !          1183:        *rval = STRING_TO_JSVAL(js_str);
        !          1184:        return(JS_TRUE);
        !          1185: }
        !          1186: 
        !          1187: static JSBool
        !          1188: js_put_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1189: {
        !          1190:        int32           usernumber=1;
        !          1191:        JSString*       js_msg;
        !          1192:        char*           msg;
        !          1193:        scfg_t*         cfg;
        !          1194: 
        !          1195:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !          1196:                return(JS_FALSE);
        !          1197: 
        !          1198:        JS_ValueToInt32(cx,argv[0],&usernumber);
        !          1199:        if(usernumber<1)
        !          1200:                usernumber=1;
        !          1201: 
        !          1202:        if((js_msg=JS_ValueToString(cx, argv[1]))==NULL) 
        !          1203:                return(JS_FALSE);
        !          1204: 
        !          1205:        if((msg=JS_GetStringBytes(js_msg))==NULL) 
        !          1206:                return(JS_FALSE);
        !          1207: 
        !          1208:        *rval = BOOLEAN_TO_JSVAL(putsmsg(cfg,usernumber,msg)==0);
        !          1209: 
        !          1210:        return(JS_TRUE);
        !          1211: }
        !          1212: 
        !          1213: static JSBool
        !          1214: js_new_user(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1215: {
        !          1216:        char*           alias;
        !          1217:        int                     i;
        !          1218:        scfg_t*         cfg;
        !          1219:        user_t          user;
        !          1220:        JSObject*       userobj;
        !          1221: 
        !          1222:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !          1223:                return(JS_FALSE);
        !          1224: 
        !          1225:        alias=JS_GetStringBytes(JS_ValueToString(cx,argv[0]));
        !          1226: 
        !          1227:        memset(&user,0,sizeof(user));
        !          1228: 
        !          1229:        user.sex=' ';
        !          1230:        SAFECOPY(user.alias,alias);
        !          1231: 
        !          1232:        /* statistics */
        !          1233:        user.firston=user.laston=user.pwmod=time(NULL);
        !          1234: 
        !          1235:        /* security */
        !          1236:        user.level=cfg->new_level;
        !          1237:        user.flags1=cfg->new_flags1;
        !          1238:        user.flags2=cfg->new_flags2;
        !          1239:        user.flags3=cfg->new_flags3;
        !          1240:        user.flags4=cfg->new_flags4;
        !          1241:        user.rest=cfg->new_rest;
        !          1242:        user.exempt=cfg->new_exempt;
        !          1243: 
        !          1244:        user.cdt=cfg->new_cdt;
        !          1245:        user.min=cfg->new_min;
        !          1246:        user.freecdt=cfg->level_freecdtperday[user.level];
        !          1247:        if(cfg->new_expire)
        !          1248:                user.expire=user.firston+((long)cfg->new_expire*24L*60L*60L);
        !          1249:        else
        !          1250:                user.expire=0;
        !          1251: 
        !          1252:        /* settings */
        !          1253:        if(cfg->total_fcomps)
        !          1254:                strcpy(user.tmpext,cfg->fcomp[0]->ext);
        !          1255:        else
        !          1256:                strcpy(user.tmpext,"ZIP");
        !          1257: 
        !          1258:        user.shell=cfg->new_shell;
        !          1259:        user.misc=cfg->new_misc|(AUTOTERM|COLOR);
        !          1260:        user.prot=cfg->new_prot;
        !          1261:        user.qwk=QWK_DEFAULT;
        !          1262: 
        !          1263:        for(i=0;i<cfg->total_xedits;i++)
        !          1264:                if(!stricmp(cfg->xedit[i]->code,cfg->new_xedit) && chk_ar(cfg,cfg->xedit[i]->ar,&user))
        !          1265:                        break;
        !          1266:        if(i<cfg->total_xedits)
        !          1267:                user.xedit=i+1;
        !          1268: 
        !          1269:        i=newuserdat(cfg,&user);
        !          1270: 
        !          1271:        if(i==0) {
        !          1272:                userobj=js_CreateUserObject(cx, obj, cfg, NULL, user.number);
        !          1273:                *rval = OBJECT_TO_JSVAL(userobj);
        !          1274:        } else
        !          1275:                *rval = INT_TO_JSVAL(i);
        !          1276: 
        !          1277:        return(JS_TRUE);
        !          1278: }
        !          1279: 
        !          1280: static JSBool
        !          1281: js_exec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1282: {
        !          1283:        *rval = INT_TO_JSVAL(system(JS_GetStringBytes(JS_ValueToString(cx, argv[0]))));
        !          1284:        
        !          1285:        return(JS_TRUE);
        !          1286: }
        !          1287: 
        !          1288: static JSBool
        !          1289: js_popen(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1290: {
        !          1291:        char            str[1024];
        !          1292:        char*           cmd;
        !          1293:        FILE*           fp;
        !          1294:        jsint           line=0;
        !          1295:        jsval           val;
        !          1296:        JSObject*       array;
        !          1297:        JSString*       js_str;
        !          1298: 
        !          1299:        if(argc<1)
        !          1300:                return(JS_TRUE);
        !          1301: 
        !          1302:        if((array=JS_NewArrayObject(cx,0,NULL))==NULL)
        !          1303:                return(JS_FALSE);
        !          1304: 
        !          1305:        cmd=JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
        !          1306:        if((fp=popen(cmd,"r"))==NULL)
        !          1307:                return(JS_TRUE);
        !          1308:        while(!feof(fp)) {
        !          1309:                if(fgets(str,sizeof(str),fp)==NULL)
        !          1310:                        break;
        !          1311:                if((js_str=JS_NewStringCopyZ(cx,str))==NULL)
        !          1312:                        break;
        !          1313:                val=STRING_TO_JSVAL(js_str);
        !          1314:         if(!JS_SetElement(cx, array, line++, &val))
        !          1315:                        break;
        !          1316:        }
        !          1317:        pclose(fp);
        !          1318: 
        !          1319:     *rval = OBJECT_TO_JSVAL(array);
        !          1320: 
        !          1321:     return(JS_TRUE);
        !          1322: }
        !          1323: 
        !          1324: static JSBool
        !          1325: js_chksyspass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1326: {
        !          1327:        scfg_t*         cfg;
        !          1328: 
        !          1329:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
        !          1330:                return(JS_FALSE);
        !          1331: 
        !          1332:        *rval = BOOLEAN_TO_JSVAL(stricmp(JS_GetStringBytes(JS_ValueToString(cx, argv[0]))
        !          1333:                                                                ,cfg->sys_pass)==0);
        !          1334:        
        !          1335:        return(JS_TRUE);
        !          1336: }
        !          1337: 
        !          1338: 
        !          1339: 
        !          1340: static jsSyncMethodSpec js_system_functions[] = {
        !          1341:        {"username",            js_username,            1,      JSTYPE_STRING,  JSDOCSTR("number")
        !          1342:        ,JSDOCSTR("returns name of user in specified user record <i>number</i>, or empty string if not found")
        !          1343:        ,311
        !          1344:        },
        !          1345:        {"alias",                       js_alias,                       1,      JSTYPE_STRING,  JSDOCSTR("alias")
        !          1346:        ,JSDOCSTR("returns name of user that matches alias (if found in <tt>ctrl/alias.cfg</tt>)")
        !          1347:        ,310
        !          1348:        },              
        !          1349:        {"matchuser",           js_matchuser,           1,      JSTYPE_NUMBER,  JSDOCSTR("username [,sysop_alias=<tt>true</tt>]")
        !          1350:        ,JSDOCSTR("exact user name matching, returns number of user whose name/alias matches <i>username</i> "
        !          1351:                " or 0 if not found, matches well-known sysop aliases by default")
        !          1352:        ,310
        !          1353:        },              
        !          1354:        {"matchuserdata",       js_matchuserdata,       2,      JSTYPE_NUMBER,  JSDOCSTR("field, data [,usernumber]")
        !          1355:        ,JSDOCSTR("search user database for data in a specific field (specified by offset), "
        !          1356:                "returns first matching user record number, optional <i>usernumber</i> specifies user record to skip")
        !          1357:        ,310
        !          1358:        },
        !          1359:        {"trashcan",            js_trashcan,            2,      JSTYPE_BOOLEAN, JSDOCSTR("path/filename, find_string")
        !          1360:        ,JSDOCSTR("search text/filename.can for pseudo-regexp")
        !          1361:        ,310
        !          1362:        },              
        !          1363:        {"findstr",                     js_findstr,                     2,      JSTYPE_BOOLEAN, JSDOCSTR("path/filename, find_string")
        !          1364:        ,JSDOCSTR("search any file for pseudo-regexp")
        !          1365:        ,310
        !          1366:        },              
        !          1367:        {"zonestr",                     js_zonestr,                     0,      JSTYPE_STRING,  JSDOCSTR("[timezone=<i>local</i>]")
        !          1368:        ,JSDOCSTR("convert time zone integer to string, defaults to system timezone if <i>timezone</i> not specified")
        !          1369:        ,310
        !          1370:        },              
        !          1371:        {"timestr",                     js_timestr,                     0,      JSTYPE_STRING,  JSDOCSTR("[time=<i>current</i>]")
        !          1372:        ,JSDOCSTR("convert time_t integer into a time string, "
        !          1373:                "defaults to current time if <i>time</i> not specified")
        !          1374:        ,310
        !          1375:        },              
        !          1376:        {"datestr",                     js_datestr,                     0,      JSTYPE_STRING,  JSDOCSTR("[time=<i>current</i>]")
        !          1377:        ,JSDOCSTR("convert time_t integer into a date string (in either <tt>MM/DD/YY</tt> or <tt>DD/MM/YY</tt> format), "
        !          1378:                "defaults to current date if <i>time</i> not specified")
        !          1379:        ,310
        !          1380:        },              
        !          1381:        {"secondstr",           js_secondstr,           0,      JSTYPE_STRING,  JSDOCSTR("seconds")
        !          1382:        ,JSDOCSTR("convert elapsed time in seconds into a string in <tt>hh:mm:ss</tt> format")
        !          1383:        ,310
        !          1384:        },              
        !          1385:        {"spamlog",                     js_spamlog,                     6,      JSTYPE_BOOLEAN, JSDOCSTR("[protocol, action, reason, host, ip, to, from]")
        !          1386:        ,JSDOCSTR("log a suspected SPAM attempt")
        !          1387:        ,310
        !          1388:        },              
        !          1389:        {"hacklog",                     js_hacklog,                     5,      JSTYPE_BOOLEAN, JSDOCSTR("[protocol, user, text, host, ip, port]")
        !          1390:        ,JSDOCSTR("log a suspected hack attempt")
        !          1391:        ,310
        !          1392:        },
        !          1393:        {"filter_ip",           js_filter_ip,           4,      JSTYPE_BOOLEAN, JSDOCSTR("[protocol, reason, host, ip, username]")
        !          1394:        ,JSDOCSTR("add an IP address (with comment) to the system's IP filter file")
        !          1395:        ,311
        !          1396:        },              
        !          1397:        {"get_node_message",js_get_node_message,0,      JSTYPE_STRING,  JSDOCSTR("node_number")
        !          1398:        ,JSDOCSTR("read any messages waiting for the specified node and return in a single string")
        !          1399:        ,311
        !          1400:        },              
        !          1401:        {"put_node_message",js_put_node_message,2,      JSTYPE_BOOLEAN, JSDOCSTR("node_number, message_text")
        !          1402:        ,JSDOCSTR("send a node a short text message, delivered immediately")
        !          1403:        ,310
        !          1404:        },              
        !          1405:        {"get_telegram",        js_get_telegram,        1,      JSTYPE_STRING,  JSDOCSTR("user_number")
        !          1406:        ,JSDOCSTR("returns any short text messages waiting for the specified user")
        !          1407:        ,311
        !          1408:        },              
        !          1409:        {"put_telegram",        js_put_telegram,        2,      JSTYPE_BOOLEAN, JSDOCSTR("user_number, message_text")
        !          1410:        ,JSDOCSTR("sends a user a short text message, delivered immediately or during next logon")
        !          1411:        ,310
        !          1412:        },              
        !          1413:        {"newuser",                     js_new_user,            1,      JSTYPE_ALIAS },
        !          1414:        {"new_user",            js_new_user,            1,      JSTYPE_OBJECT,  JSDOCSTR("name/alias")
        !          1415:        ,JSDOCSTR("creates a new user record, returns a new <a href=#User>User</a> object representing the new user account")
        !          1416:        ,310
        !          1417:        },
        !          1418:        {"exec",                        js_exec,                        1,      JSTYPE_NUMBER,  JSDOCSTR("command-line")
        !          1419:        ,JSDOCSTR("executes a native system/shell command-line, returns <i>0</i> on success")
        !          1420:        ,311
        !          1421:        },
        !          1422:        {"popen",                       js_popen,                       0,      JSTYPE_ARRAY,   JSDOCSTR("command-line")
        !          1423:        ,JSDOCSTR("executes a native system/shell command-line, returns array of captured output lines on success "
        !          1424:                "(<b>only functional on UNIX systems</b>)")
        !          1425:        ,311
        !          1426:        },
        !          1427:        {"check_syspass",       js_chksyspass,          1,      JSTYPE_BOOLEAN, JSDOCSTR("password")
        !          1428:        ,JSDOCSTR("compares the supplied <i>password</i> against the system password and return's <i>true</i> if it matches")
        !          1429:        ,311
        !          1430:        },
        !          1431:        {0}
        !          1432: };
        !          1433: 
        !          1434: 
        !          1435: /* node properties */
        !          1436: enum {
        !          1437:        /* raw node_t fields */
        !          1438:         NODE_PROP_STATUS
        !          1439:        ,NODE_PROP_ERRORS
        !          1440:        ,NODE_PROP_ACTION
        !          1441:        ,NODE_PROP_USERON
        !          1442:        ,NODE_PROP_CONNECTION
        !          1443:        ,NODE_PROP_MISC
        !          1444:        ,NODE_PROP_AUX
        !          1445:        ,NODE_PROP_EXTAUX
        !          1446: };
        !          1447: 
        !          1448: #ifdef BUILD_JSDOCS
        !          1449: static char* node_prop_desc[] = {
        !          1450:         "status (see <tt>nodedefs.js</tt> for valid values)"
        !          1451:        ,"error counter"
        !          1452:        ,"current user action (see <tt>nodedefs.js</tt>)"
        !          1453:        ,"current user number"
        !          1454:        ,"connection speed (<tt>0xffff</tt> = Telnet or RLogin)"
        !          1455:        ,"miscellaneous bitfield (see <tt>nodedefs.js</tt>)"
        !          1456:        ,"auxillary value"
        !          1457:        ,"extended auxillary value"
        !          1458:        ,NULL
        !          1459: };
        !          1460: #endif
        !          1461: 
        !          1462: 
        !          1463: static JSBool js_node_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
        !          1464: {
        !          1465:        uint            node_num;
        !          1466:     jsint       tiny;
        !          1467:        node_t          node;
        !          1468:        scfg_t*         cfg;
        !          1469:        JSObject*       sysobj;
        !          1470:        JSObject*       node_list;
        !          1471: 
        !          1472:        tiny = JSVAL_TO_INT(id);
        !          1473: 
        !          1474:        if((node_list=JS_GetParent(cx, obj))==NULL)
        !          1475:                return(JS_FALSE);
        !          1476: 
        !          1477:        if((sysobj=JS_GetParent(cx, node_list))==NULL)
        !          1478:                return(JS_FALSE);
        !          1479: 
        !          1480:        if((cfg=(scfg_t*)JS_GetPrivate(cx,sysobj))==NULL)
        !          1481:                return(JS_FALSE);
        !          1482: 
        !          1483:        node_num=(uint)JS_GetPrivate(cx,obj)>>1;
        !          1484: 
        !          1485:        memset(&node,0,sizeof(node));
        !          1486:        if(getnodedat(cfg, node_num, &node, NULL))
        !          1487:                return(JS_TRUE);
        !          1488:        
        !          1489:     switch(tiny) {
        !          1490:                case NODE_PROP_STATUS:
        !          1491:                        *vp = INT_TO_JSVAL((int)node.status);
        !          1492:                        break;
        !          1493:                case NODE_PROP_ERRORS:  
        !          1494:                        *vp = INT_TO_JSVAL((int)node.errors);
        !          1495:                        break;
        !          1496:                case NODE_PROP_ACTION:  
        !          1497:                        *vp = INT_TO_JSVAL((int)node.action);
        !          1498:                        break;
        !          1499:                case NODE_PROP_USERON:  
        !          1500:                        *vp = INT_TO_JSVAL((int)node.useron);
        !          1501:                        break;
        !          1502:                case NODE_PROP_CONNECTION:
        !          1503:                        *vp = INT_TO_JSVAL((int)node.connection);
        !          1504:                        break;
        !          1505:                case NODE_PROP_MISC:            
        !          1506:                        *vp = INT_TO_JSVAL((int)node.misc);
        !          1507:                        break;
        !          1508:                case NODE_PROP_AUX:             
        !          1509:                        *vp = INT_TO_JSVAL((int)node.aux);
        !          1510:                        break;
        !          1511:                case NODE_PROP_EXTAUX:  
        !          1512:                        JS_NewNumberValue(cx,node.extaux,vp);
        !          1513:                        break;
        !          1514:        }
        !          1515:        return(JS_TRUE);
        !          1516: }
        !          1517: 
        !          1518: static JSBool js_node_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
        !          1519: {
        !          1520:        uint            node_num;
        !          1521:        int                     file;
        !          1522:        jsint           val=0;
        !          1523:     jsint       tiny;
        !          1524:        node_t          node;
        !          1525:        scfg_t*         cfg;
        !          1526:        JSObject*       sysobj;
        !          1527:        JSObject*       node_list;
        !          1528: 
        !          1529:        if((node_list=JS_GetParent(cx, obj))==NULL)
        !          1530:                return(JS_FALSE);
        !          1531: 
        !          1532:        if((sysobj=JS_GetParent(cx, node_list))==NULL)
        !          1533:                return(JS_FALSE);
        !          1534: 
        !          1535:        if((cfg=(scfg_t*)JS_GetPrivate(cx,sysobj))==NULL)
        !          1536:                return(JS_FALSE);
        !          1537: 
        !          1538:        node_num=(uint)JS_GetPrivate(cx,obj)>>1;
        !          1539: 
        !          1540:        memset(&node,0,sizeof(node));
        !          1541:        if(getnodedat(cfg, node_num, &node, &file)) 
        !          1542:                return(JS_TRUE);
        !          1543: 
        !          1544:        if(JSVAL_IS_NUMBER(*vp))
        !          1545:                JS_ValueToInt32(cx, *vp, &val);
        !          1546: 
        !          1547:        tiny = JSVAL_TO_INT(id);
        !          1548:        
        !          1549:     switch(tiny) {
        !          1550:                case NODE_PROP_STATUS:
        !          1551:                        node.status=(BYTE)val;
        !          1552:                        break;
        !          1553:                case NODE_PROP_ERRORS:  
        !          1554:                        node.errors=(BYTE)val;
        !          1555:                        break;
        !          1556:                case NODE_PROP_ACTION:  
        !          1557:                        node.action=(BYTE)val;
        !          1558:                        break;
        !          1559:                case NODE_PROP_USERON:  
        !          1560:                        node.useron=(WORD)val;
        !          1561:                        break;
        !          1562:                case NODE_PROP_CONNECTION:
        !          1563:                        node.connection=(WORD)val;
        !          1564:                        break;
        !          1565:                case NODE_PROP_MISC:            
        !          1566:                        node.misc=(WORD)val;
        !          1567:                        break;
        !          1568:                case NODE_PROP_AUX:             
        !          1569:                        node.aux=(WORD)val;
        !          1570:                        break;
        !          1571:                case NODE_PROP_EXTAUX:  
        !          1572:                        node.extaux=val;
        !          1573:                        break;
        !          1574:        }
        !          1575:        putnodedat(cfg,node_num,&node,file);
        !          1576: 
        !          1577:        return(JS_TRUE);
        !          1578: }
        !          1579: 
        !          1580: static jsSyncPropertySpec js_node_properties[] = {
        !          1581: /*              name,                                          tinyid,                                 flags,                          ver     */
        !          1582: 
        !          1583: /* raw node_t fields */
        !          1584:        {       "status",                                       NODE_PROP_STATUS,               JSPROP_ENUMERATE,       310 },
        !          1585:        {       "errors",                                       NODE_PROP_ERRORS,               JSPROP_ENUMERATE,       310 },
        !          1586:        {       "action",                                       NODE_PROP_ACTION,               JSPROP_ENUMERATE,       310 },
        !          1587:        {       "useron",                                       NODE_PROP_USERON,               JSPROP_ENUMERATE,       310 },
        !          1588:        {       "connection",                           NODE_PROP_CONNECTION,   JSPROP_ENUMERATE,       310 },
        !          1589:        {       "misc",                                         NODE_PROP_MISC,                 JSPROP_ENUMERATE,       310 },
        !          1590:        {       "aux",                                          NODE_PROP_AUX,                  JSPROP_ENUMERATE,       310 },
        !          1591:        {       "extaux",                                       NODE_PROP_EXTAUX,               JSPROP_ENUMERATE,       310 },
        !          1592:        {0}
        !          1593: };
        !          1594: 
        !          1595: static JSClass js_node_class = {
        !          1596:      "Node"                                    /* name                 */
        !          1597:     ,JSCLASS_HAS_PRIVATE       /* flags                */
        !          1598:        ,JS_PropertyStub                /* addProperty  */
        !          1599:        ,JS_PropertyStub                /* delProperty  */
        !          1600:        ,js_node_get                    /* getProperty  */
        !          1601:        ,js_node_set                    /* setProperty  */
        !          1602:        ,JS_EnumerateStub               /* enumerate    */
        !          1603:        ,JS_ResolveStub                 /* resolve              */
        !          1604:        ,JS_ConvertStub                 /* convert              */
        !          1605:        ,JS_FinalizeStub                /* finalize             */
        !          1606: };
        !          1607: 
        !          1608: JSObject* DLLCALL js_CreateSystemObject(JSContext* cx, JSObject* parent
        !          1609:                                                                                ,scfg_t* cfg, time_t uptime, char* host_name, char* socklib_desc)
        !          1610: {
        !          1611:        char            str[256];
        !          1612:        uint            i;
        !          1613:        jsval           val;
        !          1614:        JSObject*       sysobj;
        !          1615:        JSObject*       statsobj;
        !          1616:        JSObject*       nodeobj;
        !          1617:        JSObject*       node_list;
        !          1618:        JSObject*       fido_addr_list;
        !          1619:        JSString*       js_str;
        !          1620: 
        !          1621:        sysobj = JS_DefineObject(cx, parent, "system", &js_system_class, NULL
        !          1622:                ,JSPROP_ENUMERATE|JSPROP_READONLY);
        !          1623: 
        !          1624:        if(sysobj==NULL)
        !          1625:                return(NULL);
        !          1626: 
        !          1627:        if(!JS_SetPrivate(cx, sysobj, cfg))     /* Store a pointer to scfg_t */
        !          1628:                return(NULL);
        !          1629: 
        !          1630:        if(!js_DefineSyncProperties(cx, sysobj, js_system_properties))
        !          1631:                return(NULL);
        !          1632: 
        !          1633:        if (!js_DefineSyncMethods(cx, sysobj, js_system_functions, FALSE)) 
        !          1634:                return(NULL);
        !          1635: 
        !          1636: #ifdef BUILD_JSDOCS
        !          1637:        js_DescribeSyncObject(cx,sysobj,"Global system-related properties and methods",310);
        !          1638:        js_CreateArrayOfStrings(cx, sysobj, "_property_desc_list", sys_prop_desc, JSPROP_READONLY);
        !          1639: #endif
        !          1640: 
        !          1641:        /****************************/
        !          1642:        /* static string properties */
        !          1643:        if((js_str=JS_NewStringCopyZ(cx, host_name))==NULL)
        !          1644:                return(NULL);
        !          1645:        val = STRING_TO_JSVAL(js_str);
        !          1646:        if(!JS_SetProperty(cx, sysobj, "host_name", &val))
        !          1647:                return(NULL);
        !          1648: 
        !          1649:        if((js_str=JS_NewStringCopyZ(cx, VERSION))==NULL)
        !          1650:                return(NULL);
        !          1651:        val = STRING_TO_JSVAL(js_str);
        !          1652:        if(!JS_SetProperty(cx, sysobj, "version", &val))
        !          1653:                return(NULL);
        !          1654: 
        !          1655:        sprintf(str,"%c",REVISION);
        !          1656:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
        !          1657:                return(NULL);
        !          1658:        val = STRING_TO_JSVAL(js_str);
        !          1659:        if(!JS_SetProperty(cx, sysobj, "revision", &val))
        !          1660:                return(NULL);
        !          1661: 
        !          1662:        SAFECOPY(str,beta_version);
        !          1663:        truncsp(str);
        !          1664:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
        !          1665:                return(NULL);
        !          1666:        val = STRING_TO_JSVAL(js_str);
        !          1667:        if(!JS_SetProperty(cx, sysobj, "beta_version", &val))
        !          1668:                return(NULL);
        !          1669: 
        !          1670: 
        !          1671:        sprintf(str,"%s%c%s",VERSION,REVISION,beta_version);
        !          1672:        truncsp(str);
        !          1673: #if defined(_DEBUG)
        !          1674:        strcat(str," Debug");
        !          1675: #endif
        !          1676:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
        !          1677:                return(NULL);
        !          1678:        val = STRING_TO_JSVAL(js_str);
        !          1679:        if(!JS_SetProperty(cx, sysobj, "full_version", &val))
        !          1680:                return(NULL);
        !          1681: 
        !          1682:        if((js_str=JS_NewStringCopyZ(cx, VERSION_NOTICE))==NULL)
        !          1683:                return(NULL);
        !          1684:        val = STRING_TO_JSVAL(js_str);
        !          1685:        if(!JS_SetProperty(cx, sysobj, "version_notice", &val))
        !          1686:                return(NULL);
        !          1687: 
        !          1688:        /* Numeric version properties */
        !          1689:        if(!JS_NewNumberValue(cx, VERSION_NUM, &val))
        !          1690:                return(NULL);
        !          1691:        if(!JS_SetProperty(cx, sysobj, "version_num", &val))
        !          1692:                return(NULL);
        !          1693: 
        !          1694:        if(!JS_NewNumberValue(cx, VERSION_HEX, &val))
        !          1695:                return(NULL);
        !          1696:        if(!JS_SetProperty(cx, sysobj, "version_hex", &val))
        !          1697:                return(NULL);
        !          1698: 
        !          1699:        if((js_str=JS_NewStringCopyZ(cx, PLATFORM_DESC))==NULL)
        !          1700:                return(NULL);
        !          1701:        val = STRING_TO_JSVAL(js_str);
        !          1702:        if(!JS_SetProperty(cx, sysobj, "platform", &val))
        !          1703:                return(NULL);
        !          1704: 
        !          1705:        if((js_str=JS_NewStringCopyZ(cx, socklib_version(str, socklib_desc)))==NULL)
        !          1706:                return(NULL);
        !          1707:        val = STRING_TO_JSVAL(js_str);
        !          1708:        if(!JS_SetProperty(cx, sysobj, "socket_lib", &val))
        !          1709:                return(NULL);
        !          1710: 
        !          1711:        sprintf(str,"SMBLIB %s",smb_lib_ver());
        !          1712:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
        !          1713:                return(NULL);
        !          1714:        val = STRING_TO_JSVAL(js_str);
        !          1715:        if(!JS_SetProperty(cx, sysobj, "msgbase_lib", &val))
        !          1716:                return(NULL);
        !          1717: 
        !          1718:        DESCRIBE_COMPILER(str);
        !          1719:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
        !          1720:                return(NULL);
        !          1721:        val = STRING_TO_JSVAL(js_str);
        !          1722:        if(!JS_SetProperty(cx, sysobj, "compiled_with", &val))
        !          1723:                return(NULL);
        !          1724: 
        !          1725:        sprintf(str,"%s %.5s",__DATE__,__TIME__);
        !          1726:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
        !          1727:                return(NULL);
        !          1728:        val = STRING_TO_JSVAL(js_str);
        !          1729:        if(!JS_SetProperty(cx, sysobj, "compiled_when", &val))
        !          1730:                return(NULL);
        !          1731: 
        !          1732:        if((js_str=JS_NewStringCopyZ(cx, COPYRIGHT_NOTICE))==NULL)
        !          1733:                return(NULL);
        !          1734:        val = STRING_TO_JSVAL(js_str);
        !          1735:        if(!JS_SetProperty(cx, sysobj, "copyright", &val))
        !          1736:                return(NULL);
        !          1737: 
        !          1738:        if((js_str=JS_NewStringCopyZ(cx
        !          1739:                ,(char *)JS_GetImplementationVersion()))==NULL)
        !          1740:                return(NULL);
        !          1741:        val = STRING_TO_JSVAL(js_str);
        !          1742:        if(!JS_SetProperty(cx, sysobj, "js_version", &val))
        !          1743:                return(NULL);
        !          1744: 
        !          1745:        if((js_str=JS_NewStringCopyZ(cx,os_version(str)))==NULL)
        !          1746:                return(NULL);
        !          1747:        val = STRING_TO_JSVAL(js_str);
        !          1748:        if(!JS_SetProperty(cx, sysobj, "os_version", &val))
        !          1749:                return(NULL);
        !          1750: 
        !          1751:        /***********************/
        !          1752: 
        !          1753:        JS_NewNumberValue(cx,uptime,&val);
        !          1754:        if(!JS_SetProperty(cx, sysobj, "uptime", &val))
        !          1755:                return(NULL);
        !          1756: 
        !          1757:        /* fido_addr_list property */
        !          1758: 
        !          1759:        if((fido_addr_list=JS_NewArrayObject(cx, 0, NULL))==NULL) 
        !          1760:                return(NULL);
        !          1761: 
        !          1762:        if(!JS_DefineProperty(cx, sysobj, "fido_addr_list", OBJECT_TO_JSVAL(fido_addr_list)
        !          1763:                , NULL, NULL, JSPROP_ENUMERATE))
        !          1764:                return(NULL);
        !          1765: 
        !          1766:        for(i=0;i<cfg->total_faddrs;i++) {
        !          1767:                val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,smb_faddrtoa(&cfg->faddr[i],str)));
        !          1768:                JS_SetElement(cx, fido_addr_list, i, &val);
        !          1769:        }
        !          1770: 
        !          1771:        statsobj = JS_DefineObject(cx, sysobj, "stats", &js_sysstats_class, NULL
        !          1772:                ,JSPROP_ENUMERATE|JSPROP_READONLY);
        !          1773: 
        !          1774:        if(statsobj==NULL)
        !          1775:                return(NULL);
        !          1776: 
        !          1777:        JS_SetPrivate(cx, statsobj, cfg);       /* Store a pointer to scfg_t */
        !          1778: 
        !          1779:        if(!js_DefineSyncProperties(cx, statsobj, js_sysstats_properties))
        !          1780:                return(NULL);
        !          1781: 
        !          1782: #ifdef BUILD_JSDOCS
        !          1783:        js_DescribeSyncObject(cx,statsobj,"System statistics",310);
        !          1784:        js_CreateArrayOfStrings(cx, statsobj, "_property_desc_list", sysstat_prop_desc, JSPROP_READONLY);
        !          1785: #endif
        !          1786: 
        !          1787:        /* node_list property */
        !          1788: 
        !          1789:        if((node_list=JS_NewArrayObject(cx, 0, NULL))==NULL) 
        !          1790:                return(NULL);
        !          1791: 
        !          1792:        if(!JS_DefineProperty(cx, sysobj, "node_list", OBJECT_TO_JSVAL(node_list)
        !          1793:                , NULL, NULL, JSPROP_ENUMERATE))
        !          1794:                return(NULL);
        !          1795: 
        !          1796:        for(i=0;i<cfg->sys_nodes && i<cfg->sys_lastnode;i++) {
        !          1797: 
        !          1798:                nodeobj = JS_NewObject(cx, &js_node_class, NULL, node_list);
        !          1799: 
        !          1800:                if(nodeobj==NULL)
        !          1801:                        return(NULL);
        !          1802: 
        !          1803:                /* Store node number */
        !          1804:                /* We have to shift it to make it look like a pointer to JS. :-( */
        !          1805:                if(!JS_SetPrivate(cx, nodeobj, (char*)((i+1)<<1)))      
        !          1806:                        return(NULL);
        !          1807: 
        !          1808:                if(!js_DefineSyncProperties(cx, nodeobj, js_node_properties))
        !          1809:                        return(NULL);
        !          1810: 
        !          1811: #ifdef BUILD_JSDOCS
        !          1812:                if(i==0) {
        !          1813:                        js_DescribeSyncObject(cx,nodeobj,"BBS node listing",310);
        !          1814:                        js_CreateArrayOfStrings(cx, nodeobj, "_property_desc_list", node_prop_desc, JSPROP_READONLY);
        !          1815:                }
        !          1816: #endif
        !          1817: 
        !          1818:                val=OBJECT_TO_JSVAL(nodeobj);
        !          1819:                if(!JS_SetElement(cx, node_list, i, &val))
        !          1820:                        return(NULL);
        !          1821:        }       
        !          1822: 
        !          1823:        return(sysobj);
        !          1824: }
        !          1825: 
        !          1826: #endif /* JAVSCRIPT */

unix.superglobalmegacorp.com

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