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

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

unix.superglobalmegacorp.com

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