|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.