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

unix.superglobalmegacorp.com

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