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

1.1       root        1: /* js_file_area.c */
                      2: 
                      3: /* Synchronet JavaScript "File Area" Object */
                      4: 
                      5: /* $Id: js_file_area.c,v 1.45 2006/12/28 02:45:27 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: #ifdef BUILD_JSDOCS
                     43: 
                     44: static char* file_area_prop_desc[] = {
                     45:         "minimum amount of available disk space (in bytes) required for user uploads to be allowed"
                     46:        ,"file area settings (bitfield) - see <tt>FM_*</tt> in <tt>sbbsdefs.js</tt> for details"
                     47:        ,NULL
                     48: };
                     49: 
                     50: 
                     51: static char* lib_prop_desc[] = {
                     52:         "index into lib_list array (or -1 if not in array) <i>(introduced in v3.12)</i>"
                     53:        ,"unique number for this library"
                     54:        ,"library name"
                     55:        ,"library description"
                     56:        ,"library access requirements"
                     57:        ,"library link (for HTML index)"
                     58:        ,NULL
                     59: };
                     60: 
                     61: static char* dir_prop_desc[] = {
                     62: 
                     63:         "index into dir_list array (or -1 if not in array) <i>(introduced in v3.12)</i>"
                     64:        ,"unique number for this directory"
                     65:        ,"library index <i>(introduced in v3.12)</i>"
                     66:        ,"library number"
                     67:        ,"library name <i>(introduced in v3.12)</i>"
                     68:        ,"directory internal code"
                     69:        ,"directory name"
                     70:        ,"directory description"
                     71:        ,"directory file storage location"
                     72:        ,"directory access requirements"
                     73:        ,"directory upload requirements"
                     74:        ,"directory download requirements"
                     75:        ,"directory exemption requirements"
                     76:        ,"directory operator requirements"
                     77:        ,"allowed file extensions (comma delimited)"
                     78:        ,"upload semaphore file"
                     79:        ,"directory data storage location"
                     80:        ,"toggle options (bitfield)"
                     81:        ,"sequential (slow storage) device number"
                     82:        ,"sort order (see <tt>SORT_*</tt> in <tt>sbbsdefs.js</tt> for valid values)"
                     83:        ,"configured maximum number of files"
                     84:        ,"configured maximum age (in days) of files before expiration"
                     85:        ,"percent of file size awarded uploader in credits upon file upload"
                     86:        ,"percent of file size awarded uploader in credits upon subsequent downloads"
                     87:        ,"directory link (for HTML index)"
                     88:        ,"user has sufficient access to upload files"
                     89:        ,"user has sufficient access to download files"
                     90:        ,"user is exempt from download credit costs"
                     91:        ,"user has operator access to this directory"
                     92:        ,"directory is for offline storage <i>(introduced in v3.14)</i>"
                     93:        ,"directory is for uploads only <i>(introduced in v3.14)</i>"
                     94:        ,"directory is for uploads to sysop only <i>(introduced in v3.14)</i>"
                     95:        ,NULL
                     96: };
                     97: #endif
                     98: 
                     99: 
                    100: JSObject* DLLCALL js_CreateFileAreaObject(JSContext* cx, JSObject* parent, scfg_t* cfg
                    101:                                                                                  ,user_t* user, char* html_index_file)
                    102: {
                    103:        char            vpath[MAX_PATH+1];
                    104:        JSObject*       areaobj;
                    105:        JSObject*       alllibs;
                    106:        JSObject*       alldirs;
                    107:        JSObject*       libobj;
                    108:        JSObject*       dirobj;
                    109:        JSObject*       lib_list;
                    110:        JSObject*       dir_list;
                    111:        JSString*       js_str;
                    112:        jsval           val;
                    113:        jsuint          lib_index;
                    114:        jsuint          dir_index;
                    115:        uint            l,d;
                    116: 
                    117:        /* Return existing object if it's already been created */
                    118:        if(JS_GetProperty(cx,parent,"file_area",&val) && val!=JSVAL_VOID)
                    119:                areaobj = JSVAL_TO_OBJECT(val);
                    120:        else
                    121:                areaobj = JS_DefineObject(cx, parent, "file_area", NULL
                    122:                                                                , NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
                    123:        if(areaobj==NULL)
                    124:                return(NULL);
                    125: 
                    126:        /* file_area.properties */
                    127:        if(!JS_NewNumberValue(cx,cfg->min_dspace,&val))
                    128:                return(NULL);
                    129:        if(!JS_SetProperty(cx, areaobj, "min_diskspace", &val)) 
                    130:                return(NULL);
                    131: 
                    132:        if(!JS_NewNumberValue(cx,cfg->file_misc,&val))
                    133:                return(NULL);
                    134:        if(!JS_SetProperty(cx, areaobj, "settings", &val)) 
                    135:                return(NULL);
                    136: 
                    137:        /* file_area.lib[] */
                    138:        if((alllibs=JS_NewObject(cx, NULL, NULL, areaobj))==NULL)
                    139:                return(NULL);
                    140: 
                    141:        val=OBJECT_TO_JSVAL(alllibs);
                    142:        if(!JS_SetProperty(cx, areaobj, "lib", &val))
                    143:                return(NULL);
                    144: 
                    145:        /* file_area.dir[] */
                    146:        if((alldirs=JS_NewObject(cx, NULL, NULL, areaobj))==NULL)
                    147:                return(NULL);
                    148: 
                    149:        val=OBJECT_TO_JSVAL(alldirs);
                    150:        if(!JS_SetProperty(cx, areaobj, "dir", &val))
                    151:                return(NULL);
                    152: 
                    153:        if(html_index_file==NULL)
                    154:                html_index_file="";
                    155: 
                    156: #ifdef BUILD_JSDOCS
                    157:        js_DescribeSyncObject(cx,areaobj,"File Transfer Areas",310);
                    158: #endif
                    159: 
                    160:        /* file_area.lib_list[] */
                    161:        if((lib_list=JS_NewArrayObject(cx, 0, NULL))==NULL) 
                    162:                return(NULL);
                    163: 
                    164:        val=OBJECT_TO_JSVAL(lib_list);
                    165:        if(!JS_SetProperty(cx, areaobj, "lib_list", &val)) 
                    166:                return(NULL);
                    167: 
                    168:        for(l=0;l<cfg->total_libs;l++) {
                    169: 
                    170:                if((libobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL)
                    171:                        return(NULL);
                    172: 
                    173:                val=OBJECT_TO_JSVAL(libobj);
                    174:                lib_index=-1;
                    175:                if(user==NULL || chk_ar(cfg,cfg->lib[l]->ar,user)) {
                    176: 
                    177:                        if(!JS_GetArrayLength(cx, lib_list, &lib_index))
                    178:                                return(NULL);
                    179: 
                    180:                        if(!JS_SetElement(cx, lib_list, lib_index, &val))
                    181:                                return(NULL);
                    182:                }
                    183: 
                    184:                /* Add as property (associative array element) */
                    185:                if(!JS_DefineProperty(cx, alllibs, cfg->lib[l]->sname, val
                    186:                        ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE))
                    187:                        return(NULL);
                    188: 
                    189:                val=INT_TO_JSVAL(lib_index);
                    190:                if(!JS_SetProperty(cx, libobj, "index", &val))
                    191:                        return(NULL);
                    192: 
                    193:                val=INT_TO_JSVAL(l);
                    194:                if(!JS_SetProperty(cx, libobj, "number", &val))
                    195:                        return(NULL);
                    196: 
                    197:                if((js_str=JS_NewStringCopyZ(cx, cfg->lib[l]->sname))==NULL)
                    198:                        return(NULL);
                    199:                val=STRING_TO_JSVAL(js_str);
                    200:                if(!JS_SetProperty(cx, libobj, "name", &val))
                    201:                        return(NULL);
                    202: 
                    203:                if((js_str=JS_NewStringCopyZ(cx, cfg->lib[l]->lname))==NULL)
                    204:                        return(NULL);
                    205:                val=STRING_TO_JSVAL(js_str);
                    206:                if(!JS_SetProperty(cx, libobj, "description", &val))
                    207:                        return(NULL);
                    208: 
                    209:                if((js_str=JS_NewStringCopyZ(cx, cfg->lib[l]->arstr))==NULL)
                    210:                        return(NULL);
                    211:                val=STRING_TO_JSVAL(js_str);
                    212:                if(!JS_SetProperty(cx, libobj, "ars", &val))
                    213:                        return(NULL);
                    214: 
                    215:                sprintf(vpath,"/%s/%s",cfg->lib[l]->sname,html_index_file);
                    216:                if((js_str=JS_NewStringCopyZ(cx, vpath))==NULL)
                    217:                        return(NULL);
                    218:                val=STRING_TO_JSVAL(js_str);
                    219:                if(!JS_SetProperty(cx, libobj, "link", &val))
                    220:                        return(NULL);
                    221: 
                    222: #ifdef BUILD_JSDOCS
                    223:                js_DescribeSyncObject(cx,libobj,"File Transfer Libraries (current user has access to)",310);
                    224: #endif
                    225: 
                    226:                /* dir_list[] */
                    227:                if((dir_list=JS_NewArrayObject(cx, 0, NULL))==NULL) 
                    228:                        return(NULL);
                    229: 
                    230:                val=OBJECT_TO_JSVAL(dir_list);
                    231:                if(!JS_SetProperty(cx, libobj, "dir_list", &val)) 
                    232:                        return(NULL);
                    233: 
                    234:                for(d=0;d<cfg->total_dirs;d++) {
                    235:                        if(cfg->dir[d]->lib!=l)
                    236:                                continue;
                    237: 
                    238:                        if((dirobj=JS_NewObject(cx, NULL, NULL, NULL))==NULL)
                    239:                                return(NULL);
                    240: 
                    241:                        val=OBJECT_TO_JSVAL(dirobj);
                    242:                        dir_index=-1;
                    243:                        if(user==NULL || chk_ar(cfg,cfg->dir[d]->ar,user)) {
                    244: 
                    245:                                if(!JS_GetArrayLength(cx, dir_list, &dir_index))
                    246:                                        return(NULL);                                                           
                    247: 
                    248:                                if(!JS_SetElement(cx, dir_list, dir_index, &val))
                    249:                                        return(NULL);
                    250:                        }
                    251: 
                    252:                        /* Add as property (associative array element) */
                    253:                        if(!JS_DefineProperty(cx, alldirs, cfg->dir[d]->code, val
                    254:                                ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE))
                    255:                                return(NULL);
                    256: 
                    257:                        if(d==cfg->user_dir 
                    258:                                && !JS_DefineProperty(cx, areaobj, "user_dir", val
                    259:                                        ,NULL,NULL,JSPROP_READONLY))
                    260:                                return(NULL);
                    261: 
                    262:                        if(d==cfg->sysop_dir 
                    263:                                && !JS_DefineProperty(cx, areaobj, "sysop_dir", val
                    264:                                        ,NULL,NULL,JSPROP_READONLY))
                    265:                                return(NULL);
                    266: 
                    267:                        if(d==cfg->upload_dir 
                    268:                                && !JS_DefineProperty(cx, areaobj, "upload_dir", val
                    269:                                        ,NULL,NULL,JSPROP_READONLY))
                    270:                                return(NULL);
                    271: 
                    272:                        if(d==cfg->lib[l]->offline_dir
                    273:                                && !JS_DefineProperty(cx, libobj, "offline_dir", val
                    274:                                        ,NULL,NULL,JSPROP_READONLY))
                    275:                                return(NULL);
                    276: 
                    277:                        val=INT_TO_JSVAL(dir_index);
                    278:                        if(!JS_SetProperty(cx, dirobj, "index", &val))
                    279:                                return(NULL);
                    280: 
                    281:                        val=INT_TO_JSVAL(d);
                    282:                        if(!JS_SetProperty(cx, dirobj, "number", &val))
                    283:                                return(NULL);
                    284: 
                    285:                        val=INT_TO_JSVAL(lib_index);
                    286:                        if(!JS_SetProperty(cx, dirobj, "lib_index", &val))
                    287:                                return(NULL);
                    288: 
                    289:                        val=INT_TO_JSVAL(cfg->dir[d]->lib);
                    290:                        if(!JS_SetProperty(cx, dirobj, "lib_number", &val))
                    291:                                return(NULL);
                    292: 
                    293:                        if((js_str=JS_NewStringCopyZ(cx, cfg->lib[cfg->dir[d]->lib]->sname))==NULL)
                    294:                                return(NULL);
                    295:                        val=STRING_TO_JSVAL(js_str);
                    296:                        if(!JS_SetProperty(cx, dirobj, "lib_name", &val))
                    297:                                return(NULL);
                    298: 
                    299:                        if((js_str=JS_NewStringCopyZ(cx, cfg->dir[d]->code))==NULL)
                    300:                                return(NULL);
                    301:                        val=STRING_TO_JSVAL(js_str);
                    302:                        if(!JS_SetProperty(cx, dirobj, "code", &val))
                    303:                                return(NULL);
                    304: 
                    305:                        if((js_str=JS_NewStringCopyZ(cx, cfg->dir[d]->sname))==NULL)
                    306:                                return(NULL);
                    307:                        val=STRING_TO_JSVAL(js_str);
                    308:                        if(!JS_SetProperty(cx, dirobj, "name", &val))
                    309:                                return(NULL);
                    310: 
                    311:                        if((js_str=JS_NewStringCopyZ(cx, cfg->dir[d]->lname))==NULL)
                    312:                                return(NULL);
                    313:                        val=STRING_TO_JSVAL(js_str);
                    314:                        if(!JS_SetProperty(cx, dirobj, "description", &val))
                    315:                                return(NULL);
                    316: 
                    317:                        if((js_str=JS_NewStringCopyZ(cx, cfg->dir[d]->path))==NULL)
                    318:                                return(NULL);
                    319:                        val=STRING_TO_JSVAL(js_str);
                    320:                        if(!JS_SetProperty(cx, dirobj, "path", &val))
                    321:                                return(NULL);
                    322: 
                    323:                        if((js_str=JS_NewStringCopyZ(cx, cfg->dir[d]->arstr))==NULL)
                    324:                                return(NULL);
                    325:                        if(!JS_DefineProperty(cx, dirobj, "ars", STRING_TO_JSVAL(js_str)
                    326:                                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
                    327:                                return(NULL);
                    328: 
                    329:                        if((js_str=JS_NewStringCopyZ(cx, cfg->dir[d]->ul_arstr))==NULL)
                    330:                                return(NULL);
                    331:                        if(!JS_DefineProperty(cx, dirobj, "upload_ars", STRING_TO_JSVAL(js_str)
                    332:                                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
                    333:                                return(NULL);
                    334: 
                    335:                        if((js_str=JS_NewStringCopyZ(cx, cfg->dir[d]->dl_arstr))==NULL)
                    336:                                return(NULL);
                    337:                        if(!JS_DefineProperty(cx, dirobj, "download_ars", STRING_TO_JSVAL(js_str)
                    338:                                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
                    339:                                return(NULL);
                    340: 
                    341:                        if((js_str=JS_NewStringCopyZ(cx, cfg->dir[d]->ex_arstr))==NULL)
                    342:                                return(NULL);
                    343:                        if(!JS_DefineProperty(cx, dirobj, "exempt_ars", STRING_TO_JSVAL(js_str)
                    344:                                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))   /* exception here: Oct-15-2006 */
                    345:                                return(NULL);                                                                   /* ChangeScope->calloc() */
                    346: 
                    347:                        if((js_str=JS_NewStringCopyZ(cx, cfg->dir[d]->op_arstr))==NULL)
                    348:                                return(NULL);
                    349:                        if(!JS_DefineProperty(cx, dirobj, "operator_ars", STRING_TO_JSVAL(js_str)
                    350:                                ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY))
                    351:                                return(NULL);
                    352: 
                    353:                        if((js_str=JS_NewStringCopyZ(cx, cfg->dir[d]->exts))==NULL)
                    354:                                return(NULL);
                    355:                        val=STRING_TO_JSVAL(js_str);
                    356:                        if(!JS_SetProperty(cx, dirobj, "extensions", &val))
                    357:                                return(NULL);
                    358: 
                    359:                        if((js_str=JS_NewStringCopyZ(cx, cfg->dir[d]->upload_sem))==NULL)
                    360:                                return(NULL);
                    361:                        val=STRING_TO_JSVAL(js_str);
                    362:                        if(!JS_SetProperty(cx, dirobj, "upload_sem", &val))
                    363:                                return(NULL);
                    364: 
                    365:                        if((js_str=JS_NewStringCopyZ(cx, cfg->dir[d]->data_dir))==NULL)
                    366:                                return(NULL);
                    367:                        val=STRING_TO_JSVAL(js_str);
                    368:                        if(!JS_SetProperty(cx, dirobj, "data_dir", &val))
                    369:                                return(NULL);
                    370: 
                    371:                        if(!JS_NewNumberValue(cx,cfg->dir[d]->misc,&val))
                    372:                                return(NULL);
                    373:                        if(!JS_SetProperty(cx, dirobj, "settings", &val))
                    374:                                return(NULL);
                    375: 
                    376:                        val=INT_TO_JSVAL(cfg->dir[d]->seqdev);
                    377:                        if(!JS_SetProperty(cx, dirobj, "seqdev", &val))
                    378:                                return(NULL);
                    379: 
                    380:                        val=INT_TO_JSVAL(cfg->dir[d]->sort);
                    381:                        if(!JS_SetProperty(cx, dirobj, "sort", &val))
                    382:                                return(NULL);
                    383: 
                    384:                        val=INT_TO_JSVAL(cfg->dir[d]->maxfiles);
                    385:                        if(!JS_SetProperty(cx, dirobj, "max_files", &val))
                    386:                                return(NULL);
                    387: 
                    388:                        val=INT_TO_JSVAL(cfg->dir[d]->maxage);
                    389:                        if(!JS_SetProperty(cx, dirobj, "max_age", &val))
                    390:                                return(NULL);
                    391: 
                    392:                        val=INT_TO_JSVAL(cfg->dir[d]->up_pct);
                    393:                        if(!JS_SetProperty(cx, dirobj, "upload_credit_pct", &val))
                    394:                                return(NULL);
                    395: 
                    396:                        val=INT_TO_JSVAL(cfg->dir[d]->dn_pct);
                    397:                        if(!JS_SetProperty(cx, dirobj, "download_credit_pct", &val))
                    398:                                return(NULL);
                    399: 
                    400:                        sprintf(vpath,"/%s/%s/%s"
                    401:                                ,cfg->lib[l]->sname
                    402:                                ,cfg->dir[d]->code_suffix
                    403:                                ,html_index_file);
                    404:                        if((js_str=JS_NewStringCopyZ(cx, vpath))==NULL)
                    405:                                return(NULL);
                    406:                        val=STRING_TO_JSVAL(js_str);
                    407:                        if(!JS_SetProperty(cx, dirobj, "link", &val))
                    408:                                return(NULL);
                    409: 
                    410:                        if(user==NULL 
                    411:                                || (chk_ar(cfg,cfg->dir[d]->ul_ar,user) && !(user->rest&FLAG('U'))))
                    412:                                val=JSVAL_TRUE;
                    413:                        else
                    414:                                val=JSVAL_FALSE;
                    415:                        if(!JS_SetProperty(cx, dirobj, "can_upload", &val))
                    416:                                return(NULL);
                    417: 
                    418:                        if(user==NULL 
                    419:                                || (chk_ar(cfg,cfg->dir[d]->dl_ar,user) && !(user->rest&FLAG('D'))))
                    420:                                val=JSVAL_TRUE;
                    421:                        else
                    422:                                val=JSVAL_FALSE;
                    423:                        if(!JS_SetProperty(cx, dirobj, "can_download", &val))
                    424:                                return(NULL);
                    425: 
                    426:                        if(is_download_free(cfg,d,user))
                    427:                                val=JSVAL_TRUE;
                    428:                        else
                    429:                                val=JSVAL_FALSE;
                    430:                        if(!JS_SetProperty(cx, dirobj, "is_exempt", &val))
                    431:                                return(NULL);
                    432: 
                    433:                        if(user!=NULL 
                    434:                                && (user->level>=SYSOP_LEVEL 
                    435:                                        || (cfg->dir[d]->op_ar[0]!=0 
                    436:                                                && chk_ar(cfg,cfg->dir[d]->op_ar,user))))
                    437:                                val=JSVAL_TRUE;
                    438:                        else
                    439:                                val=JSVAL_FALSE;
                    440:                        if(!JS_SetProperty(cx, dirobj, "is_operator", &val))
                    441:                                return(NULL);
                    442: 
                    443:                        val=BOOLEAN_TO_JSVAL(d==cfg->lib[l]->offline_dir);
                    444:                        if(!JS_SetProperty(cx, dirobj, "is_offline", &val))
                    445:                                return(NULL);
                    446: 
                    447:                        val=BOOLEAN_TO_JSVAL(d==cfg->upload_dir);
                    448:                        if(!JS_SetProperty(cx, dirobj, "is_upload", &val))
                    449:                                return(NULL);
                    450: 
                    451:                        val=BOOLEAN_TO_JSVAL(d==cfg->sysop_dir);
                    452:                        if(!JS_SetProperty(cx, dirobj, "is_sysop", &val))
                    453:                                return(NULL);
                    454: 
                    455: #ifdef BUILD_JSDOCS
                    456:                        js_CreateArrayOfStrings(cx, dirobj, "_property_desc_list", dir_prop_desc, JSPROP_READONLY);
                    457:                        js_DescribeSyncObject(cx,dirobj,"File Transfer Directories  (current user has access to)",310);
                    458: #endif
                    459:                }
                    460: 
                    461: #ifdef BUILD_JSDOCS
                    462:                js_CreateArrayOfStrings(cx, libobj, "_property_desc_list", lib_prop_desc, JSPROP_READONLY);
                    463: #endif
                    464:        }
                    465: 
                    466: #ifdef BUILD_JSDOCS
                    467:        js_CreateArrayOfStrings(cx, areaobj, "_property_desc_list", file_area_prop_desc, JSPROP_READONLY);
                    468: 
                    469:        js_DescribeSyncObject(cx,alllibs,"Associative array of all libraries (use name as index)",312);
                    470:        JS_DefineProperty(cx,alllibs,"_dont_document",JSVAL_TRUE,NULL,NULL,JSPROP_READONLY);
                    471: 
                    472:        js_DescribeSyncObject(cx,alldirs,"Associative array of all directories (use internal code as index)",311);
                    473:        JS_DefineProperty(cx,alldirs,"_dont_document",JSVAL_TRUE,NULL,NULL,JSPROP_READONLY);
                    474: #endif
                    475: 
                    476:        return(areaobj);
                    477: }
                    478: 
                    479: #endif /* JAVSCRIPT */

unix.superglobalmegacorp.com

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