|
|
1.1 root 1: /* exec.cpp */
2:
3: /* Synchronet command shell/module interpretter */
4:
1.1.1.2 ! root 5: /* $Id: exec.cpp,v 1.94 2011/09/10 01:45:21 rswindell Exp $ */
1.1 root 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: * *
1.1.1.2 ! root 11: * Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html *
1.1 root 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: #include "cmdshell.h"
1.1.1.2 ! root 40: #include "js_request.h"
1.1 root 41:
1.1.1.2 ! root 42: char ** sbbs_t::getstrvar(csi_t *bin, int32_t name)
1.1 root 43: {
44: uint i;
45:
46: if(sysvar_pi>=MAX_SYSVARS) sysvar_pi=0;
47: switch(name) {
48: case 0:
49: return((char **)&(bin->str));
50: case 0x490873f1:
51: sysvar_p[sysvar_pi]=(char*)useron.alias;
52: break;
53: case 0x5de44e8b:
54: sysvar_p[sysvar_pi]=(char*)useron.name;
55: break;
56: case 0x979ef1de:
57: sysvar_p[sysvar_pi]=(char*)useron.handle;
58: break;
59: case 0xc8cd5fb7:
60: sysvar_p[sysvar_pi]=(char*)useron.comp;
61: break;
62: case 0xcc7aca99:
63: sysvar_p[sysvar_pi]=(char*)useron.note;
64: break;
65: case 0xa842c43b:
66: sysvar_p[sysvar_pi]=(char*)useron.address;
67: break;
68: case 0x4ee1ff3a:
69: sysvar_p[sysvar_pi]=(char*)useron.location;
70: break;
71: case 0xf000aa78:
72: sysvar_p[sysvar_pi]=(char*)useron.zipcode;
73: break;
74: case 0xcdb7e4a9:
75: sysvar_p[sysvar_pi]=(char*)useron.pass;
76: break;
77: case 0x94d59a7a:
78: sysvar_p[sysvar_pi]=(char*)useron.birth;
79: break;
80: case 0xec2b8fb8:
81: sysvar_p[sysvar_pi]=(char*)useron.phone;
82: break;
83: case 0x08f65a2a:
84: sysvar_p[sysvar_pi]=(char*)useron.modem;
85: break;
86: case 0xc7e0e8ce:
87: sysvar_p[sysvar_pi]=(char*)useron.netmail;
88: break;
89: case 0xd3606303:
90: sysvar_p[sysvar_pi]=(char*)useron.tmpext;
91: break;
92: case 0x3178f9d6:
93: sysvar_p[sysvar_pi]=(char*)useron.comment;
94: break;
95:
96: case 0x41239e21:
97: sysvar_p[sysvar_pi]=(char*)connection;
98: break;
99: case 0x90fc82b4:
100: sysvar_p[sysvar_pi]=(char*)cid;
101: break;
102: case 0x15755030:
103: return((char **)&comspec);
104: case 0x5E049062:
105: sysvar_p[sysvar_pi]=question;
106: break;
107:
108: case 0xf19cd046:
109: sysvar_p[sysvar_pi]=(char*)wordwrap;
110: break;
111:
112: default:
113: if(bin->str_var && bin->str_var_name)
114: for(i=0;i<bin->str_vars;i++)
115: if(bin->str_var_name[i]==name)
116: return((char **)&(bin->str_var[i]));
117: if(global_str_var && global_str_var_name)
118: for(i=0;i<global_str_vars;i++)
119: if(global_str_var_name[i]==name)
120: return(&(global_str_var[i]));
1.1.1.2 ! root 121: return(NULL);
! 122: }
1.1 root 123:
124: return((char **)&sysvar_p[sysvar_pi++]);
125: }
126:
1.1.1.2 ! root 127: int32_t * sbbs_t::getintvar(csi_t *bin, int32_t name)
1.1 root 128: {
129: uint i;
130:
131: if(sysvar_li>=MAX_SYSVARS) sysvar_li=0;
132: switch(name) {
133: case 0:
134: sysvar_l[sysvar_li]=strtol((char*)bin->str,0,0);
135: break;
136: case 0x908ece53:
137: sysvar_l[sysvar_li]=useron.number;
138: break;
139: case 0xdcedf626:
140: sysvar_l[sysvar_li]=useron.uls;
141: break;
142: case 0xc1093f61:
143: sysvar_l[sysvar_li]=useron.dls;
144: break;
145: case 0x2039a29f:
146: sysvar_l[sysvar_li]=useron.posts;
147: break;
148: case 0x4a9f3955:
149: sysvar_l[sysvar_li]=useron.emails;
150: break;
151: case 0x0c8dcf3b:
152: sysvar_l[sysvar_li]=useron.fbacks;
153: break;
154: case 0x9a13bf95:
155: sysvar_l[sysvar_li]=useron.etoday;
156: break;
157: case 0xc9082cbd:
158: sysvar_l[sysvar_li]=useron.ptoday;
159: break;
160: case 0x7c72376d:
161: sysvar_l[sysvar_li]=useron.timeon;
162: break;
163: case 0xac72c50b:
164: sysvar_l[sysvar_li]=useron.textra;
165: break;
166: case 0x04807a11:
167: sysvar_l[sysvar_li]=useron.logons;
168: break;
169: case 0x52996eab:
170: sysvar_l[sysvar_li]=useron.ttoday;
171: break;
172: case 0x098bdfcb:
173: sysvar_l[sysvar_li]=useron.tlast;
174: break;
175: case 0xbd1cee5d:
176: sysvar_l[sysvar_li]=useron.ltoday;
177: break;
178: case 0x07954570:
179: sysvar_l[sysvar_li]=useron.xedit;
180: break;
181: case 0xedf6aa98:
182: sysvar_l[sysvar_li]=useron.shell;
183: break;
184: case 0x328ed476:
185: sysvar_l[sysvar_li]=useron.level;
186: break;
187: case 0x9e70e855:
188: sysvar_l[sysvar_li]=useron.sex;
189: break;
190: case 0x094cc42c:
191: sysvar_l[sysvar_li]=useron.rows;
192: break;
193: case 0xabc4317e:
194: sysvar_l[sysvar_li]=useron.prot;
195: break;
196: case 0x7dd9aac0:
197: sysvar_l[sysvar_li]=useron.leech;
198: break;
199: case 0x7c602a37:
1.1.1.2 ! root 200: return((int32_t *)&useron.misc);
1.1 root 201: case 0x61be0d36:
1.1.1.2 ! root 202: return((int32_t *)&useron.qwk);
1.1 root 203: case 0x665ac227:
1.1.1.2 ! root 204: return((int32_t *)&useron.chat);
1.1 root 205: case 0x951341ab:
1.1.1.2 ! root 206: return((int32_t *)&useron.flags1);
1.1 root 207: case 0x0c1a1011:
1.1.1.2 ! root 208: return((int32_t *)&useron.flags2);
1.1 root 209: case 0x7b1d2087:
1.1.1.2 ! root 210: return((int32_t *)&useron.flags3);
1.1 root 211: case 0xe579b524:
1.1.1.2 ! root 212: return((int32_t *)&useron.flags4);
1.1 root 213: case 0x12e7d6d2:
1.1.1.2 ! root 214: return((int32_t *)&useron.exempt);
1.1 root 215: case 0xfed3115d:
1.1.1.2 ! root 216: return((int32_t *)&useron.rest);
1.1 root 217: case 0xb65dd6d4:
1.1.1.2 ! root 218: return((int32_t *)&useron.ulb);
1.1 root 219: case 0xabb91f93:
1.1.1.2 ! root 220: return((int32_t *)&useron.dlb);
1.1 root 221: case 0x92fb364f:
1.1.1.2 ! root 222: return((int32_t *)&useron.cdt);
1.1 root 223: case 0xd0a99c72:
1.1.1.2 ! root 224: return((int32_t *)&useron.min);
1.1 root 225: case 0xd7ae3022:
1.1.1.2 ! root 226: return((int32_t *)&useron.freecdt);
1.1 root 227: case 0x1ef214ef:
1.1.1.2 ! root 228: return((int32_t *)&useron.firston);
1.1 root 229: case 0x0ea515b1:
1.1.1.2 ! root 230: return((int32_t *)&useron.laston);
1.1 root 231: case 0x2aaf9bd3:
1.1.1.2 ! root 232: return((int32_t *)&useron.expire);
1.1 root 233: case 0x89c91dc8:
1.1.1.2 ! root 234: return((int32_t *)&useron.pwmod);
1.1 root 235: case 0x5b0d0c54:
1.1.1.2 ! root 236: return((int32_t *)&useron.ns_time);
1.1 root 237:
238: case 0xae256560:
1.1.1.2 ! root 239: return((int32_t *)&cur_rate);
1.1 root 240: case 0x2b3c257f:
1.1.1.2 ! root 241: return((int32_t *)&cur_cps);
1.1 root 242: case 0x1c4455ee:
1.1.1.2 ! root 243: return((int32_t *)&dte_rate);
1.1 root 244: case 0x7fbf958e:
1.1.1.2 ! root 245: return((int32_t *)&lncntr);
1.1 root 246: case 0x5c1c1500:
1.1.1.2 ! root 247: return((int32_t *)&tos);
1.1 root 248: case 0x613b690e:
1.1.1.2 ! root 249: return((int32_t *)&rows);
1.1 root 250: case 0x205ace36:
1.1.1.2 ! root 251: return((int32_t *)&autoterm);
1.1 root 252: case 0x7d0ed0d1:
1.1.1.2 ! root 253: return((int32_t *)&console);
1.1 root 254: case 0xbf31a280:
1.1.1.2 ! root 255: return((int32_t *)&answertime);
1.1 root 256: case 0x83aa2a6a:
1.1.1.2 ! root 257: return((int32_t *)&logontime);
1.1 root 258: case 0xb50cb889:
1.1.1.2 ! root 259: return((int32_t *)&ns_time);
1.1 root 260: case 0xae92d249:
1.1.1.2 ! root 261: return((int32_t *)&last_ns_time);
1.1 root 262: case 0x97f99eef:
1.1.1.2 ! root 263: return((int32_t *)&online);
1.1 root 264: case 0x381d3c2a:
1.1.1.2 ! root 265: return((int32_t *)&sys_status);
1.1 root 266: case 0x7e29c819:
1.1.1.2 ! root 267: return((int32_t *)&cfg.sys_misc);
1.1 root 268: case 0x11c83294:
1.1.1.2 ! root 269: return((int32_t *)&cfg.sys_psnum);
1.1 root 270: case 0x02408dc5:
271: sysvar_l[sysvar_li]=sys_timezone(&cfg);
272: break;
273: case 0x78afeaf1:
274: sysvar_l[sysvar_li]=cfg.sys_pwdays;
275: break;
276: case 0xd859385f:
277: sysvar_l[sysvar_li]=cfg.sys_deldays;
278: break;
279: case 0x6392dc62:
280: sysvar_l[sysvar_li]=cfg.sys_autodel;
281: break;
282: case 0x698d59b4:
283: sysvar_l[sysvar_li]=cfg.sys_nodes;
284: break;
285: case 0x6fb1c46e:
286: sysvar_l[sysvar_li]=cfg.sys_exp_warn;
287: break;
288: case 0xdf391ca7:
289: sysvar_l[sysvar_li]=cfg.sys_lastnode;
290: break;
291: case 0xdd982780:
292: sysvar_l[sysvar_li]=cfg.sys_autonode;
293: break;
294: case 0xf53db6c7:
295: sysvar_l[sysvar_li]=cfg.node_scrnlen;
296: break;
297: case 0xa1f0fcb7:
298: sysvar_l[sysvar_li]=cfg.node_scrnblank;
299: break;
300: case 0x709c07da:
1.1.1.2 ! root 301: return((int32_t *)&cfg.node_misc);
1.1 root 302: case 0xb17e7914:
303: sysvar_l[sysvar_li]=cfg.node_valuser;
304: break;
305: case 0xadae168a:
306: sysvar_l[sysvar_li]=cfg.node_ivt;
307: break;
308: case 0x2aa89801:
309: sysvar_l[sysvar_li]=cfg.node_swap;
310: break;
311: case 0x4f02623a:
312: sysvar_l[sysvar_li]=cfg.node_minbps;
313: break;
314: case 0xe7a7fb07:
315: sysvar_l[sysvar_li]=cfg.node_num;
316: break;
317: case 0x6c8e350a:
318: sysvar_l[sysvar_li]=cfg.new_level;
319: break;
320: case 0xccfe7c5d:
1.1.1.2 ! root 321: return((int32_t *)&cfg.new_flags1);
1.1 root 322: case 0x55f72de7:
1.1.1.2 ! root 323: return((int32_t *)&cfg.new_flags2);
1.1 root 324: case 0x22f01d71:
1.1.1.2 ! root 325: return((int32_t *)&cfg.new_flags3);
1.1 root 326: case 0xbc9488d2:
1.1.1.2 ! root 327: return((int32_t *)&cfg.new_flags4);
1.1 root 328: case 0x4b0aeb24:
1.1.1.2 ! root 329: return((int32_t *)&cfg.new_exempt);
1.1 root 330: case 0x20cb6325:
1.1.1.2 ! root 331: return((int32_t *)&cfg.new_rest);
1.1 root 332: case 0x31178ba2:
1.1.1.2 ! root 333: return((int32_t *)&cfg.new_cdt);
1.1 root 334: case 0x7345219f:
1.1.1.2 ! root 335: return((int32_t *)&cfg.new_min);
1.1 root 336: case 0xb3f64be4:
337: sysvar_l[sysvar_li]=cfg.new_shell;
338: break;
339: case 0xa278584f:
1.1.1.2 ! root 340: return((int32_t *)&cfg.new_misc);
1.1 root 341: case 0x7342a625:
342: sysvar_l[sysvar_li]=cfg.new_expire;
343: break;
344: case 0x75dc4306:
345: sysvar_l[sysvar_li]=cfg.new_prot;
346: break;
347: case 0xfb394e27:
348: sysvar_l[sysvar_li]=cfg.expired_level;
349: break;
350: case 0x89b69753:
1.1.1.2 ! root 351: return((int32_t *)&cfg.expired_flags1);
1.1 root 352: case 0x10bfc6e9:
1.1.1.2 ! root 353: return((int32_t *)&cfg.expired_flags2);
1.1 root 354: case 0x67b8f67f:
1.1.1.2 ! root 355: return((int32_t *)&cfg.expired_flags3);
1.1 root 356: case 0xf9dc63dc:
1.1.1.2 ! root 357: return((int32_t *)&cfg.expired_flags4);
1.1 root 358: case 0x0e42002a:
1.1.1.2 ! root 359: return((int32_t *)&cfg.expired_exempt);
1.1 root 360: case 0x4569c62e:
1.1.1.2 ! root 361: return((int32_t *)&cfg.expired_rest);
1.1 root 362: case 0xfcf3542e:
363: sysvar_l[sysvar_li]=cfg.min_dspace;
364: break;
365: case 0xcf9ce02c:
366: sysvar_l[sysvar_li]=cfg.cdt_min_value;
367: break;
368: case 0xfcb5b274:
1.1.1.2 ! root 369: return((int32_t *)&cfg.cdt_per_dollar);
1.1 root 370: case 0x4db200d2:
371: sysvar_l[sysvar_li]=cfg.leech_pct;
372: break;
373: case 0x9a7d9cca:
374: sysvar_l[sysvar_li]=cfg.leech_sec;
375: break;
376: case 0x396b7167:
1.1.1.2 ! root 377: return((int32_t *)&cfg.netmail_cost);
1.1 root 378: case 0x5eeaff21:
379: sysvar_l[sysvar_li]=cfg.netmail_misc;
380: break;
381: case 0x82d9484e:
1.1.1.2 ! root 382: return((int32_t *)&cfg.inetmail_cost);
1.1 root 383: case 0xe558c608:
1.1.1.2 ! root 384: return((int32_t *)&cfg.inetmail_misc);
1.1 root 385:
386: case 0xc6e8539d:
1.1.1.2 ! root 387: return((int32_t *)&logon_ulb);
1.1 root 388: case 0xdb0c9ada:
1.1.1.2 ! root 389: return((int32_t *)&logon_dlb);
1.1 root 390: case 0xac58736f:
1.1.1.2 ! root 391: return((int32_t *)&logon_uls);
1.1 root 392: case 0xb1bcba28:
1.1.1.2 ! root 393: return((int32_t *)&logon_dls);
1.1 root 394: case 0x9c5051c9:
1.1.1.2 ! root 395: return((int32_t *)&logon_posts);
1.1 root 396: case 0xc82ba467:
1.1.1.2 ! root 397: return((int32_t *)&logon_emails);
1.1 root 398: case 0x8e395209:
1.1.1.2 ! root 399: return((int32_t *)&logon_fbacks);
1.1 root 400: case 0x8b12ba9d:
1.1.1.2 ! root 401: return((int32_t *)&posts_read);
1.1 root 402: case 0xe51c1956:
403: sysvar_l[sysvar_li]=(ulong)logfile_fp;
404: break;
405: case 0x5a22d4bd:
406: sysvar_l[sysvar_li]=(ulong)nodefile_fp;
407: break;
408: case 0x3a37c26b:
409: sysvar_l[sysvar_li]=(ulong)node_ext_fp;
410: break;
411:
412: case 0xeb6c9c73:
413: sysvar_l[sysvar_li]=errorlevel;
414: break;
415:
416: case 0x5aaccfc5:
417: sysvar_l[sysvar_li]=errno;
418: break;
419:
420: case 0x057e4cd4:
421: sysvar_l[sysvar_li]=timeleft;
422: break;
423:
424: case 0x1e5052a7:
1.1.1.2 ! root 425: return((int32_t *)&cfg.max_minutes);
1.1 root 426: case 0xedc643f1:
1.1.1.2 ! root 427: return((int32_t *)&cfg.max_qwkmsgs);
1.1 root 428:
429: case 0x430178ec:
1.1.1.2 ! root 430: return((int32_t *)&cfg.uq);
1.1 root 431:
432: case 0x455CB929:
433: return(&bin->ftp_mode);
434:
435: case 0x2105D2B9:
436: return(&bin->socket_error);
437:
438: case 0xA0023A2E:
1.1.1.2 ! root 439: return((int32_t *)&startup->options);
1.1 root 440:
441: case 0x16E2585F:
442: sysvar_l[sysvar_li]=client_socket;
443: break;
444:
445: default:
446: if(bin->int_var && bin->int_var_name)
447: for(i=0;i<bin->int_vars;i++)
448: if(bin->int_var_name[i]==name)
449: return(&bin->int_var[i]);
450: if(global_int_var && global_int_var_name)
451: for(i=0;i<global_int_vars;i++)
452: if(global_int_var_name[i]==name)
453: return(&global_int_var[i]);
1.1.1.2 ! root 454: return(NULL);
! 455: }
1.1 root 456:
457: return(&sysvar_l[sysvar_li++]);
458: }
459:
460: void sbbs_t::clearvars(csi_t *bin)
461: {
462: bin->str_vars=0;
463: bin->str_var=NULL;
464: bin->str_var_name=NULL;
465: bin->int_vars=0;
466: bin->int_var=NULL;
467: bin->int_var_name=NULL;
1.1.1.2 ! root 468: bin->dirs=0;
1.1 root 469: bin->files=0;
470: bin->loops=0;
471: bin->sockets=0;
472: bin->retval=0;
473: }
474:
475: void sbbs_t::freevars(csi_t *bin)
476: {
477: uint i;
478:
479: if(bin->str_var) {
480: for(i=0;i<bin->str_vars;i++)
481: if(bin->str_var[i])
482: free(bin->str_var[i]);
483: free(bin->str_var);
484: }
485: if(bin->int_var)
486: free(bin->int_var);
487: if(bin->str_var_name)
488: free(bin->str_var_name);
489: if(bin->int_var_name)
490: free(bin->int_var_name);
1.1.1.2 ! root 491: for(i=0;i<bin->dirs;i++) {
! 492: if(bin->dir[i]!=NULL) {
! 493: closedir(bin->dir[i]);
! 494: bin->dir[i]=NULL;
! 495: }
! 496: }
1.1 root 497: for(i=0;i<bin->files;i++) {
1.1.1.2 ! root 498: if(bin->file[i]!=NULL) {
! 499: fclose(bin->file[i]);
! 500: bin->file[i]=NULL;
1.1 root 501: }
502: }
503: for(i=0;i<bin->sockets;i++) {
1.1.1.2 ! root 504: if(bin->socket[i]!=0) {
! 505: close_socket(bin->socket[i]);
1.1 root 506: bin->socket[i]=0;
507: }
508: }
509: }
510:
511: /****************************************************************************/
512: /* Copies a new value (str) into the string variable pointed to by p */
513: /* re-allocating if necessary */
514: /****************************************************************************/
515: char * sbbs_t::copystrvar(csi_t *csi, char *p, char *str)
516: {
517: char *np; /* New pointer after realloc */
518: int i=0;
519:
520: if(p!=csi->str) {
521: if(p)
522: for(i=0;i<MAX_SYSVARS;i++)
523: if(p==sysvar_p[i])
524: break;
525: if(!p || i==MAX_SYSVARS) { /* Not system variable */
526: if((np=(char*)realloc(p,strlen(str)+1))==NULL)
527: errormsg(WHERE,ERR_ALLOC,"variable",strlen(str)+1);
528: else
1.1.1.2 ! root 529: p=np;
! 530: }
! 531: }
1.1 root 532: if(p)
533: strcpy(p,str);
534: return(p);
535: }
536:
537: #ifdef JAVASCRIPT
538:
539: static JSBool
540: js_BranchCallback(JSContext *cx, JSScript *script)
541: {
542: sbbs_t* sbbs;
543:
544: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
545: return(JS_FALSE);
546:
547: if(sbbs->js_branch.auto_terminate && !sbbs->online) {
1.1.1.2 ! root 548: JS_ReportWarning(cx,"Disconnected");
1.1 root 549: sbbs->js_branch.counter=0;
550: return(JS_FALSE);
551: }
552:
553: return(js_CommonBranchCallback(cx,&sbbs->js_branch));
554: }
555:
1.1.1.2 ! root 556: #ifdef USE_JS_OPERATION_CALLBACK
! 557: static JSBool
! 558: js_OperationCallback(JSContext *cx)
! 559: {
! 560: JSBool ret;
! 561:
! 562: JS_SetOperationCallback(cx, NULL);
! 563: ret=js_BranchCallback(cx, NULL);
! 564: JS_SetOperationCallback(cx, js_OperationCallback);
! 565: return ret;
! 566: }
! 567: #endif
! 568:
1.1 root 569: static const char* js_ext(const char* fname)
570: {
1.1.1.2 ! root 571: if(getfext(fname)==NULL)
1.1 root 572: return(".js");
573: return("");
574: }
575:
1.1.1.2 ! root 576: long sbbs_t::js_execfile(const char *cmd, const char* startup_dir, JSObject* scope)
1.1 root 577: {
578: char* p;
579: char* args=NULL;
580: char* fname;
581: int argc=0;
582: char cmdline[MAX_PATH+1];
583: char path[MAX_PATH+1];
1.1.1.2 ! root 584: JSObject* js_scope=scope;
1.1 root 585: JSScript* js_script=NULL;
586: jsval rval;
587: int32 result=0;
1.1.1.2 ! root 588:
1.1 root 589: if(js_cx==NULL) {
590: errormsg(WHERE,ERR_CHK,"JavaScript support",0);
591: errormsg(WHERE,ERR_EXEC,cmd,0);
1.1.1.2 ! root 592: return -1;
1.1 root 593: }
594:
595: SAFECOPY(cmdline,cmd);
596: p=strchr(cmdline,' ');
597: if(p!=NULL) {
598: *p=0;
599: args=p+1;
600: }
601: fname=cmdline;
602:
1.1.1.2 ! root 603: path[0]=0;
1.1 root 604: if(strcspn(fname,"/\\")==strlen(fname)) {
1.1.1.2 ! root 605: if(startup_dir!=NULL && *startup_dir)
! 606: SAFEPRINTF3(path,"%s%s%s",startup_dir,fname,js_ext(fname));
! 607: if(path[0]==0 || !fexistcase(path)) {
! 608: SAFEPRINTF3(path,"%s%s%s",cfg.mods_dir,fname,js_ext(fname));
! 609: if(cfg.mods_dir[0]==0 || !fexistcase(path))
! 610: SAFEPRINTF3(path,"%s%s%s",cfg.exec_dir,fname,js_ext(fname));
! 611: }
1.1 root 612: } else
613: SAFECOPY(path,fname);
614:
615: if(!fexistcase(path)) {
616: errormsg(WHERE,ERR_OPEN,path,O_RDONLY);
1.1.1.2 ! root 617: return -1;
1.1 root 618: }
619:
1.1.1.2 ! root 620: JS_BEGINREQUEST(js_cx);
! 621: if(js_scope==NULL)
! 622: js_scope=JS_NewObject(js_cx, NULL, NULL, js_glob);
1.1 root 623:
624: if(js_scope!=NULL) {
625:
626: JSObject* argv=JS_NewArrayObject(js_cx, 0, NULL);
627:
628: JS_DefineProperty(js_cx, js_scope, "argv", OBJECT_TO_JSVAL(argv)
629: ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE);
630:
1.1.1.2 ! root 631: /* TODO: Handle quoted "one arg" syntax here? */
1.1 root 632: if(args!=NULL && argv!=NULL) {
633: while(*args) {
634: p=strchr(args,' ');
635: if(p!=NULL)
636: *p=0;
637: while(*args && *args==' ') args++; /* Skip spaces */
638: JSString* arg = JS_NewStringCopyZ(js_cx, args);
639: if(arg==NULL)
640: break;
641: jsval val=STRING_TO_JSVAL(arg);
642: if(!JS_SetElement(js_cx, argv, argc, &val))
643: break;
644: argc++;
645: if(p==NULL) /* last arg */
646: break;
647: args+=(strlen(args)+1);
648: }
649: }
650: JS_DefineProperty(js_cx, js_scope, "argc", INT_TO_JSVAL(argc)
651: ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE);
652:
653: JS_ClearPendingException(js_cx);
654:
655: js_script=JS_CompileFile(js_cx, js_scope, path);
656: }
657:
658: if(js_scope==NULL || js_script==NULL) {
659: JS_ReportPendingException(js_cx); /* Added Feb-2-2006, rswindell */
1.1.1.2 ! root 660: JS_ENDREQUEST(js_cx);
1.1 root 661: errormsg(WHERE,"compiling",path,0);
1.1.1.2 ! root 662: return -1;
1.1 root 663: }
664:
1.1.1.2 ! root 665: if(scope==NULL) {
! 666: js_branch.counter=0; // Reset loop counter
1.1 root 667:
1.1.1.2 ! root 668: #ifdef USE_JS_OPERATION_CALLBACK
! 669: JS_SetOperationCallback(js_cx, js_OperationCallback);
! 670: #else
! 671: JS_SetBranchCallback(js_cx, js_BranchCallback);
! 672: #endif
1.1 root 673:
1.1.1.2 ! root 674: js_PrepareToExecute(js_cx, js_glob, path, startup_dir);
! 675: }
1.1 root 676: JS_ExecuteScript(js_cx, js_scope, js_script, &rval);
677:
1.1.1.2 ! root 678: if(scope==NULL) {
! 679: JS_GetProperty(js_cx, js_scope, "exit_code", &rval);
! 680: if(rval!=JSVAL_VOID)
! 681: JS_ValueToInt32(js_cx,rval,&result);
1.1 root 682:
1.1.1.2 ! root 683: js_EvalOnExit(js_cx, js_scope, &js_branch);
! 684: }
1.1 root 685:
1.1.1.2 ! root 686: JS_ReportPendingException(js_cx); /* Added Dec-4-2005, rswindell */
1.1 root 687:
688: JS_DestroyScript(js_cx, js_script);
689:
1.1.1.2 ! root 690: if(scope==NULL)
! 691: JS_ClearScope(js_cx, js_scope);
1.1 root 692:
693: JS_GC(js_cx);
694:
1.1.1.2 ! root 695: JS_ENDREQUEST(js_cx);
! 696:
1.1 root 697: return(result);
698: }
699: #endif
700:
701: /* Important change as of Nov-16-2006, 'cmdline' may contain args */
1.1.1.2 ! root 702: long sbbs_t::exec_bin(const char *cmdline, csi_t *csi, const char* startup_dir)
1.1 root 703: {
704: char str[MAX_PATH+1];
705: char mod[MAX_PATH+1];
706: char modname[MAX_PATH+1];
707: char* p;
708: int file;
709: csi_t bin;
710:
711: SAFECOPY(mod,cmdline);
712: p=mod;
713: FIND_CHAR(p,' ');
714: if(*p) {
715: *p=0; /* terminate 'mod' */
716: p++; /* skip space */
717: SKIP_CHAR(p,' '); /* skip more spaces */
718: }
1.1.1.2 ! root 719: if(*p)
! 720: strcpy(main_csi.str, p);
1.1 root 721:
722: #ifdef JAVASCRIPT
723: if((p=getfext(mod))!=NULL && stricmp(p,".js")==0)
1.1.1.2 ! root 724: return(js_execfile(cmdline, startup_dir));
! 725: if(p==NULL && startup_dir!=NULL && *startup_dir) {
! 726: SAFEPRINTF2(str,"%s%s.js", startup_dir, mod);
! 727: if(fexistcase(str))
! 728: return(js_execfile(cmdline, startup_dir));
! 729: }
1.1 root 730: if(cfg.mods_dir[0]) {
1.1.1.2 ! root 731: SAFEPRINTF2(str,"%s%s.js",cfg.mods_dir,mod);
1.1 root 732: if(fexistcase(str))
1.1.1.2 ! root 733: return(js_execfile(cmdline, startup_dir));
1.1 root 734: }
735: #endif
736:
737: SAFECOPY(modname,mod);
738: if(!strchr(modname,'.'))
739: strcat(modname,".bin");
740:
1.1.1.2 ! root 741: SAFEPRINTF2(str,"%s%s",cfg.mods_dir,modname);
1.1 root 742: if(cfg.mods_dir[0]==0 || !fexistcase(str)) {
1.1.1.2 ! root 743:
! 744: #ifdef JAVASCRIPT
! 745: SAFEPRINTF2(str,"%s%s.js",cfg.exec_dir,mod);
! 746: if(fexistcase(str))
! 747: return(js_execfile(cmdline, startup_dir));
! 748: #endif
! 749:
! 750: SAFEPRINTF2(str,"%s%s",cfg.exec_dir,modname);
1.1 root 751: fexistcase(str);
752: }
753: if((file=nopen(str,O_RDONLY))==-1) {
754: errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
755: return(-1);
756: }
757:
1.1.1.2 ! root 758: memcpy(&bin,csi,sizeof(csi_t));
! 759: clearvars(&bin);
! 760: bin.length=(uint32_t)filelength(file);
1.1 root 761: if((bin.cs=(uchar *)malloc(bin.length))==NULL) {
762: close(file);
763: errormsg(WHERE,ERR_ALLOC,str,bin.length);
764: return(-1);
765: }
766: if(lread(file,bin.cs,bin.length)!=bin.length) {
767: close(file);
768: errormsg(WHERE,ERR_READ,str,bin.length);
769: free(bin.cs);
770: return(-1);
771: }
772: close(file);
773:
774: bin.ip=bin.cs;
775: bin.rets=0;
776: bin.cmdrets=0;
777: bin.misc=0;
778:
779: while(exec(&bin)==0)
780: if(!(bin.misc&CS_OFFLINE_EXEC)) {
781: checkline();
782: if(!online)
783: break;
784: }
785:
786: freevars(&bin);
787: free(bin.cs);
788: csi->logic=bin.logic;
789: return(bin.retval);
790: }
791:
792: /****************************************************************************/
793: /* Skcsi->ip to a specific instruction */
794: /****************************************************************************/
795: void sbbs_t::skipto(csi_t *csi, uchar inst)
796: {
797: int i,j;
798:
799: while(csi->ip<csi->cs+csi->length && ((inst&0x80) || *csi->ip!=inst)) {
800:
801: if(*csi->ip==CS_IF_TRUE || *csi->ip==CS_IF_FALSE
802: || (*csi->ip>=CS_IF_GREATER && *csi->ip<=CS_IF_LESS_OR_EQUAL)) {
803: csi->ip++;
804: skipto(csi,CS_ENDIF);
805: csi->ip++;
1.1.1.2 ! root 806: continue;
! 807: }
1.1 root 808:
809: if(inst==CS_ELSEORENDIF
810: && (*csi->ip==CS_ELSE || *csi->ip==CS_ENDIF))
811: break;
812:
813: if(inst==CS_NEXTCASE
814: && (*csi->ip==CS_CASE || *csi->ip==CS_DEFAULT
815: || *csi->ip==CS_END_SWITCH))
816: break;
817:
818: if(*csi->ip==CS_SWITCH) {
819: csi->ip++;
820: csi->ip+=4; /* Skip variable name */
821: skipto(csi,CS_END_SWITCH);
822: csi->ip++;
1.1.1.2 ! root 823: continue;
! 824: }
1.1 root 825:
826: if(*csi->ip==CS_CASE) {
827: csi->ip++;
828: csi->ip+=4; /* Skip value */
829: skipto(csi,CS_NEXTCASE);
1.1.1.2 ! root 830: continue;
! 831: }
1.1 root 832:
833: if(*csi->ip==CS_CMDKEY || *csi->ip==CS_CMDCHAR) {
834: csi->ip+=2;
835: skipto(csi,CS_END_CMD);
836: csi->ip++;
1.1.1.2 ! root 837: continue;
! 838: }
1.1 root 839: if(*csi->ip==CS_CMDSTR || *csi->ip==CS_CMDKEYS) {
840: csi->ip++; /* skip inst */
841: while(*(csi->ip++)); /* skip string */
842: skipto(csi,CS_END_CMD);
843: csi->ip++;
1.1.1.2 ! root 844: continue;
! 845: }
1.1 root 846:
847: if(*csi->ip>=CS_FUNCTIONS) {
848: csi->ip++;
1.1.1.2 ! root 849: continue;
! 850: }
1.1 root 851:
852: if(*csi->ip>=CS_MISC) {
853: switch(*csi->ip) {
854: case CS_VAR_INSTRUCTION:
855: csi->ip++;
856: switch(*(csi->ip++)) {
857: case SHOW_VARS:
858: continue;
859: case PRINT_VAR:
860: case DEFINE_STR_VAR:
861: case DEFINE_INT_VAR:
862: case DEFINE_GLOBAL_STR_VAR:
863: case DEFINE_GLOBAL_INT_VAR:
864: case TIME_INT_VAR:
865: case STRUPR_VAR:
866: case STRLWR_VAR:
867: case TRUNCSP_STR_VAR:
868: case CHKFILE_VAR:
869: case COPY_CHAR:
870: case STRIP_CTRL_STR_VAR:
871: csi->ip+=4; /* Skip variable name */
872: continue;
873: case GETSTR_VAR:
874: case GETNAME_VAR:
875: case GETLINE_VAR:
876: case GETSTRUPR_VAR:
877: case SHIFT_STR_VAR:
878: case SEND_FILE_VIA_VAR:
879: case RECEIVE_FILE_VIA_VAR:
880: case COMPARE_FIRST_CHAR:
881: case SHIFT_TO_FIRST_CHAR:
882: case SHIFT_TO_LAST_CHAR:
883: csi->ip+=4; /* Skip variable name */
884: csi->ip++; /* Skip char */
885: continue;
886: case PRINTTAIL_VAR_MODE:
887: csi->ip++; /* Skip length */
888: case PRINTFILE_VAR_MODE:
889: case GETNUM_VAR:
890: csi->ip+=4; /* Skip variable name */
891: csi->ip+=2; /* Skip max num */
892: continue;
893: case STRNCMP_VAR:
894: csi->ip++; /* Skip length */
895: case SET_STR_VAR:
896: case COMPARE_STR_VAR:
897: case CAT_STR_VAR:
898: case STRSTR_VAR:
899: case TELNET_GATE_STR:
900: csi->ip+=4; /* Skip variable name */
901: while(*(csi->ip++)); /* skip string */
902: continue;
903: case FORMAT_TIME_STR:
904: csi->ip+=4; /* Skip destination variable */
905: while(*(csi->ip++)); /* Skip string */
906: csi->ip+=4; /* Skip int variable */
907: continue;
908: case FORMAT_STR_VAR: /* SPRINTF */
909: csi->ip+=4; /* Skip destination variable */
910: case VAR_PRINTF:
911: case VAR_PRINTF_LOCAL:
912: while(*(csi->ip++)); /* Skip string */
913: j=*(csi->ip++); /* Skip number of arguments */
914: for(i=0;i<j;i++)
915: csi->ip+=4; /* Skip arguments */
916: continue;
917: case SEND_FILE_VIA:
918: case RECEIVE_FILE_VIA:
919: csi->ip++; /* Skip prot */
920: while(*(csi->ip++)); /* Skip filepath */
921: continue;
922: case GETSTR_MODE:
923: case STRNCMP_VARS:
924: csi->ip++; /* Skip length */
925: default:
926: csi->ip+=8; /* Skip two variable names or var & val */
1.1.1.2 ! root 927: continue;
! 928: }
1.1 root 929:
930: case CS_FIO_FUNCTION:
931: csi->ip++;
932: switch(*(csi->ip++)) {
933: case FIO_OPEN:
934: csi->ip+=4; /* File handle */
935: csi->ip+=2; /* Access */
936: while(*(csi->ip++)); /* path/filename */
937: continue;
938: case FIO_CLOSE:
939: case FIO_FLUSH:
940: case FIO_EOF:
941: case REMOVE_FILE:
942: case REMOVE_DIR:
943: case CHANGE_DIR:
944: case MAKE_DIR:
945: case REWIND_DIR:
946: case CLOSE_DIR:
947: csi->ip+=4; /* File handle */
948: continue;
949: case FIO_SET_ETX:
950: csi->ip++;
951: continue;
952: case FIO_PRINTF:
953: csi->ip+=4; /* File handle */
954: while(*(csi->ip++)); /* String */
955: j=*(csi->ip++); /* Number of arguments */
956: for(i=0;i<j;i++)
957: csi->ip+=4; /* Arguments */
958: continue;
959: case FIO_READ:
960: case FIO_WRITE:
961: case FIO_SEEK:
962: case FIO_SEEK_VAR:
963: case FIO_OPEN_VAR:
964: csi->ip+=4; /* File handle */
965: csi->ip+=4; /* Variable */
966: csi->ip+=2; /* Length/access */
967: continue;
968: case FIO_READ_VAR:
969: case FIO_WRITE_VAR:
970: csi->ip+=4; /* File handle */
971: csi->ip+=4; /* Buf Variable */
972: csi->ip+=4; /* Length Variable */
973: continue;
974: default:
975: csi->ip+=4; /* File handle */
976: csi->ip+=4; /* Variable */
1.1.1.2 ! root 977: continue;
! 978: }
1.1 root 979:
980: case CS_NET_FUNCTION:
981: csi->ip++;
982: switch(*(csi->ip++)) {
983: case CS_SOCKET_CONNECT:
984: csi->ip+=4; /* socket */
985: csi->ip+=4; /* address */
986: csi->ip+=2; /* port */
987: continue;
988: case CS_SOCKET_NREAD:
989: csi->ip+=4; /* socket */
990: csi->ip+=4; /* intvar */
991: continue;
992: case CS_SOCKET_READ:
993: case CS_SOCKET_READLINE:
994: case CS_SOCKET_PEEK:
995: csi->ip+=4; /* socket */
996: csi->ip+=4; /* buffer */
997: csi->ip+=2; /* length */
998: continue;
999: case CS_SOCKET_WRITE:
1000: csi->ip+=4; /* socket */
1001: csi->ip+=4; /* strvar */
1002: continue;
1003:
1004: case CS_FTP_LOGIN:
1005: case CS_FTP_GET:
1006: case CS_FTP_PUT:
1007: case CS_FTP_RENAME:
1008: csi->ip+=4; /* socket */
1009: csi->ip+=4; /* username/path */
1010: csi->ip+=4; /* password/path */
1011: continue;
1012: case CS_FTP_DIR:
1013: case CS_FTP_CWD:
1014: case CS_FTP_DELETE:
1015: csi->ip+=4; /* socket */
1016: csi->ip+=4; /* path */
1017: continue;
1018:
1019: default:
1020: csi->ip+=4; /* socket */
1.1.1.2 ! root 1021: continue;
! 1022: }
1.1 root 1023:
1024: case CS_COMPARE_ARS:
1025: csi->ip++;
1026: csi->ip+=(*csi->ip);
1027: csi->ip++;
1028: break;
1029: case CS_TOGGLE_USER_MISC:
1030: case CS_COMPARE_USER_MISC:
1031: case CS_TOGGLE_USER_CHAT:
1032: case CS_COMPARE_USER_CHAT:
1033: case CS_TOGGLE_USER_QWK:
1034: case CS_COMPARE_USER_QWK:
1035: csi->ip+=5;
1036: break;
1037: case CS_REPLACE_TEXT:
1038: csi->ip+=3; /* skip inst and text # */
1039: while(*(csi->ip++)); /* skip string */
1040: break;
1041: case CS_USE_INT_VAR:
1042: csi->ip+=7; // inst, var, offset, len
1043: break;
1044: default:
1.1.1.2 ! root 1045: csi->ip++;
! 1046: }
! 1047: continue;
! 1048: }
1.1 root 1049:
1050: if(*csi->ip==CS_ONE_MORE_BYTE) {
1051: if(inst==CS_END_LOOP && *(csi->ip+1)==CS_END_LOOP)
1052: break;
1053:
1054: csi->ip++; /* skip extension */
1055: csi->ip++; /* skip instruction */
1056:
1057: if(*(csi->ip-1)==CS_LOOP_BEGIN) { /* nested loop */
1058: skipto(csi,CS_END_LOOP);
1059: csi->ip+=2;
1060: }
1061:
1.1.1.2 ! root 1062: continue;
! 1063: }
1.1 root 1064:
1065: if(*csi->ip==CS_TWO_MORE_BYTES) {
1066: csi->ip++; /* skip extension */
1067: csi->ip++; /* skip instruction */
1068: csi->ip++; /* skip argument */
1.1.1.2 ! root 1069: continue;
! 1070: }
1.1 root 1071:
1072: if(*csi->ip==CS_THREE_MORE_BYTES) {
1073: csi->ip++; /* skip extension */
1074: csi->ip++; /* skip instruction */
1075: csi->ip+=2; /* skip argument */
1.1.1.2 ! root 1076: continue;
! 1077: }
1.1 root 1078:
1079: if(*csi->ip==CS_STR_FUNCTION) {
1080: csi->ip++; /* skip extension */
1081: csi->ip++; /* skip instruction */
1082: while(*(csi->ip++)); /* skip string */
1.1.1.2 ! root 1083: continue;
! 1084: }
1.1 root 1085:
1086: if(*csi->ip>=CS_ASCIIZ) {
1087: csi->ip++; /* skip inst */
1088: while(*(csi->ip++)); /* skip string */
1.1.1.2 ! root 1089: continue;
! 1090: }
1.1 root 1091:
1092: if(*csi->ip>=CS_THREE_BYTE) {
1093: csi->ip+=3;
1.1.1.2 ! root 1094: continue;
! 1095: }
1.1 root 1096:
1097: if(*csi->ip>=CS_TWO_BYTE) {
1098: csi->ip+=2;
1.1.1.2 ! root 1099: continue;
! 1100: }
1.1 root 1101:
1.1.1.2 ! root 1102: csi->ip++;
! 1103: }
1.1 root 1104: }
1105:
1106:
1107: int sbbs_t::exec(csi_t *csi)
1108: {
1109: char str[256],*path;
1110: char tmp[512];
1111: uchar buf[1025],ch;
1112: int i,j,file;
1113: long l;
1114: FILE *stream;
1115:
1116: if(usrgrps)
1117: cursubnum=usrsub[curgrp][cursub[curgrp]]; /* Used for ARS */
1118: else
1119: cursubnum=INVALID_SUB;
1120: if(usrlibs) {
1121: curdirnum=usrdir[curlib][curdir[curlib]]; /* Used for ARS */
1.1.1.2 ! root 1122: path=cfg.dir[usrdir[curlib][curdir[curlib]]]->path;
! 1123: }
1.1 root 1124: else {
1125: curdirnum=INVALID_DIR;
1.1.1.2 ! root 1126: path=nulstr;
! 1127: }
1.1 root 1128: now=time(NULL);
1129:
1130: if(csi->ip>=csi->cs+csi->length)
1131: return(1);
1132:
1133: if(*csi->ip>=CS_FUNCTIONS)
1134: return(exec_function(csi));
1135:
1136: /**********************************************/
1137: /* Miscellaneous variable length instructions */
1138: /**********************************************/
1139:
1140: if(*csi->ip>=CS_MISC)
1141: return(exec_misc(csi,path));
1142:
1143: /********************************/
1144: /* ASCIIZ argument instructions */
1145: /********************************/
1146:
1147: if(*csi->ip>=CS_ASCIIZ) {
1148: switch(*(csi->ip++)) {
1149: case CS_STR_FUNCTION:
1150: switch(*(csi->ip++)) {
1151: case CS_LOGIN:
1152: csi->logic=login(csi->str,(char*)csi->ip);
1153: break;
1154: case CS_LOAD_TEXT:
1155: csi->logic=LOGIC_FALSE;
1156: for(i=0;i<TOTAL_TEXT;i++)
1157: if(text[i]!=text_sav[i]) {
1158: if(text[i]!=nulstr)
1159: free(text[i]);
1.1.1.2 ! root 1160: text[i]=text_sav[i];
! 1161: }
! 1162: SAFEPRINTF2(str,"%s%s.dat"
1.1 root 1163: ,cfg.ctrl_dir,cmdstr((char*)csi->ip,path,csi->str,(char*)buf));
1164: if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
1165: errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
1.1.1.2 ! root 1166: break;
! 1167: }
1.1 root 1168: for(i=0;i<TOTAL_TEXT && !feof(stream);i++) {
1.1.1.2 ! root 1169: if((text[i]=readtext((long *)NULL,stream,i))==NULL) {
1.1 root 1170: i--;
1.1.1.2 ! root 1171: continue;
! 1172: }
1.1 root 1173: if(!strcmp(text[i],text_sav[i])) { /* If identical */
1174: free(text[i]); /* Don't alloc */
1.1.1.2 ! root 1175: text[i]=text_sav[i];
! 1176: }
1.1 root 1177: else if(text[i][0]==0) {
1178: free(text[i]);
1.1.1.2 ! root 1179: text[i]=nulstr;
! 1180: }
! 1181: }
1.1 root 1182: if(i<TOTAL_TEXT) {
1183: fclose(stream);
1184: errormsg(WHERE,ERR_READ,str,TOTAL_TEXT);
1.1.1.2 ! root 1185: break;
! 1186: }
1.1 root 1187: fclose(stream);
1188: csi->logic=LOGIC_TRUE;
1189: break;
1190: default:
1191: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
1.1.1.2 ! root 1192: break;
! 1193: }
1.1 root 1194: while(*(csi->ip++)); /* Find NULL */
1195: return(0);
1196: case CS_LOG:
1197: log(cmdstr((char*)csi->ip,path,csi->str,(char*)buf));
1198: break;
1199: case CS_GETCMD:
1200: csi->cmd=(uchar)getkeys((char*)csi->ip,0);
1201: if((char)csi->cmd==-1)
1202: csi->cmd=3;
1203: break;
1204: case CS_CMDSTR:
1205: if(stricmp(csi->str,(char*)csi->ip)) {
1206: while(*(csi->ip++)); /* Find NULL */
1207: skipto(csi,CS_END_CMD);
1208: csi->ip++;
1.1.1.2 ! root 1209: return(0);
! 1210: }
1.1 root 1211: break;
1212: case CS_CMDKEYS:
1213: for(i=0;csi->ip[i];i++)
1214: if(csi->cmd==csi->ip[i])
1215: break;
1216: if(!csi->ip[i]) {
1217: while(*(csi->ip++)); /* Find NULL */
1218: skipto(csi,CS_END_CMD);
1219: csi->ip++;
1.1.1.2 ! root 1220: return(0);
! 1221: }
1.1 root 1222: break;
1223: case CS_GET_TEMPLATE:
1224: gettmplt(csi->str,(char*)csi->ip,K_LINE);
1225: if(sys_status&SS_ABORT)
1226: csi->str[0]=0;
1227: csi->cmd=csi->str[0];
1228: break;
1229: case CS_TRASHCAN:
1230: csi->logic=!trashcan(csi->str,(char*)csi->ip);
1231: break;
1232: case CS_CREATE_SIF:
1233: create_sif_dat((char*)csi->ip,csi->str);
1234: break;
1235: case CS_READ_SIF:
1236: read_sif_dat((char*)csi->ip,csi->str);
1237: break;
1238: case CS_MNEMONICS:
1239: mnemonics((char*)csi->ip);
1240: break;
1241: case CS_PRINT:
1242: putmsg(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),P_SAVEATR|P_NOABORT);
1243: break;
1244: case CS_PRINT_LOCAL:
1245: if(online==ON_LOCAL)
1246: eprintf(LOG_INFO,"%s",cmdstr((char*)csi->ip,path,csi->str,(char*)buf));
1247: else
1248: lputs(LOG_INFO,cmdstr((char*)csi->ip,path,csi->str,(char*)buf));
1249: break;
1250: case CS_PRINT_REMOTE:
1251: putcom(cmdstr((char*)csi->ip,path,csi->str,(char*)buf));
1252: break;
1253: case CS_PRINTFILE:
1254: printfile(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),P_SAVEATR);
1255: break;
1256: case CS_PRINTFILE_REMOTE:
1257: if(online!=ON_REMOTE || !(console&CON_R_ECHO))
1258: break;
1259: console&=~CON_L_ECHO;
1260: printfile(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),P_SAVEATR);
1261: console|=CON_L_ECHO;
1262: break;
1263: case CS_PRINTFILE_LOCAL:
1264: if(!(console&CON_L_ECHO))
1265: break;
1266: console&=~CON_R_ECHO;
1267: printfile(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),P_SAVEATR);
1268: console|=CON_R_ECHO;
1269: break;
1270: case CS_CHKFILE:
1271: csi->logic=!fexistcase(cmdstr((char*)csi->ip,path,csi->str,(char*)buf));
1272: break;
1273: case CS_EXEC:
1274: external(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),0);
1275: break;
1276: case CS_EXEC_INT:
1.1.1.2 ! root 1277: external(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),EX_STDIO);
1.1 root 1278: break;
1279: case CS_EXEC_XTRN:
1280: for(i=0;i<cfg.total_xtrns;i++)
1281: if(!stricmp(cfg.xtrn[i]->code,(char*)csi->ip))
1282: break;
1283: if(i<cfg.total_xtrns)
1284: exec_xtrn(i);
1285: break;
1286: case CS_EXEC_BIN:
1.1.1.2 ! root 1287: exec_bin(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),csi,/* startup_dir: */NULL);
1.1 root 1288: break;
1289: case CS_YES_NO:
1290: csi->logic=!yesno(cmdstr((char*)csi->ip,path,csi->str,(char*)buf));
1291: break;
1292: case CS_NO_YES:
1293: csi->logic=!noyes(cmdstr((char*)csi->ip,path,csi->str,(char*)buf));
1294: break;
1295: case CS_MENU:
1296: menu(cmdstr((char*)csi->ip,path,csi->str,(char*)buf));
1297: break;
1298: case CS_SETSTR:
1299: strcpy(csi->str,cmdstr((char*)csi->ip,path,csi->str,(char*)buf));
1300: break;
1301: case CS_SET_MENU_DIR:
1302: cmdstr((char*)csi->ip,path,csi->str,menu_dir);
1303: break;
1304: case CS_SET_MENU_FILE:
1305: cmdstr((char*)csi->ip,path,csi->str,menu_file);
1306: break;
1307: case CS_COMPARE_STR:
1308: csi->logic=stricmp(csi->str,cmdstr((char*)csi->ip,path,csi->str,(char*)buf));
1309: break;
1310: case CS_COMPARE_KEYS:
1311: for(i=0;csi->ip[i];i++)
1312: if(csi->cmd==csi->ip[i])
1313: break;
1314: if(csi->ip[i])
1315: csi->logic=LOGIC_TRUE;
1316: else
1317: csi->logic=LOGIC_FALSE;
1318: break;
1319: case CS_COMPARE_WORD:
1320: csi->logic=strnicmp(csi->str,(char*)csi->ip,strlen((char*)csi->ip));
1321: break;
1322: default:
1323: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
1.1.1.2 ! root 1324: break;
! 1325: }
1.1 root 1326: while(*(csi->ip++)); /* Find NULL */
1.1.1.2 ! root 1327: return(0);
! 1328: }
1.1 root 1329:
1330: if(*csi->ip>=CS_THREE_BYTE) {
1331: switch(*(csi->ip++)) {
1332: case CS_THREE_MORE_BYTES:
1333: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
1334: return(0);
1335: case CS_GOTO:
1336: csi->ip=csi->cs+*((ushort *)(csi->ip));
1337: return(0);
1338: case CS_CALL:
1339: if(csi->rets<MAX_RETS) {
1340: csi->ret[csi->rets++]=csi->ip+2;
1341: csi->ip=csi->cs+*((ushort *)(csi->ip));
1342: }
1343: return(0);
1344: case CS_MSWAIT:
1345: mswait(*(ushort *)csi->ip);
1346: csi->ip+=2;
1347: return(0);
1348: case CS_TOGGLE_NODE_MISC:
1349: if(getnodedat(cfg.node_num,&thisnode,true)==0) {
1350: thisnode.misc^=*(ushort *)csi->ip;
1351: putnodedat(cfg.node_num,&thisnode);
1352: }
1353: csi->ip+=2;
1354: return(0);
1355: case CS_COMPARE_NODE_MISC:
1356: getnodedat(cfg.node_num,&thisnode,0);
1357: if((thisnode.misc&*(ushort *)csi->ip)==*(ushort *)csi->ip)
1358: csi->logic=LOGIC_TRUE;
1359: else
1360: csi->logic=LOGIC_FALSE;
1361: csi->ip+=2;
1362: return(0);
1363: case CS_ADJUST_USER_CREDITS:
1364: i=*(short *)csi->ip;
1365: l=i*1024L;
1366: if(l<0)
1367: subtract_cdt(&cfg,&useron,-l);
1368: else
1369: useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10,l);
1370: csi->ip+=2;
1371: return(0);
1372: case CS_ADJUST_USER_MINUTES:
1373: i=*(short *)csi->ip;
1374: useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10,i);
1375: csi->ip+=2;
1376: return(0);
1377: case CS_GETNUM:
1378: i=*(short *)csi->ip;
1379: csi->ip+=2;
1380: l=getnum(i);
1381: if(l<=0) {
1382: csi->str[0]=0;
1.1.1.2 ! root 1383: csi->logic=LOGIC_FALSE;
! 1384: }
1.1 root 1385: else {
1386: sprintf(csi->str,"%lu",l);
1.1.1.2 ! root 1387: csi->logic=LOGIC_TRUE;
! 1388: }
1.1 root 1389: return(0);
1390:
1391: case CS_TOGGLE_USER_FLAG:
1392: i=*(csi->ip++);
1393: ch=*(csi->ip++);
1394: switch(i) {
1395: case '1':
1396: useron.flags1^=FLAG(ch);
1397: putuserrec(&cfg,useron.number,U_FLAGS1,8
1398: ,ultoa(useron.flags1,tmp,16));
1399: break;
1400: case '2':
1401: useron.flags2^=FLAG(ch);
1402: putuserrec(&cfg,useron.number,U_FLAGS2,8
1403: ,ultoa(useron.flags2,tmp,16));
1404: break;
1405: case '3':
1406: useron.flags3^=FLAG(ch);
1407: putuserrec(&cfg,useron.number,U_FLAGS3,8
1408: ,ultoa(useron.flags3,tmp,16));
1409: break;
1410: case '4':
1411: useron.flags4^=FLAG(ch);
1412: putuserrec(&cfg,useron.number,U_FLAGS4,8
1413: ,ultoa(useron.flags4,tmp,16));
1414: break;
1415: case 'R':
1416: useron.rest^=FLAG(ch);
1417: putuserrec(&cfg,useron.number,U_REST,8
1418: ,ultoa(useron.rest,tmp,16));
1419: break;
1420: case 'E':
1421: useron.exempt^=FLAG(ch);
1422: putuserrec(&cfg,useron.number,U_EXEMPT,8
1423: ,ultoa(useron.exempt,tmp,16));
1424: break;
1425: default:
1426: errormsg(WHERE,ERR_CHK,"user flag type",*(csi->ip-2));
1.1.1.2 ! root 1427: return(0);
! 1428: }
1.1 root 1429: return(0);
1430: case CS_REVERT_TEXT:
1431: i=*(ushort *)csi->ip;
1432: csi->ip+=2;
1433: if((ushort)i==0xffff) {
1434: for(i=0;i<TOTAL_TEXT;i++) {
1435: if(text[i]!=text_sav[i] && text[i]!=nulstr)
1436: free(text[i]);
1.1.1.2 ! root 1437: text[i]=text_sav[i];
! 1438: }
! 1439: return(0);
! 1440: }
1.1 root 1441: i--;
1442: if(i>=TOTAL_TEXT) {
1443: errormsg(WHERE,ERR_CHK,"revert text #",i);
1.1.1.2 ! root 1444: return(0);
! 1445: }
1.1 root 1446: if(text[i]!=text_sav[i] && text[i]!=nulstr)
1447: free(text[i]);
1448: text[i]=text_sav[i];
1449: return(0);
1450: default:
1451: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
1.1.1.2 ! root 1452: return(0);
! 1453: }
! 1454: }
1.1 root 1455:
1456: if(*csi->ip>=CS_TWO_BYTE) {
1457: switch(*(csi->ip++)) {
1458: case CS_TWO_MORE_BYTES:
1459: switch(*(csi->ip++)) {
1460: case CS_USER_EVENT:
1461: user_event((user_event_t)*(csi->ip++));
1462: return(0);
1463: }
1464: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
1465: return(0);
1466: case CS_SETLOGIC:
1467: csi->logic=*csi->ip++;
1468: return(0);
1469: case CS_CMDKEY:
1470: if( ((*csi->ip)==CS_DIGIT && isdigit(csi->cmd))
1471: || ((*csi->ip)==CS_EDIGIT && csi->cmd&0x80
1472: && isdigit(csi->cmd&0x7f))) {
1473: csi->ip++;
1.1.1.2 ! root 1474: return(0);
! 1475: }
1.1 root 1476: if(csi->cmd!=*csi->ip) {
1477: csi->ip++;
1.1.1.2 ! root 1478: skipto(csi,CS_END_CMD); /* skip code */
! 1479: }
1.1 root 1480: csi->ip++; /* skip key */
1481: return(0);
1482: case CS_CMDCHAR:
1483: if(csi->cmd!=*csi->ip) {
1484: csi->ip++;
1.1.1.2 ! root 1485: skipto(csi,CS_END_CMD); /* skip code */
! 1486: }
1.1 root 1487: csi->ip++; /* skip key */
1488: return(0);
1489: case CS_NODE_ACTION:
1490: action=*csi->ip++;
1491: return(0);
1492: case CS_NODE_STATUS:
1493: if(getnodedat(cfg.node_num,&thisnode,true)==0) {
1494: thisnode.status=*csi->ip++;
1495: putnodedat(cfg.node_num,&thisnode);
1496: } else
1497: csi->ip++;
1498: return(0);
1499: case CS_MULTINODE_CHAT:
1500: multinodechat(*csi->ip++);
1501: return(0);
1502: case CS_GETSTR:
1503: csi->logic=LOGIC_TRUE;
1504: getstr(csi->str,*csi->ip++,0);
1505: if(sys_status&SS_ABORT) {
1506: csi->str[0]=0;
1.1.1.2 ! root 1507: csi->logic=LOGIC_FALSE;
! 1508: }
1.1 root 1509: if(csi->str[0]=='/' && csi->str[1])
1510: csi->cmd=csi->str[1]|0x80;
1511: else
1512: csi->cmd=csi->str[0];
1513: return(0);
1514: case CS_GETLINE:
1515: getstr(csi->str,*csi->ip++,K_LINE);
1516: if(sys_status&SS_ABORT)
1517: csi->str[0]=0;
1518: if(csi->str[0]=='/' && csi->str[1])
1519: csi->cmd=csi->str[1]|0x80;
1520: else
1521: csi->cmd=csi->str[0];
1522: return(0);
1523: case CS_GETSTRUPR:
1524: getstr(csi->str,*csi->ip++,K_UPPER);
1525: if(sys_status&SS_ABORT)
1526: csi->str[0]=0;
1527: if(csi->str[0]=='/' && csi->str[1])
1528: csi->cmd=csi->str[1]|0x80;
1529: else
1530: csi->cmd=csi->str[0];
1531: return(0);
1532: case CS_GETNAME:
1533: getstr(csi->str,*csi->ip++,K_UPRLWR);
1534: if(sys_status&SS_ABORT)
1535: csi->str[0]=0;
1536: return(0);
1537: case CS_SHIFT_STR:
1538: i=*(csi->ip++);
1539: j=strlen(csi->str);
1540: if(i>j)
1541: i=j;
1542: if(i)
1543: memmove(csi->str,csi->str+i,j+1);
1544: return(0);
1545: case CS_COMPARE_KEY:
1546: if( ((*csi->ip)==CS_DIGIT && isdigit(csi->cmd))
1547: || ((*csi->ip)==CS_EDIGIT && csi->cmd&0x80
1548: && isdigit(csi->cmd&0x7f))) {
1549: csi->ip++;
1.1.1.2 ! root 1550: csi->logic=LOGIC_TRUE;
! 1551: }
1.1 root 1552: else {
1553: if(csi->cmd==*(csi->ip++))
1554: csi->logic=LOGIC_TRUE;
1555: else
1.1.1.2 ! root 1556: csi->logic=LOGIC_FALSE;
! 1557: }
1.1 root 1558: return(0);
1559: case CS_COMPARE_CHAR:
1560: if(csi->cmd==*(csi->ip++))
1561: csi->logic=LOGIC_TRUE;
1562: else
1563: csi->logic=LOGIC_FALSE;
1564: return(0);
1565: case CS_SET_USER_LEVEL:
1566: useron.level=*(csi->ip++);
1567: putuserrec(&cfg,useron.number,U_LEVEL,2,ultoa(useron.level,tmp,10));
1568: return(0);
1569: case CS_SET_USER_STRING:
1570: csi->logic=LOGIC_FALSE;
1571: if(!csi->str[0]) {
1572: csi->ip++;
1.1.1.2 ! root 1573: return(0);
! 1574: }
1.1 root 1575: switch(*(csi->ip++)) {
1576: case USER_STRING_ALIAS:
1577: if(!isalpha(csi->str[0]) || trashcan(csi->str,"name"))
1578: break;
1579: i=matchuser(&cfg,csi->str,TRUE /*sysop_alias*/);
1580: if(i && i!=useron.number)
1581: break;
1582: sprintf(useron.alias,"%.*s",LEN_ALIAS,csi->str);
1583: putuserrec(&cfg,useron.number,U_ALIAS,LEN_ALIAS,useron.alias);
1584: putusername(&cfg,useron.number,useron.alias);
1585: csi->logic=LOGIC_TRUE;
1586: break;
1587: case USER_STRING_REALNAME:
1588: if(trashcan(csi->str,"name"))
1589: break;
1590: if(cfg.uq&UQ_DUPREAL
1.1.1.2 ! root 1591: && userdatdupe(useron.number,U_NAME,LEN_NAME,csi->str))
1.1 root 1592: break;
1593: sprintf(useron.name,"%.*s",LEN_NAME,csi->str);
1594: putuserrec(&cfg,useron.number,U_NAME,LEN_NAME
1595: ,useron.name);
1596: csi->logic=LOGIC_TRUE;
1597: break;
1598: case USER_STRING_HANDLE:
1599: if(trashcan(csi->str,"name"))
1600: break;
1601: if(cfg.uq&UQ_DUPHAND
1.1.1.2 ! root 1602: && userdatdupe(useron.number,U_HANDLE,LEN_HANDLE,csi->str))
1.1 root 1603: break;
1604: sprintf(useron.handle,"%.*s",LEN_HANDLE,csi->str);
1605: putuserrec(&cfg,useron.number,U_HANDLE,LEN_HANDLE
1606: ,useron.handle);
1607: csi->logic=LOGIC_TRUE;
1608: break;
1609: case USER_STRING_COMPUTER:
1610: sprintf(useron.comp,"%.*s",LEN_COMP,csi->str);
1611: putuserrec(&cfg,useron.number,U_COMP,LEN_COMP
1612: ,useron.comp);
1613: csi->logic=LOGIC_TRUE;
1614: break;
1615: case USER_STRING_NOTE:
1616: sprintf(useron.note,"%.*s",LEN_NOTE,csi->str);
1617: putuserrec(&cfg,useron.number,U_NOTE,LEN_NOTE
1618: ,useron.note);
1619: csi->logic=LOGIC_TRUE;
1620: break;
1621: case USER_STRING_ADDRESS:
1622: sprintf(useron.address,"%.*s",LEN_ADDRESS,csi->str);
1623: putuserrec(&cfg,useron.number,U_ADDRESS,LEN_ADDRESS
1624: ,useron.address);
1625: csi->logic=LOGIC_TRUE;
1626: break;
1627: case USER_STRING_LOCATION:
1628: sprintf(useron.location,"%.*s",LEN_LOCATION,csi->str);
1629: putuserrec(&cfg,useron.number,U_LOCATION,LEN_LOCATION
1630: ,useron.location);
1631: csi->logic=LOGIC_TRUE;
1632: break;
1633: case USER_STRING_ZIPCODE:
1634: sprintf(useron.zipcode,"%.*s",LEN_ZIPCODE,csi->str);
1635: putuserrec(&cfg,useron.number,U_ZIPCODE,LEN_ZIPCODE
1636: ,useron.zipcode);
1637: csi->logic=LOGIC_TRUE;
1638: break;
1639: case USER_STRING_PASSWORD:
1640: sprintf(useron.pass,"%.*s",LEN_PASS,csi->str);
1641: putuserrec(&cfg,useron.number,U_PASS,LEN_PASS
1642: ,useron.pass);
1643: csi->logic=LOGIC_TRUE;
1644: break;
1645: case USER_STRING_BIRTHDAY:
1646: if(!getage(&cfg,csi->str))
1647: break;
1648: sprintf(useron.birth,"%.*s",LEN_BIRTH,csi->str);
1649: putuserrec(&cfg,useron.number,U_BIRTH,LEN_BIRTH
1650: ,useron.birth);
1651: csi->logic=LOGIC_TRUE;
1652: break;
1653: case USER_STRING_PHONE:
1654: if(trashcan(csi->str,"phone"))
1655: break;
1656: sprintf(useron.phone,"%.*s",LEN_PHONE,csi->str);
1657: putuserrec(&cfg,useron.number,U_PHONE,LEN_PHONE
1658: ,useron.phone);
1659: csi->logic=LOGIC_TRUE;
1660: break;
1661: case USER_STRING_MODEM:
1662: sprintf(useron.modem,"%.*s",LEN_MODEM,csi->str);
1663: putuserrec(&cfg,useron.number,U_MODEM,LEN_MODEM
1664: ,useron.phone);
1665: csi->logic=LOGIC_TRUE;
1666: break;
1667: case USER_STRING_COMMENT:
1668: sprintf(useron.comment,"%.*s",LEN_COMMENT,csi->str);
1669: putuserrec(&cfg,useron.number,U_COMMENT,LEN_COMMENT
1670: ,useron.comment);
1671: csi->logic=LOGIC_TRUE;
1672: break;
1673: case USER_STRING_NETMAIL:
1674: sprintf(useron.netmail,"%.*s",LEN_NETMAIL,csi->str);
1675: putuserrec(&cfg,useron.number,U_NETMAIL,LEN_NETMAIL
1676: ,useron.netmail);
1677: csi->logic=LOGIC_TRUE;
1678: break;
1679: default:
1680: errormsg(WHERE,ERR_CHK,"user string type",*(csi->ip-1));
1.1.1.2 ! root 1681: return(0);
! 1682: }
1.1 root 1683: return(0);
1684: default:
1685: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
1.1.1.2 ! root 1686: return(0);
! 1687: }
! 1688: }
1.1 root 1689:
1690:
1691: /*********************************/
1692: /* Single Byte Instrcutions ONLY */
1693: /*********************************/
1694:
1695: switch(*(csi->ip++)) {
1696: case CS_ONE_MORE_BYTE: /* Just one MORE byte */
1697: switch(*(csi->ip++)) {
1698: case CS_OFFLINE:
1699: csi->misc|=CS_OFFLINE_EXEC;
1700: return(0);
1701: case CS_ONLINE:
1702: csi->misc&=~CS_OFFLINE_EXEC;
1703: return(0);
1704: case CS_NEWUSER:
1705: if(newuser())
1706: csi->logic=LOGIC_TRUE;
1707: else
1708: csi->logic=LOGIC_FALSE;
1709: return(0);
1710: case CS_LOGON:
1711: if(logon())
1712: csi->logic=LOGIC_TRUE;
1713: else
1714: csi->logic=LOGIC_FALSE;
1715: return(0);
1716: case CS_LOGOUT:
1717: logout();
1718: return(0);
1719: case CS_EXIT:
1720: return(1);
1721: case CS_LOOP_BEGIN:
1722: if(csi->loops<MAX_LOOPDEPTH)
1723: csi->loop_home[csi->loops++]=(csi->ip-1);
1724: return(0);
1725: case CS_BREAK_LOOP:
1726: if(csi->loops) {
1727: skipto(csi,CS_END_LOOP);
1728: csi->ip+=2;
1729: csi->loops--;
1730: }
1731: return(0);
1732: case CS_END_LOOP:
1733: case CS_CONTINUE_LOOP:
1734: if(csi->loops)
1735: csi->ip=csi->loop_home[csi->loops-1];
1736: return(0);
1737: default:
1738: errormsg(WHERE,ERR_CHK,"one byte extended function"
1739: ,*(csi->ip-1));
1.1.1.2 ! root 1740: return(0);
! 1741: }
1.1 root 1742: case CS_CRLF:
1743: CRLF;
1744: return(0);
1745: case CS_CLS:
1746: CLS;
1747: return(0);
1748: case CS_PAUSE:
1749: pause();
1750: return(0);
1751: case CS_PAUSE_RESET:
1752: lncntr=0;
1753: return(0);
1754: case CS_GETLINES:
1755: ansi_getlines();
1756: return(0);
1757: case CS_HANGUP:
1758: hangup();
1759: return(0);
1760: case CS_LOGKEY:
1761: logch(csi->cmd,0);
1762: return(0);
1763: case CS_LOGKEY_COMMA:
1764: logch(csi->cmd,1);
1765: return(0);
1766: case CS_LOGSTR:
1767: log(csi->str);
1768: return(0);
1769: case CS_CHKSYSPASS:
1770: csi->logic=!chksyspass();
1771: return(0);
1772: case CS_PUT_NODE:
1773: if(getnodedat(cfg.node_num,&thisnode,true)==0)
1774: putnodedat(cfg.node_num,&thisnode);
1775: return(0);
1776: case CS_SYNC:
1777: SYNC;
1778: return(0);
1779: case CS_ASYNC:
1780: ASYNC;
1781: return(0);
1782: case CS_GETTIMELEFT:
1783: gettimeleft();
1784: return(0);
1785: case CS_RETURN:
1786: if(!csi->rets)
1787: return(1);
1788: csi->ip=csi->ret[--csi->rets];
1789: return(0);
1790: case CS_GETKEY:
1791: csi->cmd=getkey(K_UPPER);
1792: return(0);
1793: case CS_GETCHAR:
1794: csi->cmd=getkey(0);
1795: return(0);
1796: case CS_INKEY:
1797: csi->cmd=toupper(inkey(K_NONE,1));
1798: if(csi->cmd)
1799: csi->logic=LOGIC_TRUE;
1800: else
1801: csi->logic=LOGIC_FALSE;
1802: return(0);
1803: case CS_INCHAR:
1804: csi->cmd=inkey(K_NONE,1);
1805: if(csi->cmd)
1806: csi->logic=LOGIC_TRUE;
1807: else
1808: csi->logic=LOGIC_FALSE;
1809: return(0);
1810: case CS_GETKEYE:
1811: csi->cmd=getkey(K_UPPER);
1812: if(csi->cmd=='/') {
1813: outchar('/');
1814: csi->cmd=getkey(K_UPPER);
1.1.1.2 ! root 1815: csi->cmd|=0x80;
! 1816: }
1.1 root 1817: return(0);
1818: case CS_GETFILESPEC:
1819: if(getfilespec(csi->str))
1820: csi->logic=LOGIC_TRUE;
1821: else
1822: csi->logic=LOGIC_FALSE;
1823: return(0);
1824: case CS_SAVELINE:
1825: SAVELINE;
1826: return(0);
1827: case CS_RESTORELINE:
1828: RESTORELINE;
1829: return(0);
1830: case CS_SELECT_SHELL:
1831: csi->logic=select_shell() ? LOGIC_TRUE:LOGIC_FALSE;
1832: return(0);
1833: case CS_SET_SHELL:
1834: csi->logic=LOGIC_TRUE;
1835: for(i=0;i<cfg.total_shells;i++)
1836: if(!stricmp(csi->str,cfg.shell[i]->code)
1.1.1.2 ! root 1837: && chk_ar(cfg.shell[i]->ar,&useron,&client))
1.1 root 1838: break;
1839: if(i<cfg.total_shells) {
1840: useron.shell=i;
1.1.1.2 ! root 1841: putuserrec(&cfg,useron.number,U_SHELL,8,cfg.shell[i]->code);
! 1842: }
1.1 root 1843: else
1844: csi->logic=LOGIC_FALSE;
1845: return(0);
1846:
1847: case CS_SELECT_EDITOR:
1848: csi->logic=select_editor() ? LOGIC_TRUE:LOGIC_FALSE;
1849: return(0);
1850: case CS_SET_EDITOR:
1851: csi->logic=LOGIC_TRUE;
1852: for(i=0;i<cfg.total_xedits;i++)
1853: if(!stricmp(csi->str,cfg.xedit[i]->code)
1.1.1.2 ! root 1854: && chk_ar(cfg.xedit[i]->ar,&useron,&client))
1.1 root 1855: break;
1856: if(i<cfg.total_xedits) {
1857: useron.xedit=i+1;
1.1.1.2 ! root 1858: putuserrec(&cfg,useron.number,U_XEDIT,8,cfg.xedit[i]->code);
! 1859: }
1.1 root 1860: else
1861: csi->logic=LOGIC_FALSE;
1862: return(0);
1863:
1864: case CS_CLEAR_ABORT:
1865: sys_status&=~SS_ABORT;
1866: return(0);
1867: case CS_FINDUSER:
1868: i=finduser(csi->str);
1869: if(i) {
1870: csi->logic=LOGIC_TRUE;
1.1.1.2 ! root 1871: username(&cfg,i,csi->str);
! 1872: }
1.1 root 1873: else
1874: csi->logic=LOGIC_FALSE;
1875: return(0);
1876: case CS_UNGETKEY:
1877: ungetkey(csi->cmd&0x7f);
1878: return(0);
1879: case CS_UNGETSTR:
1880: j=strlen(csi->str);
1881: for(i=0;i<j;i++)
1882: ungetkey(csi->str[i]);
1883: return(0);
1884: case CS_PRINTKEY:
1885: if((csi->cmd&0x7f)>=' ')
1886: outchar(csi->cmd&0x7f);
1887: return(0);
1888: case CS_PRINTSTR:
1889: putmsg(csi->str,P_SAVEATR|P_NOABORT|P_NOATCODES);
1890: return(0);
1891: case CS_CMD_HOME:
1892: if(csi->cmdrets<MAX_CMDRETS)
1893: csi->cmdret[csi->cmdrets++]=(csi->ip-1);
1894: return(0);
1895: case CS_END_CMD:
1896: if(csi->cmdrets)
1897: csi->ip=csi->cmdret[--csi->cmdrets];
1898: return(0);
1899: case CS_CMD_POP:
1900: if(csi->cmdrets)
1901: csi->cmdrets--;
1902: return(0);
1903: case CS_IF_TRUE:
1904: if(csi->logic!=LOGIC_TRUE) {
1905: skipto(csi,CS_ELSEORENDIF);
1.1.1.2 ! root 1906: csi->ip++;
! 1907: }
1.1 root 1908: return(0);
1909: case CS_IF_GREATER:
1910: if(csi->logic!=LOGIC_GREATER) {
1911: skipto(csi,CS_ELSEORENDIF);
1.1.1.2 ! root 1912: csi->ip++;
! 1913: }
1.1 root 1914: return(0);
1915: case CS_IF_GREATER_OR_EQUAL:
1916: if(csi->logic!=LOGIC_GREATER && csi->logic!=LOGIC_EQUAL) {
1917: skipto(csi,CS_ELSEORENDIF);
1.1.1.2 ! root 1918: csi->ip++;
! 1919: }
1.1 root 1920: return(0);
1921: case CS_IF_LESS:
1922: if(csi->logic!=LOGIC_LESS) {
1923: skipto(csi,CS_ELSEORENDIF);
1.1.1.2 ! root 1924: csi->ip++;
! 1925: }
1.1 root 1926: return(0);
1927: case CS_IF_LESS_OR_EQUAL:
1928: if(csi->logic!=LOGIC_LESS && csi->logic!=LOGIC_EQUAL) {
1929: skipto(csi,CS_ELSEORENDIF);
1.1.1.2 ! root 1930: csi->ip++;
! 1931: }
1.1 root 1932: return(0);
1933: case CS_IF_FALSE:
1934: if(csi->logic==LOGIC_TRUE) {
1935: skipto(csi,CS_ELSEORENDIF);
1.1.1.2 ! root 1936: csi->ip++;
! 1937: }
1.1 root 1938: return(0);
1939: case CS_ELSE:
1940: skipto(csi,CS_ENDIF);
1941: csi->ip++;
1942: return(0);
1943: case CS_END_CASE:
1944: skipto(csi,CS_END_SWITCH);
1945: csi->misc&=~CS_IN_SWITCH;
1946: csi->ip++;
1947: return(0);
1948: case CS_DEFAULT:
1949: case CS_END_SWITCH:
1950: csi->misc&=~CS_IN_SWITCH;
1951: return(0);
1952: case CS_ENDIF:
1953: return(0);
1954: default:
1955: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
1.1.1.2 ! root 1956: return(0);
! 1957: }
1.1 root 1958: }
1959:
1960: bool sbbs_t::select_shell(void)
1961: {
1962: int i;
1963:
1964: for(i=0;i<cfg.total_shells;i++)
1.1.1.2 ! root 1965: uselect(1,i,text[CommandShellHeading],cfg.shell[i]->name,cfg.shell[i]->ar);
1.1 root 1966: if((i=uselect(0,useron.shell,0,0,0))>=0) {
1967: useron.shell=i;
1968: putuserrec(&cfg,useron.number,U_SHELL,8,cfg.shell[i]->code);
1969: return(true);
1970: }
1971: return(false);
1972: }
1973:
1974: bool sbbs_t::select_editor(void)
1975: {
1976: int i;
1977:
1978: for(i=0;i<cfg.total_xedits;i++)
1.1.1.2 ! root 1979: uselect(1,i,text[ExternalEditorHeading],cfg.xedit[i]->name,cfg.xedit[i]->ar);
1.1 root 1980: if(useron.xedit) useron.xedit--;
1981: if((i=uselect(0,useron.xedit,0,0,0))>=0) {
1982: useron.xedit=i+1;
1983: putuserrec(&cfg,useron.number,U_XEDIT,8,cfg.xedit[i]->code);
1984: return(true);
1985: }
1986: return(false);
1987: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.