|
|
1.1 root 1: #line 1 "EXEC.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include "sbbs.h"
6: #include "cmdshell.h"
7:
8: char *readtext(long *line, FILE *stream);
9:
10: extern csi_t main_csi;
11: extern FILE *nodefile_fp,*node_ext_fp,*logfile_fp;
12:
13: uint global_str_vars=0;
14: char **global_str_var=0;
15: long *global_str_var_name=0;
16: uint global_int_vars=0;
17: long *global_int_var=0;
18: long *global_int_var_name=0;
19:
20: char *sysvar_p[MAX_SYSVARS]={NULL};
21: int sysvar_pi=0;
22: long sysvar_l[MAX_SYSVARS]={0L};
23: int sysvar_li=0;
24:
25: char **getstrvar(csi_t *bin, long name)
26: {
27: int i;
28:
29: if(sysvar_pi==MAX_SYSVARS) sysvar_pi=0;
30: switch(name) {
31: case 0:
32: return((char **)&(bin->str));
33: case 0x490873f1:
34: sysvar_p[sysvar_pi]=useron.alias;
35: break;
36: case 0x5de44e8b:
37: sysvar_p[sysvar_pi]=useron.name;
38: break;
39: case 0x979ef1de:
40: sysvar_p[sysvar_pi]=useron.handle;
41: break;
42: case 0xc8cd5fb7:
43: sysvar_p[sysvar_pi]=useron.comp;
44: break;
45: case 0xcc7aca99:
46: sysvar_p[sysvar_pi]=useron.note;
47: break;
48: case 0xa842c43b:
49: sysvar_p[sysvar_pi]=useron.address;
50: break;
51: case 0x4ee1ff3a:
52: sysvar_p[sysvar_pi]=useron.location;
53: break;
54: case 0xf000aa78:
55: sysvar_p[sysvar_pi]=useron.zipcode;
56: break;
57: case 0xcdb7e4a9:
58: sysvar_p[sysvar_pi]=useron.pass;
59: break;
60: case 0x94d59a7a:
61: sysvar_p[sysvar_pi]=useron.birth;
62: break;
63: case 0xec2b8fb8:
64: sysvar_p[sysvar_pi]=useron.phone;
65: break;
66: case 0x08f65a2a:
67: sysvar_p[sysvar_pi]=useron.modem;
68: break;
69: case 0xc7e0e8ce:
70: sysvar_p[sysvar_pi]=useron.netmail;
71: break;
72: case 0xd3606303:
73: sysvar_p[sysvar_pi]=useron.tmpext;
74: break;
75: case 0x3178f9d6:
76: sysvar_p[sysvar_pi]=useron.comment;
77: break;
78:
79: case 0x41239e21:
80: sysvar_p[sysvar_pi]=connection;
81: break;
82: case 0xe9f1fad0:
83: sysvar_p[sysvar_pi]=cap_fname;
84: break;
85: case 0x90fc82b4:
86: sysvar_p[sysvar_pi]=cid;
87: break;
88: case 0x15755030:
89: return((char **)&comspec);
90:
91: case 0xf19cd046:
92: sysvar_p[sysvar_pi]=wordwrap;
93: break;
94:
95: default:
96: if(bin->str_var && bin->str_var_name)
97: for(i=0;i<bin->str_vars;i++)
98: if(bin->str_var_name[i]==name)
99: return((char **)&(bin->str_var[i]));
100: if(global_str_var && global_str_var_name)
101: for(i=0;i<global_str_vars;i++)
102: if(global_str_var_name[i]==name)
103: return(&(global_str_var[i]));
104: return(NULL); }
105:
106: return((char **)&sysvar_p[sysvar_pi++]);
107: }
108:
109: long *getintvar(csi_t *bin, long name)
110: {
111: int i;
112:
113: if(sysvar_li==MAX_SYSVARS) sysvar_li=0;
114: switch(name) {
115: case 0:
116: sysvar_l[sysvar_li]=strtol(bin->str,0,0);
117: break;
118: case 0x908ece53:
119: sysvar_l[sysvar_li]=useron.number;
120: break;
121: case 0xdcedf626:
122: sysvar_l[sysvar_li]=useron.uls;
123: break;
124: case 0xc1093f61:
125: sysvar_l[sysvar_li]=useron.dls;
126: break;
127: case 0x2039a29f:
128: sysvar_l[sysvar_li]=useron.posts;
129: break;
130: case 0x4a9f3955:
131: sysvar_l[sysvar_li]=useron.emails;
132: break;
133: case 0x0c8dcf3b:
134: sysvar_l[sysvar_li]=useron.fbacks;
135: break;
136: case 0x9a13bf95:
137: sysvar_l[sysvar_li]=useron.etoday;
138: break;
139: case 0xc9082cbd:
140: sysvar_l[sysvar_li]=useron.ptoday;
141: break;
142: case 0x7c72376d:
143: sysvar_l[sysvar_li]=useron.timeon;
144: break;
145: case 0xac72c50b:
146: sysvar_l[sysvar_li]=useron.textra;
147: break;
148: case 0x04807a11:
149: sysvar_l[sysvar_li]=useron.logons;
150: break;
151: case 0x52996eab:
152: sysvar_l[sysvar_li]=useron.ttoday;
153: break;
154: case 0x098bdfcb:
155: sysvar_l[sysvar_li]=useron.tlast;
156: break;
157: case 0xbd1cee5d:
158: sysvar_l[sysvar_li]=useron.ltoday;
159: break;
160: case 0x07954570:
161: sysvar_l[sysvar_li]=useron.xedit;
162: break;
163: case 0xedf6aa98:
164: sysvar_l[sysvar_li]=useron.shell;
165: break;
166: case 0x328ed476:
167: sysvar_l[sysvar_li]=useron.level;
168: break;
169: case 0x9e70e855:
170: sysvar_l[sysvar_li]=useron.sex;
171: break;
172: case 0x094cc42c:
173: sysvar_l[sysvar_li]=useron.rows;
174: break;
175: case 0xabc4317e:
176: sysvar_l[sysvar_li]=useron.prot;
177: break;
178: case 0x7dd9aac0:
179: sysvar_l[sysvar_li]=useron.leech;
180: break;
181: case 0x7c602a37:
182: return((long *)&useron.misc);
183: case 0x61be0d36:
184: return((long *)&useron.qwk);
185: case 0x665ac227:
186: return((long *)&useron.chat);
187: case 0x951341ab:
188: return((long *)&useron.flags1);
189: case 0x0c1a1011:
190: return((long *)&useron.flags2);
191: case 0x7b1d2087:
192: return((long *)&useron.flags3);
193: case 0xe579b524:
194: return((long *)&useron.flags4);
195: case 0x12e7d6d2:
196: return((long *)&useron.exempt);
197: case 0xfed3115d:
198: return((long *)&useron.rest);
199: case 0xb65dd6d4:
200: return((long *)&useron.ulb);
201: case 0xabb91f93:
202: return((long *)&useron.dlb);
203: case 0x92fb364f:
204: return((long *)&useron.cdt);
205: case 0xd0a99c72:
206: return((long *)&useron.min);
207: case 0xd7ae3022:
208: return((long *)&useron.freecdt);
209: case 0x1ef214ef:
210: return((long *)&useron.firston);
211: case 0x0ea515b1:
212: return((long *)&useron.laston);
213: case 0x2aaf9bd3:
214: return((long *)&useron.expire);
215: case 0x89c91dc8:
216: return((long *)&useron.pwmod);
217: case 0x5b0d0c54:
218: return((long *)&useron.ns_time);
219:
220: case 0xae256560:
221: return((long *)&cur_rate);
222: case 0x2b3c257f:
223: return((long *)&cur_cps);
224: case 0x1c4455ee:
225: return((long *)&dte_rate);
226: case 0x7fbf958e:
227: return((long *)&lncntr);
228: case 0x5c1c1500:
229: return((long *)&tos);
230: case 0x613b690e:
231: return((long *)&rows);
232: case 0x205ace36:
233: return((long *)&autoterm);
234: case 0x7d0ed0d1:
235: return((long *)&console);
236: case 0xbf31a280:
237: return((long *)&answertime);
238: case 0x83aa2a6a:
239: return((long *)&logontime);
240: case 0xb50cb889:
241: return((long *)&ns_time);
242: case 0xae92d249:
243: return((long *)&last_ns_time);
244: case 0x97f99eef:
245: return((long *)&online);
246: case 0x381d3c2a:
247: return((long *)&sys_status);
248: case 0x7e29c819:
249: return((long *)&sys_misc);
250: case 0x11c83294:
251: return((long *)&sys_psnum);
252: case 0x02408dc5:
253: sysvar_l[sysvar_li]=sys_timezone;
254: break;
255: case 0x78afeaf1:
256: sysvar_l[sysvar_li]=sys_pwdays;
257: break;
258: case 0xd859385f:
259: sysvar_l[sysvar_li]=sys_deldays;
260: break;
261: case 0x6392dc62:
262: sysvar_l[sysvar_li]=sys_autodel;
263: break;
264: case 0x698d59b4:
265: sysvar_l[sysvar_li]=sys_nodes;
266: break;
267: case 0x6fb1c46e:
268: sysvar_l[sysvar_li]=sys_exp_warn;
269: break;
270: case 0xdf391ca7:
271: sysvar_l[sysvar_li]=sys_lastnode;
272: break;
273: case 0xdd982780:
274: sysvar_l[sysvar_li]=sys_autonode;
275: break;
276: case 0xf53db6c7:
277: sysvar_l[sysvar_li]=node_scrnlen;
278: break;
279: case 0xa1f0fcb7:
280: sysvar_l[sysvar_li]=node_scrnblank;
281: break;
282: case 0x709c07da:
283: return((long *)&node_misc);
284: case 0xb17e7914:
285: sysvar_l[sysvar_li]=node_valuser;
286: break;
287: case 0xadae168a:
288: sysvar_l[sysvar_li]=node_ivt;
289: break;
290: case 0x2aa89801:
291: sysvar_l[sysvar_li]=node_swap;
292: break;
293: case 0x4f02623a:
294: sysvar_l[sysvar_li]=node_minbps;
295: break;
296: case 0xe7a7fb07:
297: sysvar_l[sysvar_li]=node_num;
298: break;
299: case 0x6c8e350a:
300: sysvar_l[sysvar_li]=new_level;
301: break;
302: case 0xccfe7c5d:
303: return((long *)&new_flags1);
304: case 0x55f72de7:
305: return((long *)&new_flags2);
306: case 0x22f01d71:
307: return((long *)&new_flags3);
308: case 0xbc9488d2:
309: return((long *)&new_flags4);
310: case 0x4b0aeb24:
311: return((long *)&new_exempt);
312: case 0x20cb6325:
313: return((long *)&new_rest);
314: case 0x31178ba2:
315: return((long *)&new_cdt);
316: case 0x7345219f:
317: return((long *)&new_min);
318: case 0xb3f64be4:
319: sysvar_l[sysvar_li]=new_shell;
320: break;
321: case 0xa278584f:
322: return((long *)&new_misc);
323: case 0x7342a625:
324: sysvar_l[sysvar_li]=new_expire;
325: break;
326: case 0x75dc4306:
327: sysvar_l[sysvar_li]=new_prot;
328: break;
329: case 0xfb394e27:
330: sysvar_l[sysvar_li]=expired_level;
331: break;
332: case 0x89b69753:
333: return((long *)&expired_flags1);
334: case 0x10bfc6e9:
335: return((long *)&expired_flags2);
336: case 0x67b8f67f:
337: return((long *)&expired_flags3);
338: case 0xf9dc63dc:
339: return((long *)&expired_flags4);
340: case 0x0e42002a:
341: return((long *)&expired_exempt);
342: case 0x4569c62e:
343: return((long *)&expired_rest);
344: case 0xfcf3542e:
345: sysvar_l[sysvar_li]=min_dspace;
346: break;
347: case 0xcf9ce02c:
348: sysvar_l[sysvar_li]=cdt_min_value;
349: break;
350: case 0xfcb5b274:
351: return((long *)&cdt_per_dollar);
352: case 0x4db200d2:
353: sysvar_l[sysvar_li]=leech_pct;
354: break;
355: case 0x9a7d9cca:
356: sysvar_l[sysvar_li]=leech_sec;
357: break;
358: case 0x396b7167:
359: return((long *)&netmail_cost);
360: case 0x5eeaff21:
361: sysvar_l[sysvar_li]=netmail_misc;
362: break;
363: case 0x82d9484e:
364: return((long *)&inetmail_cost);
365: case 0xe558c608:
366: return((long *)&inetmail_misc);
367:
368: case 0xc6e8539d:
369: return((long *)&logon_ulb);
370: case 0xdb0c9ada:
371: return((long *)&logon_dlb);
372: case 0xac58736f:
373: return((long *)&logon_uls);
374: case 0xb1bcba28:
375: return((long *)&logon_dls);
376: case 0x9c5051c9:
377: return((long *)&logon_posts);
378: case 0xc82ba467:
379: return((long *)&logon_emails);
380: case 0x8e395209:
381: return((long *)&logon_fbacks);
382: case 0x8b12ba9d:
383: return((long *)&posts_read);
384: case 0xe51c1956:
385: sysvar_l[sysvar_li]=(ulong)logfile_fp;
386: break;
387: case 0x5a22d4bd:
388: sysvar_l[sysvar_li]=(ulong)nodefile_fp;
389: break;
390: case 0x3a37c26b:
391: sysvar_l[sysvar_li]=(ulong)node_ext_fp;
392: break;
393:
394: case 0xeb6c9c73:
395: sysvar_l[sysvar_li]=errorlevel;
396: break;
397:
398: case 0x5aaccfc5:
399: sysvar_l[sysvar_li]=errno;
400: break;
401:
402: case 0x057e4cd4:
403: sysvar_l[sysvar_li]=timeleft;
404: break;
405:
406: case 0x1e5052a7:
407: return((long *)&max_minutes);
408: case 0xedc643f1:
409: return((long *)&max_qwkmsgs);
410:
411: case 0x430178ec:
412: return((long *)&uq);
413:
414: default:
415: if(bin->int_var && bin->int_var_name)
416: for(i=0;i<bin->int_vars;i++)
417: if(bin->int_var_name[i]==name)
418: return(&bin->int_var[i]);
419: if(global_int_var && global_int_var_name)
420: for(i=0;i<global_int_vars;i++)
421: if(global_int_var_name[i]==name)
422: return(&global_int_var[i]);
423: return(NULL); }
424:
425: return(&sysvar_l[sysvar_li++]);
426: }
427:
428: void clearvars(csi_t *bin)
429: {
430: bin->str_vars=0;
431: bin->str_var=NULL;
432: bin->str_var_name=NULL;
433: bin->int_vars=0;
434: bin->int_var=NULL;
435: bin->int_var_name=NULL;
436: bin->files=0;
437: bin->retval=0;
438: }
439:
440: void freevars(csi_t *bin)
441: {
442: int i;
443:
444: if(bin->str_var) {
445: for(i=0;i<bin->str_vars;i++)
446: if(bin->str_var[i])
447: FREE(bin->str_var[i]);
448: FREE(bin->str_var); }
449: if(bin->int_var)
450: FREE(bin->int_var);
451: if(bin->str_var_name)
452: FREE(bin->str_var_name);
453: if(bin->int_var_name)
454: FREE(bin->int_var_name);
455: for(i=0;i<bin->files;i++)
456: if(bin->file[i]) {
457: fclose((FILE *)bin->file[i]);
458: bin->file[i]=0; }
459: }
460:
461: /****************************************************************************/
462: /* Copies a new value (str) into the string variable pointed to by p */
463: /* re-allocating if necessary */
464: /****************************************************************************/
465: char *copystrvar(csi_t *csi, char *p, char *str)
466: {
467: char *np; /* New pointer after realloc */
468: int i;
469:
470: if(p!=csi->str) {
471: if(p)
472: for(i=0;i<MAX_SYSVARS;i++)
473: if(p==sysvar_p[i])
474: break;
475: if(!p || i==MAX_SYSVARS) { /* Not system variable */
476: if((np=REALLOC(p,strlen(str)+1))==NULL)
477: errormsg(WHERE,ERR_ALLOC,"variable",strlen(str)+1);
478: else
479: p=np; } }
480: if(p)
481: strcpy(p,str);
482: return(p);
483: }
484:
485:
486: long exec_bin(uchar *mod, csi_t *csi)
487: {
488: char str[128];
489: int i,file;
490: csi_t bin;
491:
492: //lprintf("%s %d\r\n",__FILE__,__LINE__);
493: memcpy(&bin,csi,sizeof(csi_t));
494: clearvars(&bin);
495:
496: sprintf(str,"%s%s.BIN",exec_dir,mod);
497: if((file=nopen(str,O_RDONLY|O_BINARY))==-1) {
498: errormsg(WHERE,ERR_OPEN,str,O_RDONLY|O_BINARY);
499: return(-1); }
500:
501: //lprintf("%s %d\r\n",__FILE__,__LINE__);
502: bin.length=filelength(file);
503: if((bin.cs=(uchar *)MALLOC(bin.length))==NULL) {
504: close(file);
505: errormsg(WHERE,ERR_ALLOC,str,bin.length);
506: return(-1); }
507: if(lread(file,bin.cs,bin.length)!=bin.length) {
508: close(file);
509: errormsg(WHERE,ERR_READ,str,bin.length);
510: FREE(bin.cs);
511: return(-1); }
512: close(file);
513:
514: bin.ip=bin.cs;
515: bin.rets=bin.cmdrets=bin.misc=0;
516: //lprintf("%s %d\r\n",__FILE__,__LINE__);
517: while(exec(&bin)==0)
518: if(!(bin.misc&CS_OFFLINE_EXEC)) {
519: checkline();
520: if(!online)
521: break; }
522: //lprintf("%s %d logic=%d\r\n",__FILE__,__LINE__,bin.logic);
523: freevars(&bin);
524: FREE(bin.cs);
525: csi->logic=bin.logic;
526: return(bin.retval);
527: }
528:
529: /****************************************************************************/
530: /* Skcsi->ip to a specific instruction */
531: /****************************************************************************/
532: void skipto(csi_t *csi, uchar inst)
533: {
534: int i,j;
535:
536: while(csi->ip<csi->cs+csi->length && ((inst&0x80) || *csi->ip!=inst)) {
537:
538: if(*csi->ip==CS_IF_TRUE || *csi->ip==CS_IF_FALSE
539: || (*csi->ip>=CS_IF_GREATER && *csi->ip<=CS_IF_LESS_OR_EQUAL)) {
540: csi->ip++;
541: skipto(csi,CS_ENDIF);
542: csi->ip++;
543: continue; }
544:
545: if(inst==CS_ELSEORENDIF
546: && (*csi->ip==CS_ELSE || *csi->ip==CS_ENDIF))
547: break;
548:
549: if(inst==CS_NEXTCASE
550: && (*csi->ip==CS_CASE || *csi->ip==CS_DEFAULT
551: || *csi->ip==CS_END_SWITCH))
552: break;
553:
554: if(*csi->ip==CS_SWITCH) {
555: csi->ip++;
556: csi->ip+=4; /* Skip variable name */
557: skipto(csi,CS_END_SWITCH);
558: csi->ip++;
559: continue; }
560:
561: if(*csi->ip==CS_CASE) {
562: csi->ip++;
563: csi->ip+=4; /* Skip value */
564: skipto(csi,CS_NEXTCASE);
565: continue; }
566:
567: if(*csi->ip==CS_CMDKEY) {
568: csi->ip+=2;
569: skipto(csi,CS_END_CMD);
570: csi->ip++;
571: continue; }
572: if(*csi->ip==CS_CMDSTR || *csi->ip==CS_CMDKEYS) {
573: csi->ip++; /* skip inst */
574: while(*(csi->ip++)); /* skip string */
575: skipto(csi,CS_END_CMD);
576: csi->ip++;
577: continue; }
578:
579: if(*csi->ip>=CS_FUNCTIONS) {
580: csi->ip++;
581: continue; }
582:
583: if(*csi->ip>=CS_MISC) {
584: switch(*csi->ip) {
585: case CS_VAR_INSTRUCTION:
586: csi->ip++;
587: switch(*(csi->ip++)) {
588: case SHOW_VARS:
589: continue;
590: case PRINT_VAR:
591: case DEFINE_STR_VAR:
592: case DEFINE_INT_VAR:
593: case DEFINE_GLOBAL_STR_VAR:
594: case DEFINE_GLOBAL_INT_VAR:
595: case TIME_INT_VAR:
596: case STRUPR_VAR:
597: case STRLWR_VAR:
598: case TRUNCSP_STR_VAR:
599: case CHKFILE_VAR:
600: case STRIP_CTRL_STR_VAR:
601: csi->ip+=4; /* Skip variable name */
602: continue;
603: case GETSTR_VAR:
604: case GETNAME_VAR:
605: case GETLINE_VAR:
606: case GETSTRUPR_VAR:
607: case SHIFT_STR_VAR:
608: case SEND_FILE_VIA_VAR:
609: case RECEIVE_FILE_VIA_VAR:
610: csi->ip+=4; /* Skip variable name */
611: csi->ip++; /* Skip char */
612: continue;
613: case PRINTTAIL_VAR_MODE:
614: csi->ip++; /* Skip length */
615: case PRINTFILE_VAR_MODE:
616: case GETNUM_VAR:
617: csi->ip+=4; /* Skip variable name */
618: csi->ip+=2; /* Skip max num */
619: continue;
620: case STRNCMP_VAR:
621: csi->ip++; /* Skip length */
622: case SET_STR_VAR:
623: case COMPARE_STR_VAR:
624: case CAT_STR_VAR:
625: case STRSTR_VAR:
626: csi->ip+=4; /* Skip variable name */
627: while(*(csi->ip++)); /* skip string */
628: continue;
629: case FORMAT_TIME_STR:
630: csi->ip+=4; /* Skip destination variable */
631: while(*(csi->ip++)); /* Skip string */
632: csi->ip+=4; /* Skip int variable */
633: continue;
634: case FORMAT_STR_VAR: /* SPRINTF */
635: csi->ip+=4; /* Skip destination variable */
636: case VAR_PRINTF:
637: while(*(csi->ip++)); /* Skip string */
638: j=*(csi->ip++); /* Skip number of arguments */
639: for(i=0;i<j;i++)
640: csi->ip+=4; /* Skip arguments */
641: continue;
642: case SEND_FILE_VIA:
643: case RECEIVE_FILE_VIA:
644: csi->ip++; /* Skip prot */
645: while(*(csi->ip++)); /* Skip filepath */
646: continue;
647: case GETSTR_MODE:
648: case STRNCMP_VARS:
649: csi->ip++; /* Skip length */
650: default:
651: csi->ip+=8; /* Skip two variable names or var & val */
652: continue; }
653:
654: case CS_FIO_FUNCTION:
655: csi->ip++;
656: switch(*(csi->ip++)) {
657: case FIO_OPEN:
658: csi->ip+=4; /* File handle */
659: csi->ip+=2; /* Access */
660: while(*(csi->ip++)); /* path/filename */
661: continue;
662: case FIO_CLOSE:
663: case FIO_FLUSH:
664: case FIO_EOF:
665: case REMOVE_FILE:
666: case REMOVE_DIR:
667: case CHANGE_DIR:
668: case MAKE_DIR:
669: case REWIND_DIR:
670: case CLOSE_DIR:
671: csi->ip+=4; /* File handle */
672: continue;
673: case FIO_SET_ETX:
674: csi->ip++;
675: continue;
676: case FIO_PRINTF:
677: csi->ip+=4; /* File handle */
678: while(*(csi->ip++)); /* String */
679: j=*(csi->ip++); /* Number of arguments */
680: for(i=0;i<j;i++)
681: csi->ip+=4; /* Arguments */
682: continue;
683: case FIO_READ:
684: case FIO_WRITE:
685: case FIO_SEEK:
686: case FIO_SEEK_VAR:
687: case FIO_OPEN_VAR:
688: csi->ip+=4; /* File handle */
689: csi->ip+=4; /* Variable */
690: csi->ip+=2; /* Length/access */
691: continue;
692: case FIO_READ_VAR:
693: case FIO_WRITE_VAR:
694: csi->ip+=4; /* File handle */
695: csi->ip+=4; /* Buf Variable */
696: csi->ip+=4; /* Length Variable */
697: continue;
698: default:
699: csi->ip+=4; /* File handle */
700: csi->ip+=4; /* Variable */
701: continue; }
702:
703: case CS_COMPARE_ARS:
704: csi->ip++;
705: csi->ip+=(*csi->ip);
706: csi->ip++;
707: break;
708: case CS_TOGGLE_USER_MISC:
709: case CS_COMPARE_USER_MISC:
710: case CS_TOGGLE_USER_CHAT:
711: case CS_COMPARE_USER_CHAT:
712: case CS_TOGGLE_USER_QWK:
713: case CS_COMPARE_USER_QWK:
714: csi->ip+=5;
715: break;
716: case CS_REPLACE_TEXT:
717: csi->ip+=3; /* skip inst and text # */
718: while(*(csi->ip++)); /* skip string */
719: break;
720: case CS_USE_INT_VAR:
721: csi->ip+=7; // inst, var, offset, len
722: break;
723: default:
724: csi->ip++; }
725: continue; }
726:
727: if(*csi->ip==CS_ONE_MORE_BYTE) {
728: csi->ip++; /* skip extension */
729: csi->ip++; /* skip instruction */
730: continue; }
731:
732: if(*csi->ip==CS_TWO_MORE_BYTES) {
733: csi->ip++; /* skip extension */
734: csi->ip++; /* skip instruction */
735: csi->ip++; /* skip argument */
736: continue; }
737:
738: if(*csi->ip==CS_THREE_MORE_BYTES) {
739: csi->ip++; /* skip extension */
740: csi->ip++; /* skip instruction */
741: csi->ip+=2; /* skip argument */
742: continue; }
743:
744: if(*csi->ip==CS_STR_FUNCTION) {
745: csi->ip++; /* skip extension */
746: csi->ip++; /* skip instruction */
747: while(*(csi->ip++)); /* skip string */
748: continue; }
749:
750: if(*csi->ip>=CS_ASCIIZ) {
751: csi->ip++; /* skip inst */
752: while(*(csi->ip++)); /* skip string */
753: continue; }
754:
755: if(*csi->ip>=CS_THREE_BYTE) {
756: csi->ip+=3;
757: continue; }
758:
759: if(*csi->ip>=CS_TWO_BYTE) {
760: csi->ip+=2;
761: continue; }
762:
763: csi->ip++; }
764: }
765:
766:
767: int exec(csi_t *csi)
768: {
769: uchar str[256],tmp2[128],buf[1025],*path,ch,*p,**pp,**pp1,**pp2;
770: int i,j,k,s,file,x,y;
771: long l,*lp,*lp1,*lp2;
772: stats_t stats;
773: time_t t;
774: FILE *stream;
775:
776: //lprintf("line %d (%d %d %d)\r\n",__LINE__,curgrp,cursub[curgrp],usrsub[curgrp]);
777: #if 0
778: if(curgrp>=total_grps)
779: curgrp=0;
780: if(cursub[curgrp]>=total_subs)
781: cursub[curgrp]=0;
782: if(curlib>=total_libs)
783: curlib=0;
784: if(curdir[curlib]>=total_dirs)
785: curdir[curlib]=0;
786: #endif
787:
788: if(usrgrps)
789: cursubnum=usrsub[curgrp][cursub[curgrp]]; /* Used for ARS */
790: else
791: cursubnum=INVALID_SUB;
792: if(usrlibs) {
793: curdirnum=usrdir[curlib][curdir[curlib]]; /* Used for ARS */
794: path=dir[usrdir[curlib][curdir[curlib]]]->path; }
795: else {
796: curdirnum=INVALID_DIR;
797: path=nulstr; }
798: now=time(NULL);
799:
800: if(csi->ip>=csi->cs+csi->length)
801: return(1);
802:
803: //lprintf("%04X: %02X ",(uint)(csi->ip-csi->cs),*csi->ip);
804:
805: if(*csi->ip>=CS_FUNCTIONS)
806: return(exec_function(csi));
807:
808: /**********************************************/
809: /* Miscellaneous variable length instructions */
810: /**********************************************/
811:
812: if(*csi->ip>=CS_MISC)
813: return(exec_misc(csi,path));
814:
815: /********************************/
816: /* ASCIIZ argument instructions */
817: /********************************/
818:
819: if(*csi->ip>=CS_ASCIIZ) {
820: switch(*(csi->ip++)) {
821: case CS_STR_FUNCTION:
822: switch(*(csi->ip++)) {
823: case CS_LOGIN:
824: csi->logic=login(csi->str,csi->ip);
825: break;
826: case CS_LOAD_TEXT:
827: csi->logic=LOGIC_FALSE;
828: for(i=0;i<TOTAL_TEXT;i++)
829: if(text[i]!=text_sav[i]) {
830: if(text[i]!=nulstr)
831: FREE(text[i]);
832: text[i]=text_sav[i]; }
833: sprintf(str,"%s%s.DAT"
834: ,ctrl_dir,cmdstr(csi->ip,path,csi->str,buf));
835: if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
836: errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
837: break; }
838: for(i=0;i<TOTAL_TEXT && !feof(stream);i++) {
839: if((text[i]=readtext((long *)NULL,stream))==NULL) {
840: i--;
841: continue; }
842: if(!strcmp(text[i],text_sav[i])) { /* If identical */
843: FREE(text[i]); /* Don't alloc */
844: text[i]=text_sav[i]; }
845: else if(text[i][0]==0) {
846: FREE(text[i]);
847: text[i]=nulstr; } }
848: if(i<TOTAL_TEXT) {
849: fclose(stream);
850: errormsg(WHERE,ERR_READ,str,TOTAL_TEXT);
851: break; }
852: fclose(stream);
853: csi->logic=LOGIC_TRUE;
854: break;
855: default:
856: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
857: break; }
858: while(*(csi->ip++)); /* Find NULL */
859: return(0);
860: case CS_LOG:
861: log(cmdstr(csi->ip,path,csi->str,buf));
862: break;
863: case CS_GETCMD:
864: csi->cmd=getkeys(csi->ip,0);
865: if((char)csi->cmd==-1)
866: csi->cmd=3;
867: break;
868: case CS_CMDSTR:
869: if(stricmp(csi->str,csi->ip)) {
870: while(*(csi->ip++)); /* Find NULL */
871: skipto(csi,CS_END_CMD);
872: csi->ip++;
873: return(0); }
874: break;
875: case CS_CMDKEYS:
876: for(i=0;csi->ip[i];i++)
877: if(csi->cmd==csi->ip[i])
878: break;
879: if(!csi->ip[i]) {
880: while(*(csi->ip++)); /* Find NULL */
881: skipto(csi,CS_END_CMD);
882: csi->ip++;
883: return(0); }
884: break;
885: case CS_GET_TEMPLATE:
886: gettmplt(csi->str,csi->ip,K_LINE);
887: if(sys_status&SS_ABORT)
888: csi->str[0]=0;
889: csi->cmd=csi->str[0];
890: break;
891: case CS_TRASHCAN:
892: csi->logic=!trashcan(csi->str,csi->ip);
893: break;
894: case CS_CREATE_SIF:
895: create_sif_dat(csi->ip,csi->str);
896: break;
897: case CS_READ_SIF:
898: read_sif_dat(csi->ip,csi->str);
899: break;
900: case CS_MNEMONICS:
901: mnemonics(csi->ip);
902: break;
903: case CS_PRINT:
904: putmsg(cmdstr(csi->ip,path,csi->str,buf),P_SAVEATR|P_NOABORT);
905: break;
906: case CS_PRINT_LOCAL:
907: lputs(cmdstr(csi->ip,path,csi->str,buf));
908: break;
909: case CS_PRINT_REMOTE:
910: putcom(cmdstr(csi->ip,path,csi->str,buf));
911: break;
912: case CS_PRINTFILE:
913: printfile(cmdstr(csi->ip,path,csi->str,buf),P_SAVEATR);
914: break;
915: case CS_PRINTFILE_REMOTE:
916: if(online!=ON_REMOTE || !(console&CON_R_ECHO))
917: break;
918: console&=~CON_L_ECHO;
919: printfile(cmdstr(csi->ip,path,csi->str,buf),P_SAVEATR);
920: console|=CON_L_ECHO;
921: break;
922: case CS_PRINTFILE_LOCAL:
923: if(!(console&CON_L_ECHO))
924: break;
925: console&=~CON_R_ECHO;
926: printfile(cmdstr(csi->ip,path,csi->str,buf),P_SAVEATR);
927: console|=CON_R_ECHO;
928: break;
929: case CS_CHKFILE:
930: csi->logic=!fexist(cmdstr(csi->ip,path,csi->str,buf));
931: break;
932: case CS_EXEC:
933: external(cmdstr(csi->ip,path,csi->str,buf),0);
934: break;
935: case CS_EXEC_INT:
936: external(cmdstr(csi->ip,path,csi->str,buf),EX_OUTR|EX_INR|EX_OUTL);
937: break;
938: case CS_EXEC_XTRN:
939: for(i=0;i<total_xtrns;i++)
940: if(!stricmp(xtrn[i]->code,csi->ip))
941: break;
942: if(i<total_xtrns)
943: exec_xtrn(i);
944: break;
945: case CS_EXEC_BIN:
946: exec_bin(cmdstr(csi->ip,path,csi->str,buf),csi);
947: break;
948: case CS_YES_NO:
949: csi->logic=!yesno(cmdstr(csi->ip,path,csi->str,buf));
950: break;
951: case CS_NO_YES:
952: csi->logic=!noyes(cmdstr(csi->ip,path,csi->str,buf));
953: break;
954: case CS_MENU:
955: menu(cmdstr(csi->ip,path,csi->str,buf));
956: break;
957: case CS_SETSTR:
958: strcpy(csi->str,cmdstr(csi->ip,path,csi->str,buf));
959: break;
960: case CS_SET_MENU_DIR:
961: cmdstr(csi->ip,path,csi->str,menu_dir);
962: break;
963: case CS_SET_MENU_FILE:
964: cmdstr(csi->ip,path,csi->str,menu_file);
965: break;
966: case CS_COMPARE_STR:
967: csi->logic=stricmp(csi->str,cmdstr(csi->ip,path,csi->str,buf));
968: break;
969: case CS_COMPARE_KEYS:
970: for(i=0;csi->ip[i];i++)
971: if(csi->cmd==csi->ip[i])
972: break;
973: if(csi->ip[i])
974: csi->logic=LOGIC_TRUE;
975: else
976: csi->logic=LOGIC_FALSE;
977: break;
978: case CS_COMPARE_WORD:
979: csi->logic=strnicmp(csi->str,csi->ip,strlen(csi->ip));
980: break;
981: default:
982: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
983: break; }
984: while(*(csi->ip++)); /* Find NULL */
985: return(0); }
986:
987: if(*csi->ip>=CS_THREE_BYTE) {
988: switch(*(csi->ip++)) {
989: case CS_THREE_MORE_BYTES:
990: switch(*(csi->ip++)) {
991: }
992: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
993: return(0);
994: case CS_GOTO:
995: csi->ip=csi->cs+*((ushort *)(csi->ip));
996: return(0);
997: case CS_CALL:
998: csi->ret[csi->rets++]=csi->ip+2;
999: csi->ip=csi->cs+*((ushort *)(csi->ip));
1000: return(0);
1001: case CS_MSWAIT:
1002: mswait(*(ushort *)csi->ip);
1003: csi->ip+=2;
1004: return(0);
1005: case CS_TOGGLE_NODE_MISC:
1006: getnodedat(node_num,&thisnode,1);
1007: thisnode.misc^=*(ushort *)csi->ip;
1008: csi->ip+=2;
1009: putnodedat(node_num,thisnode);
1010: return(0);
1011: case CS_COMPARE_NODE_MISC:
1012: getnodedat(node_num,&thisnode,0);
1013: if((thisnode.misc&*(ushort *)csi->ip)==*(ushort *)csi->ip)
1014: csi->logic=LOGIC_TRUE;
1015: else
1016: csi->logic=LOGIC_FALSE;
1017: csi->ip+=2;
1018: return(0);
1019: case CS_ADJUST_USER_CREDITS:
1020: i=*(short *)csi->ip;
1021: l=i*1024L;
1022: if(l<0)
1023: subtract_cdt(-l);
1024: else
1025: useron.cdt=adjustuserrec(useron.number,U_CDT,10,l);
1026: csi->ip+=2;
1027: return(0);
1028: case CS_ADJUST_USER_MINUTES:
1029: i=*(short *)csi->ip;
1030: useron.min=adjustuserrec(useron.number,U_MIN,10,i);
1031: csi->ip+=2;
1032: return(0);
1033: case CS_GETNUM:
1034: i=*(short *)csi->ip;
1035: csi->ip+=2;
1036: l=getnum(i);
1037: if(l<=0) {
1038: csi->str[0]=0;
1039: csi->logic=LOGIC_FALSE; }
1040: else {
1041: sprintf(csi->str,"%lu",l);
1042: csi->logic=LOGIC_TRUE; }
1043: return(0);
1044:
1045: case CS_TOGGLE_USER_FLAG:
1046: i=*(csi->ip++);
1047: ch=*(csi->ip++);
1048: switch(i) {
1049: case '1':
1050: useron.flags1^=FLAG(ch);
1051: putuserrec(useron.number,U_FLAGS1,8
1052: ,ultoa(useron.flags1,tmp,16));
1053: break;
1054: case '2':
1055: useron.flags2^=FLAG(ch);
1056: putuserrec(useron.number,U_FLAGS2,8
1057: ,ultoa(useron.flags2,tmp,16));
1058: break;
1059: case '3':
1060: useron.flags3^=FLAG(ch);
1061: putuserrec(useron.number,U_FLAGS3,8
1062: ,ultoa(useron.flags3,tmp,16));
1063: break;
1064: case '4':
1065: useron.flags4^=FLAG(ch);
1066: putuserrec(useron.number,U_FLAGS4,8
1067: ,ultoa(useron.flags4,tmp,16));
1068: break;
1069: case 'R':
1070: useron.rest^=FLAG(ch);
1071: putuserrec(useron.number,U_REST,8
1072: ,ultoa(useron.rest,tmp,16));
1073: break;
1074: case 'E':
1075: useron.exempt^=FLAG(ch);
1076: putuserrec(useron.number,U_EXEMPT,8
1077: ,ultoa(useron.exempt,tmp,16));
1078: break;
1079: default:
1080: errormsg(WHERE,ERR_CHK,"user flag type",*(csi->ip-2));
1081: return(0); }
1082: statusline();
1083: return(0);
1084: case CS_REVERT_TEXT:
1085: i=*(ushort *)csi->ip;
1086: csi->ip+=2;
1087: if((ushort)i==0xffff) {
1088: for(i=0;i<TOTAL_TEXT;i++) {
1089: if(text[i]!=text_sav[i] && text[i]!=nulstr)
1090: FREE(text[i]);
1091: text[i]=text_sav[i]; }
1092: return(0); }
1093: i--;
1094: if(i>=TOTAL_TEXT) {
1095: errormsg(WHERE,ERR_CHK,"revert text #",i);
1096: return(0); }
1097: if(text[i]!=text_sav[i] && text[i]!=nulstr)
1098: FREE(text[i]);
1099: text[i]=text_sav[i];
1100: return(0);
1101: default:
1102: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
1103: return(0); } }
1104:
1105: if(*csi->ip>=CS_TWO_BYTE) {
1106: switch(*(csi->ip++)) {
1107: case CS_TWO_MORE_BYTES:
1108: switch(*(csi->ip++)) {
1109: case CS_USER_EVENT:
1110: user_event(*(csi->ip++));
1111: return(0);
1112: }
1113: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
1114: return(0);
1115: case CS_SETLOGIC:
1116: csi->logic=*csi->ip++;
1117: return(0);
1118: case CS_CMDKEY:
1119: if( ((*csi->ip)==CS_DIGIT && isdigit(csi->cmd))
1120: || ((*csi->ip)==CS_EDIGIT && csi->cmd&0x80
1121: && isdigit(csi->cmd&0x7f))) {
1122: csi->ip++;
1123: return(0); }
1124: if(csi->cmd!=*csi->ip) {
1125: csi->ip++;
1126: skipto(csi,CS_END_CMD); } /* skip code */
1127: csi->ip++; /* skip key */
1128: return(0);
1129: case CS_NODE_ACTION:
1130: action=*csi->ip++;
1131: return(0);
1132: case CS_NODE_STATUS:
1133: getnodedat(node_num,&thisnode,1);
1134: thisnode.status=*csi->ip++;
1135: putnodedat(node_num,thisnode);
1136: return(0);
1137: case CS_GETSTR:
1138: csi->logic=LOGIC_TRUE;
1139: getstr(csi->str,*csi->ip++,0);
1140: if(sys_status&SS_ABORT) {
1141: csi->str[0]=0;
1142: csi->logic=LOGIC_FALSE; }
1143: if(csi->str[0]=='/' && csi->str[1])
1144: csi->cmd=csi->str[1]|0x80;
1145: else
1146: csi->cmd=csi->str[0];
1147: return(0);
1148: case CS_GETLINE:
1149: getstr(csi->str,*csi->ip++,K_LINE);
1150: if(sys_status&SS_ABORT)
1151: csi->str[0]=0;
1152: if(csi->str[0]=='/' && csi->str[1])
1153: csi->cmd=csi->str[1]|0x80;
1154: else
1155: csi->cmd=csi->str[0];
1156: return(0);
1157: case CS_GETSTRUPR:
1158: getstr(csi->str,*csi->ip++,K_UPPER);
1159: if(sys_status&SS_ABORT)
1160: csi->str[0]=0;
1161: if(csi->str[0]=='/' && csi->str[1])
1162: csi->cmd=csi->str[1]|0x80;
1163: else
1164: csi->cmd=csi->str[0];
1165: return(0);
1166: case CS_GETNAME:
1167: getstr(csi->str,*csi->ip++,K_UPRLWR);
1168: if(sys_status&SS_ABORT)
1169: csi->str[0]=0;
1170: return(0);
1171: case CS_SHIFT_STR:
1172: if(strlen(csi->str)>=*csi->ip)
1173: memmove(csi->str,csi->str+(*csi->ip)
1174: ,strlen(csi->str)+1);
1175: csi->ip++;
1176: return(0);
1177: case CS_COMPARE_KEY:
1178: if( ((*csi->ip)==CS_DIGIT && isdigit(csi->cmd))
1179: || ((*csi->ip)==CS_EDIGIT && csi->cmd&0x80
1180: && isdigit(csi->cmd&0x7f))) {
1181: csi->ip++;
1182: csi->logic=LOGIC_TRUE; }
1183: else {
1184: if(csi->cmd==*(csi->ip++))
1185: csi->logic=LOGIC_TRUE;
1186: else
1187: csi->logic=LOGIC_FALSE; }
1188: return(0);
1189: case CS_SET_USER_LEVEL:
1190: useron.level=*(csi->ip++);
1191: putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,tmp,10));
1192: statusline();
1193: return(0);
1194: case CS_SET_USER_STRING:
1195: csi->logic=LOGIC_FALSE;
1196: if(!csi->str[0]) {
1197: csi->ip++;
1198: return(0); }
1199: switch(*(csi->ip++)) {
1200: case USER_STRING_ALIAS:
1201: if(!isalpha(csi->str[0]) || trashcan(csi->str,"NAME"))
1202: break;
1203: i=matchuser(csi->str);
1204: if(i && i!=useron.number)
1205: break;
1206: sprintf(useron.alias,"%.*s",LEN_ALIAS,csi->str);
1207: putuserrec(useron.number,U_ALIAS,LEN_ALIAS,useron.alias);
1208: putusername(useron.number,useron.alias);
1209: csi->logic=LOGIC_TRUE;
1210: break;
1211: case USER_STRING_REALNAME:
1212: if(trashcan(csi->str,"NAME"))
1213: break;
1214: if(uq&UQ_DUPREAL
1215: && userdatdupe(useron.number,U_NAME,LEN_NAME
1216: ,csi->str,0))
1217: break;
1218: sprintf(useron.name,"%.*s",LEN_NAME,csi->str);
1219: putuserrec(useron.number,U_NAME,LEN_NAME
1220: ,useron.name);
1221: csi->logic=LOGIC_TRUE;
1222: break;
1223: case USER_STRING_HANDLE:
1224: if(trashcan(csi->str,"NAME"))
1225: break;
1226: if(uq&UQ_DUPHAND
1227: && userdatdupe(useron.number,U_HANDLE,LEN_HANDLE
1228: ,csi->str,0))
1229: break;
1230: sprintf(useron.handle,"%.*s",LEN_HANDLE,csi->str);
1231: putuserrec(useron.number,U_HANDLE,LEN_HANDLE
1232: ,useron.handle);
1233: csi->logic=LOGIC_TRUE;
1234: break;
1235: case USER_STRING_COMPUTER:
1236: sprintf(useron.comp,"%.*s",LEN_COMP,csi->str);
1237: putuserrec(useron.number,U_COMP,LEN_COMP
1238: ,useron.comp);
1239: csi->logic=LOGIC_TRUE;
1240: break;
1241: case USER_STRING_NOTE:
1242: sprintf(useron.note,"%.*s",LEN_NOTE,csi->str);
1243: putuserrec(useron.number,U_NOTE,LEN_NOTE
1244: ,useron.note);
1245: csi->logic=LOGIC_TRUE;
1246: break;
1247: case USER_STRING_ADDRESS:
1248: sprintf(useron.address,"%.*s",LEN_ADDRESS,csi->str);
1249: putuserrec(useron.number,U_ADDRESS,LEN_ADDRESS
1250: ,useron.address);
1251: csi->logic=LOGIC_TRUE;
1252: break;
1253: case USER_STRING_LOCATION:
1254: sprintf(useron.location,"%.*s",LEN_LOCATION,csi->str);
1255: putuserrec(useron.number,U_LOCATION,LEN_LOCATION
1256: ,useron.location);
1257: csi->logic=LOGIC_TRUE;
1258: break;
1259: case USER_STRING_ZIPCODE:
1260: sprintf(useron.zipcode,"%.*s",LEN_ZIPCODE,csi->str);
1261: putuserrec(useron.number,U_ZIPCODE,LEN_ZIPCODE
1262: ,useron.zipcode);
1263: csi->logic=LOGIC_TRUE;
1264: break;
1265: case USER_STRING_PASSWORD:
1266: sprintf(useron.pass,"%.*s",LEN_PASS,csi->str);
1267: putuserrec(useron.number,U_PASS,LEN_PASS
1268: ,useron.pass);
1269: csi->logic=LOGIC_TRUE;
1270: break;
1271: case USER_STRING_BIRTHDAY:
1272: if(!getage(csi->str))
1273: break;
1274: sprintf(useron.birth,"%.*s",LEN_BIRTH,csi->str);
1275: putuserrec(useron.number,U_BIRTH,LEN_BIRTH
1276: ,useron.birth);
1277: csi->logic=LOGIC_TRUE;
1278: break;
1279: case USER_STRING_PHONE:
1280: if(trashcan(csi->str,"PHONE"))
1281: break;
1282: sprintf(useron.phone,"%.*s",LEN_PHONE,csi->str);
1283: putuserrec(useron.number,U_PHONE,LEN_PHONE
1284: ,useron.phone);
1285: csi->logic=LOGIC_TRUE;
1286: break;
1287: case USER_STRING_MODEM:
1288: sprintf(useron.modem,"%.*s",LEN_MODEM,csi->str);
1289: putuserrec(useron.number,U_MODEM,LEN_MODEM
1290: ,useron.phone);
1291: csi->logic=LOGIC_TRUE;
1292: break;
1293: case USER_STRING_COMMENT:
1294: sprintf(useron.comment,"%.*s",LEN_COMMENT,csi->str);
1295: putuserrec(useron.number,U_COMMENT,LEN_COMMENT
1296: ,useron.comment);
1297: csi->logic=LOGIC_TRUE;
1298: break;
1299: default:
1300: errormsg(WHERE,ERR_CHK,"user string type",*(csi->ip-1));
1301: return(0); }
1302: statusline();
1303: return(0);
1304: default:
1305: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
1306: return(0); } }
1307:
1308:
1309: /*********************************/
1310: /* Single Byte Instrcutions ONLY */
1311: /*********************************/
1312:
1313: switch(*(csi->ip++)) {
1314: case CS_ONE_MORE_BYTE: /* Just one MORE byte */
1315: switch(*(csi->ip++)) {
1316: case CS_OFFLINE:
1317: csi->misc|=CS_OFFLINE_EXEC;
1318: return(0);
1319: case CS_ONLINE:
1320: csi->misc&=~CS_OFFLINE_EXEC;
1321: return(0);
1322: case CS_NEWUSER:
1323: newuser();
1324: return(0);
1325: case CS_LOGON:
1326: if(logon())
1327: csi->logic=LOGIC_TRUE;
1328: else
1329: csi->logic=LOGIC_FALSE;
1330: return(0);
1331: case CS_LOGOUT:
1332: logout();
1333: return(0);
1334: case CS_EXIT:
1335: return(1);
1336: default:
1337: errormsg(WHERE,ERR_CHK,"one byte extended function"
1338: ,*(csi->ip-1));
1339: return(0); }
1340: case CS_CRLF:
1341: CRLF;
1342: return(0);
1343: case CS_CLS:
1344: CLS;
1345: return(0);
1346: case CS_PAUSE:
1347: pause();
1348: return(0);
1349: case CS_PAUSE_RESET:
1350: lncntr=0;
1351: return(0);
1352: case CS_GETLINES:
1353: getlines();
1354: return(0);
1355: case CS_HANGUP:
1356: hangup();
1357: return(0);
1358: case CS_LOGKEY:
1359: logch(csi->cmd,0);
1360: return(0);
1361: case CS_LOGKEY_COMMA:
1362: logch(csi->cmd,1);
1363: return(0);
1364: case CS_LOGSTR:
1365: log(csi->str);
1366: return(0);
1367: case CS_CHKSYSPASS:
1368: csi->logic=!chksyspass(0);
1369: return(0);
1370: case CS_PUT_NODE:
1371: getnodedat(node_num,&thisnode,1);
1372: putnodedat(node_num,thisnode);
1373: return(0);
1374: case CS_SYNC:
1375: SYNC;
1376: return(0);
1377: case CS_ASYNC:
1378: ASYNC;
1379: return(0);
1380: case CS_RIOSYNC:
1381: RIOSYNC(0);
1382: return(0);
1383: case CS_GETTIMELEFT:
1384: gettimeleft();
1385: return(0);
1386: case CS_RETURN:
1387: if(!csi->rets)
1388: return(1);
1389: csi->ip=csi->ret[--csi->rets];
1390: return(0);
1391: case CS_GETKEY:
1392: csi->cmd=getkey(K_UPPER);
1393: return(0);
1394: case CS_INKEY:
1395: csi->cmd=toupper(inkey(K_GETSTR));
1396: if(csi->cmd)
1397: csi->logic=LOGIC_TRUE;
1398: else
1399: csi->logic=LOGIC_FALSE;
1400: return(0);
1401: case CS_GETKEYE:
1402: csi->cmd=getkey(K_UPPER);
1403: if(csi->cmd=='/') {
1404: outchar('/');
1405: csi->cmd=getkey(K_UPPER);
1406: csi->cmd|=0x80; }
1407: return(0);
1408: case CS_GETFILESPEC:
1409: if(getfilespec(csi->str))
1410: csi->logic=LOGIC_TRUE;
1411: else
1412: csi->logic=LOGIC_FALSE;
1413: return(0);
1414: case CS_SAVELINE:
1415: SAVELINE;
1416: return(0);
1417: case CS_RESTORELINE:
1418: RESTORELINE;
1419: return(0);
1420: case CS_SELECT_SHELL:
1421: csi->logic=LOGIC_TRUE;
1422: for(i=0;i<total_shells;i++)
1423: uselect(1,i,"Command Shell",shell[i]->name,shell[i]->ar);
1424: if((i=uselect(0,useron.shell,0,0,0))>=0) {
1425: useron.shell=i;
1426: putuserrec(useron.number,U_SHELL,8,shell[i]->code); }
1427: else
1428: csi->logic=LOGIC_FALSE;
1429: return(0);
1430: case CS_SET_SHELL:
1431: csi->logic=LOGIC_TRUE;
1432: for(i=0;i<total_shells;i++)
1433: if(!stricmp(csi->str,shell[i]->code)
1434: && chk_ar(shell[i]->ar,useron))
1435: break;
1436: if(i<total_shells) {
1437: useron.shell=i;
1438: putuserrec(useron.number,U_SHELL,8,shell[i]->code); }
1439: else
1440: csi->logic=LOGIC_FALSE;
1441: return(0);
1442:
1443: case CS_SELECT_EDITOR:
1444: csi->logic=LOGIC_TRUE;
1445: for(i=0;i<total_xedits;i++)
1446: uselect(1,i,"External Editor",xedit[i]->name,xedit[i]->ar);
1447: if(useron.xedit) useron.xedit--;
1448: if((i=uselect(0,useron.xedit,0,0,0))>=0) {
1449: useron.xedit=i+1;
1450: putuserrec(useron.number,U_XEDIT,8,xedit[i]->code); }
1451: else
1452: csi->logic=LOGIC_FALSE;
1453: return(0);
1454: case CS_SET_EDITOR:
1455: csi->logic=LOGIC_TRUE;
1456: for(i=0;i<total_xedits;i++)
1457: if(!stricmp(csi->str,xedit[i]->code)
1458: && chk_ar(xedit[i]->ar,useron))
1459: break;
1460: if(i<total_xedits) {
1461: useron.xedit=i+1;
1462: putuserrec(useron.number,U_XEDIT,8,xedit[i]->code); }
1463: else
1464: csi->logic=LOGIC_FALSE;
1465: return(0);
1466:
1467: case CS_CLEAR_ABORT:
1468: sys_status&=~SS_ABORT;
1469: return(0);
1470: case CS_FINDUSER:
1471: i=finduser(csi->str);
1472: if(i) {
1473: csi->logic=LOGIC_TRUE;
1474: username(i,csi->str); }
1475: else
1476: csi->logic=LOGIC_FALSE;
1477: return(0);
1478: case CS_UNGETKEY:
1479: ungetkey(csi->cmd&0x7f);
1480: return(0);
1481: case CS_UNGETSTR:
1482: j=strlen(csi->str);
1483: for(i=0;i<j;i++)
1484: ungetkey(csi->str[i]);
1485: return(0);
1486: case CS_PRINTKEY:
1487: if((csi->cmd&0x7f)>=SP)
1488: outchar(csi->cmd&0x7f);
1489: return(0);
1490: case CS_PRINTSTR:
1491: putmsg(csi->str,P_SAVEATR|P_NOABORT);
1492: return(0);
1493: case CS_CMD_HOME:
1494: csi->cmdret[csi->cmdrets++]=(csi->ip-1);
1495: return(0);
1496: case CS_END_CMD:
1497: if(csi->cmdrets)
1498: csi->ip=csi->cmdret[--csi->cmdrets];
1499: /* Removed 06/07/95
1500: else
1501: errormsg(WHERE,ERR_CHK,"misplaced end_cmd",(csi->ip-csi->cs)-1);
1502: */
1503: return(0);
1504: case CS_CMD_POP:
1505: if(csi->cmdrets)
1506: csi->cmdrets--;
1507: return(0);
1508: case CS_IF_TRUE:
1509: if(csi->logic!=LOGIC_TRUE) {
1510: skipto(csi,CS_ELSEORENDIF);
1511: csi->ip++; }
1512: return(0);
1513: case CS_IF_GREATER:
1514: if(csi->logic!=LOGIC_GREATER) {
1515: skipto(csi,CS_ELSEORENDIF);
1516: csi->ip++; }
1517: return(0);
1518: case CS_IF_GREATER_OR_EQUAL:
1519: if(csi->logic!=LOGIC_GREATER && csi->logic!=LOGIC_EQUAL) {
1520: skipto(csi,CS_ELSEORENDIF);
1521: csi->ip++; }
1522: return(0);
1523: case CS_IF_LESS:
1524: if(csi->logic!=LOGIC_LESS) {
1525: skipto(csi,CS_ELSEORENDIF);
1526: csi->ip++; }
1527: return(0);
1528: case CS_IF_LESS_OR_EQUAL:
1529: if(csi->logic!=LOGIC_LESS && csi->logic!=LOGIC_EQUAL) {
1530: skipto(csi,CS_ELSEORENDIF);
1531: csi->ip++; }
1532: return(0);
1533: case CS_IF_FALSE:
1534: if(csi->logic==LOGIC_TRUE) {
1535: skipto(csi,CS_ELSEORENDIF);
1536: csi->ip++; }
1537: return(0);
1538: case CS_ELSE:
1539: skipto(csi,CS_ENDIF);
1540: csi->ip++;
1541: return(0);
1542: case CS_END_CASE:
1543: skipto(csi,CS_END_SWITCH);
1544: csi->misc&=~CS_IN_SWITCH;
1545: csi->ip++;
1546: return(0);
1547: case CS_DEFAULT:
1548: case CS_END_SWITCH:
1549: csi->misc&=~CS_IN_SWITCH;
1550: return(0);
1551: case CS_ENDIF:
1552: return(0);
1553: default:
1554: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
1555: return(0); }
1556: }
1557:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.