|
|
1.1 root 1: #line 1 "EXECMISC.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: #include <sys/locking.h>
8: #include <dirent.h>
9:
10:
11: int exec_misc(csi_t *csi, uchar *path)
12: {
13: uchar str[256],tmp2[128],buf[1025],ch,*p,**pp,**pp1,**pp2;
14: ushort w;
15: int i,j,k,s,file;
16: long l,*lp,*lp1,*lp2;
17: void *vp;
18: va_list arglist[64];
19: struct dirent *de;
20: struct tm *tm_p;
21: struct ftime ft;
22: FILE *fp;
23:
24: switch(*(csi->ip++)) {
25: case CS_VAR_INSTRUCTION:
26: switch(*(csi->ip++)) { /* sub-op-code stored as next byte */
27: case PRINT_VAR:
28: (char **)pp=getstrvar(csi,*(long *)csi->ip);
29: if(!pp || !*pp) {
30: lp=getintvar(csi,*(long *)csi->ip);
31: if(lp)
32: bprintf("%ld",*lp); }
33: else
34: putmsg(cmdstr(*pp,path,csi->str,buf)
35: ,P_SAVEATR|P_NOABORT);
36: csi->ip+=4;
37: return(0);
38: case VAR_PRINTF:
39: strcpy(str,csi->ip);
40: while(*(csi->ip++)); /* Find NULL */
41: j=*(csi->ip++); /* total args */
42: for(i=0;i<j;i++) {
43: vp=getstrvar(csi,*(long *)csi->ip);
44: if(!vp) {
45: lp=getintvar(csi,*(long *)csi->ip);
46: if(!lp)
47: arglist[i]=0;
48: else
49: arglist[i]=(void *)*lp; }
50: else
51: arglist[i]=*(char **)vp;
52: csi->ip+=4; }
53: vsprintf(tmp,str,arglist);
54: putmsg(cmdstr(tmp,path,csi->str,buf),P_SAVEATR|P_NOABORT);
55: return(0);
56: case SHOW_VARS:
57: bprintf("shell str=(%08lX) %s\r\n"
58: ,csi->str,csi->str);
59: for(i=0;i<csi->str_vars;i++)
60: bprintf("local str[%d]=(%08lX) (%08lX) %s\r\n"
61: ,i,csi->str_var_name[i]
62: ,csi->str_var[i]
63: ,csi->str_var[i]);
64: for(i=0;i<csi->int_vars;i++)
65: bprintf("local int[%d]=(%08lX) (%08lX) %ld\r\n"
66: ,i,csi->int_var_name[i]
67: ,csi->int_var[i]
68: ,csi->int_var[i]);
69: for(i=0;i<global_str_vars;i++)
70: bprintf("global str[%d]=(%08lX) (%08lX) %s\r\n"
71: ,i,global_str_var_name[i]
72: ,global_str_var[i]
73: ,global_str_var[i]);
74: for(i=0;i<global_int_vars;i++)
75: bprintf("global int[%d]=(%08lX) (%08lX) %ld\r\n"
76: ,i,global_int_var_name[i]
77: ,global_int_var[i]
78: ,global_int_var[i]);
79: return(0);
80: case DEFINE_STR_VAR:
81: if(getstrvar(csi,*(long *)csi->ip)) {
82: csi->ip+=4;
83: return(0); }
84: csi->str_vars++;
85: csi->str_var=REALLOC(csi->str_var
86: ,sizeof(char *)*csi->str_vars);
87: csi->str_var_name=REALLOC(csi->str_var_name
88: ,sizeof(long)*csi->str_vars);
89: if(csi->str_var==NULL
90: || csi->str_var_name==NULL) { /* REALLOC failed */
91: errormsg(WHERE,ERR_ALLOC,"local str var"
92: ,sizeof(char *)*csi->str_vars);
93: if(csi->str_var_name) {
94: FREE(csi->str_var_name);
95: csi->str_var_name=0; }
96: if(csi->str_var) {
97: FREE(csi->str_var);
98: csi->str_var=0; }
99: csi->str_vars=0; }
100: else {
101: csi->str_var_name[csi->str_vars-1]=*(long *)csi->ip;
102: csi->str_var[csi->str_vars-1]=0; }
103: csi->ip+=4; /* Skip variable name */
104: return(0);
105: case DEFINE_INT_VAR:
106: if(getintvar(csi,*(long *)csi->ip)) {
107: csi->ip+=4;
108: return(0); }
109: csi->int_vars++;
110: csi->int_var=REALLOC(csi->int_var
111: ,sizeof(char *)*csi->int_vars);
112: csi->int_var_name=REALLOC(csi->int_var_name
113: ,sizeof(long)*csi->int_vars);
114: if(csi->int_var==NULL
115: || csi->int_var_name==NULL) { /* REALLOC failed */
116: errormsg(WHERE,ERR_ALLOC,"local int var"
117: ,sizeof(char *)*csi->int_vars);
118: if(csi->int_var_name) {
119: FREE(csi->int_var_name);
120: csi->int_var_name=0; }
121: if(csi->int_var) {
122: FREE(csi->int_var);
123: csi->int_var=0; }
124: csi->int_vars=0; }
125: else {
126: csi->int_var_name[csi->int_vars-1]=*(long *)csi->ip;
127: csi->int_var[csi->int_vars-1]=0; }
128: csi->ip+=4; /* Skip variable name */
129: return(0);
130: case DEFINE_GLOBAL_STR_VAR:
131: if(getstrvar(csi,*(long *)csi->ip)) {
132: csi->ip+=4;
133: return(0); }
134: global_str_vars++;
135: global_str_var=REALLOC(global_str_var
136: ,sizeof(char *)*global_str_vars);
137: global_str_var_name=REALLOC(global_str_var_name
138: ,sizeof(long)*global_str_vars);
139: if(global_str_var==NULL
140: || global_str_var_name==NULL) { /* REALLOC failed */
141: errormsg(WHERE,ERR_ALLOC,"global str var"
142: ,sizeof(char *)*global_str_vars);
143: if(global_str_var_name) {
144: FREE(global_str_var_name);
145: global_str_var_name=0; }
146: if(global_str_var) {
147: FREE(global_str_var);
148: global_str_var=0; }
149: global_str_vars=0; }
150: else {
151: global_str_var_name[global_str_vars-1]=
152: *(long *)csi->ip;
153: global_str_var[global_str_vars-1]=0; }
154: csi->ip+=4; /* Skip variable name */
155: return(0);
156: case DEFINE_GLOBAL_INT_VAR:
157: if(getintvar(csi,*(long *)csi->ip)) {
158: csi->ip+=4;
159: return(0); }
160: global_int_vars++;
161: global_int_var=REALLOC(global_int_var
162: ,sizeof(char *)*global_int_vars);
163: global_int_var_name=REALLOC(global_int_var_name
164: ,sizeof(long)*global_int_vars);
165: if(global_int_var==NULL
166: || global_int_var_name==NULL) { /* REALLOC failed */
167: errormsg(WHERE,ERR_ALLOC,"local int var"
168: ,sizeof(char *)*global_int_vars);
169: if(global_int_var_name) {
170: FREE(global_int_var_name);
171: global_int_var_name=0; }
172: if(global_int_var) {
173: FREE(global_int_var);
174: global_int_var=0; }
175: global_int_vars=0; }
176: else {
177: global_int_var_name[global_int_vars-1]
178: =*(long *)csi->ip;
179: global_int_var[global_int_vars-1]=0; }
180: csi->ip+=4; /* Skip variable name */
181: return(0);
182:
183: case SET_STR_VAR:
184: (char **)pp=getstrvar(csi,*(long *)csi->ip);
185: csi->ip+=4; /* Skip variable name */
186: if(pp)
187: *pp=copystrvar(csi,*pp
188: ,cmdstr(csi->ip,path,csi->str,buf));
189: while(*(csi->ip++)); /* Find NULL */
190: return(0);
191: case SET_INT_VAR:
192: lp=getintvar(csi,*(long *)csi->ip);
193: csi->ip+=4; /* Skip variable name */
194: if(lp)
195: *lp=*(long *)csi->ip;
196: csi->ip+=4; /* Skip value */
197: return(0);
198: case COMPARE_STR_VAR:
199: (char **)pp=getstrvar(csi,*(long *)csi->ip);
200: csi->ip+=4; /* Skip variable name */
201: if(pp)
202: csi->logic=stricmp(*pp
203: ,cmdstr(csi->ip,path,csi->str,buf));
204: else { /* Uninitialized str var */
205: if(*(csi->ip)==0) /* Blank static str */
206: csi->logic=LOGIC_TRUE;
207: else
208: csi->logic=LOGIC_FALSE; }
209: while(*(csi->ip++)); /* Find NULL */
210: return(0);
211: case STRSTR_VAR:
212: (char **)pp=getstrvar(csi,*(long *)csi->ip);
213: csi->ip+=4; /* Skip variable name */
214: if(pp && *pp && strstr(*pp
215: ,cmdstr(csi->ip,path,csi->str,buf)))
216: csi->logic=LOGIC_TRUE;
217: else
218: csi->logic=LOGIC_FALSE;
219: while(*(csi->ip++)); /* Find NULL */
220: return(0);
221: case STRNCMP_VAR:
222: i=*csi->ip++;
223: (char **)pp=getstrvar(csi,*(long *)csi->ip);
224: csi->ip+=4; /* Skip variable name */
225: if(pp && *pp)
226: csi->logic=strnicmp(*pp
227: ,cmdstr(csi->ip,path,csi->str,buf),i);
228: else
229: csi->logic=LOGIC_FALSE;
230: while(*(csi->ip++)); /* Find NULL */
231: return(0);
232: case STRNCMP_VARS:
233: i=*csi->ip++;
234: (char **)pp1=getstrvar(csi,*(long *)csi->ip);
235: csi->ip+=4; /* Skip variable name */
236: (char **)pp2=getstrvar(csi,*(long *)csi->ip);
237: csi->ip+=4;
238: if(pp1 && *pp1 && pp2 && *pp2)
239: csi->logic=strnicmp(*pp1,*pp2,i);
240: else
241: csi->logic=LOGIC_FALSE;
242: return(0);
243: case STRSTR_VARS:
244: (char **)pp1=getstrvar(csi,*(long *)csi->ip);
245: csi->ip+=4; /* Skip variable name */
246: (char **)pp2=getstrvar(csi,*(long *)csi->ip);
247: csi->ip+=4;
248: if(pp1 && *pp1 && pp2 && *pp2 && strstr(*pp1,*pp2))
249: csi->logic=LOGIC_TRUE;
250: else
251: csi->logic=LOGIC_FALSE;
252: return(0);
253: case COMPARE_INT_VAR:
254: lp=getintvar(csi,*(long *)csi->ip);
255: csi->ip+=4; /* Skip variable name */
256: l=*(long *)csi->ip;
257: csi->ip+=4; /* Skip static value */
258: if(!lp) { /* Unknown variable */
259: csi->logic=LOGIC_FALSE;
260: return(0); }
261: if(*lp>l)
262: csi->logic=LOGIC_GREATER;
263: else if(*lp<l)
264: csi->logic=LOGIC_LESS;
265: else
266: csi->logic=LOGIC_EQUAL;
267: return(0);
268: case COMPARE_VARS:
269: lp1=lp2=0;
270: (char **)pp1=getstrvar(csi,*(long *)csi->ip);
271: if(!pp1)
272: lp1=getintvar(csi,*(long *)csi->ip);
273: csi->ip+=4; /* Skip variable name */
274: (char **)pp2=getstrvar(csi,*(long *)csi->ip);
275: if(!pp2)
276: lp2=getintvar(csi,*(long *)csi->ip);
277: csi->ip+=4; /* Skip variable name */
278:
279: if(((!pp1 || !*pp1) && !lp1)
280: || ((!pp2 || !*pp2) && !lp2)) {
281: if(pp1 && pp2) /* Both unitialized or blank */
282: csi->logic=LOGIC_TRUE;
283: else
284: csi->logic=LOGIC_FALSE;
285: return(0); }
286:
287: if(pp1) { /* ASCII */
288: if(!pp2) {
289: ltoa(*lp2,tmp,10);
290: csi->logic=stricmp(*pp1,tmp); }
291: else
292: csi->logic=stricmp(*pp1,*pp2);
293: return(0); }
294:
295: /* Binary */
296: if(!lp2) {
297: l=strtol(*pp2,0,0);
298: if(*lp1>l)
299: csi->logic=LOGIC_GREATER;
300: else if(*lp1<l)
301: csi->logic=LOGIC_LESS;
302: else
303: csi->logic=LOGIC_EQUAL;
304: return(0); }
305: if(*lp1>*lp2)
306: csi->logic=LOGIC_GREATER;
307: else if(*lp1<*lp2)
308: csi->logic=LOGIC_LESS;
309: else
310: csi->logic=LOGIC_EQUAL;
311: return(0);
312: case COPY_VAR:
313: lp1=lp2=0;
314: (char **)pp1=getstrvar(csi,*(long *)csi->ip);
315: if(!pp1)
316: lp1=getintvar(csi,*(long *)csi->ip);
317: csi->ip+=4; /* Skip variable name */
318: (char **)pp2=getstrvar(csi,*(long *)csi->ip);
319: if(!pp2)
320: lp2=getintvar(csi,*(long *)csi->ip);
321: csi->ip+=4; /* Skip variable name */
322:
323: if((!pp1 && !lp1)
324: || ((!pp2 || !*pp2) && !lp2)) {
325: csi->logic=LOGIC_FALSE;
326: return(0); }
327: csi->logic=LOGIC_TRUE;
328:
329: if(pp1) { /* ASCII */
330: if(!pp2)
331: ltoa(*lp2,tmp,10);
332: else
333: strcpy(tmp,*pp2);
334: *pp1=copystrvar(csi,*pp1,tmp);
335: return(0); }
336: if(!lp2)
337: *lp1=strtol(*pp2,0,0);
338: else
339: *lp1=*lp2;
340: return(0);
341: case SWAP_VARS:
342: lp1=lp2=0;
343: (char **)pp1=getstrvar(csi,*(long *)csi->ip);
344: if(!pp1)
345: lp1=getintvar(csi,*(long *)csi->ip);
346: csi->ip+=4; /* Skip variable name */
347: (char **)pp2=getstrvar(csi,*(long *)csi->ip);
348: if(!pp2)
349: lp2=getintvar(csi,*(long *)csi->ip);
350: csi->ip+=4; /* Skip variable name */
351:
352: if(((!pp1 || !*pp1) && !lp1)
353: || ((!pp2 || !*pp2) && !lp2)) {
354: csi->logic=LOGIC_FALSE;
355: return(0); }
356:
357: csi->logic=LOGIC_TRUE;
358:
359: if(pp1) { /* ASCII */
360: if(!pp2) {
361: if(!strnicmp(*pp2,"0x",2)) {
362: l=strtol((*pp1)+2,0,16);
363: ltoa(*lp2,tmp,16); }
364: else {
365: l=atol(*pp1);
366: ltoa(*lp2,tmp,10); }
367: *pp1=copystrvar(csi,*pp1,tmp);
368: *lp2=l; }
369: else {
370: p=*pp1;
371: *pp1=*pp2;
372: *pp2=p; }
373: return(0); }
374:
375: /* Binary */
376: if(!lp2) {
377: if(!strnicmp(*pp2,"0x",2)) {
378: l=strtol((*pp2)+2,0,16);
379: ltoa(*lp1,tmp,16); }
380: else {
381: l=atol(*pp2);
382: ltoa(*lp1,tmp,10); }
383: *pp2=copystrvar(csi,*pp2,tmp);
384: *lp1=l; }
385: else {
386: l=*lp1;
387: *lp1=*lp2;
388: *lp2=l; }
389: return(0);
390: case CAT_STR_VAR:
391: (char **)pp=getstrvar(csi,*(long *)csi->ip);
392: csi->ip+=4; /* Skip variable name */
393: strcpy(tmp,csi->ip);
394: while(*(csi->ip++));
395: if(pp && *pp)
396: for(i=0;i<MAX_SYSVARS;i++)
397: if(*pp==sysvar_p[i])
398: break;
399: if(pp && *pp!=csi->str && i==MAX_SYSVARS) {
400: if(*pp)
401: *pp=REALLOC(*pp,strlen(*pp)+strlen(tmp)+1);
402: else
403: *pp=REALLOC(*pp,strlen(tmp)+1); }
404: if(pp && *pp)
405: strcat(*pp,tmp);
406: return(0);
407: case CAT_STR_VARS:
408: (char **)pp1=getstrvar(csi,*(long *)csi->ip);
409: csi->ip+=4; /* Skip dest variable name */
410: (char **)pp2=getstrvar(csi,*(long *)csi->ip);
411: csi->ip+=4; /* Skip source variable name */
412: if(!pp1 || !pp2 || !*pp2) {
413: csi->logic=LOGIC_FALSE;
414: return(0); }
415: csi->logic=LOGIC_TRUE;
416: if(*pp1)
417: for(i=0;i<MAX_SYSVARS;i++)
418: if(*pp1==sysvar_p[i])
419: break;
420: if(*pp1!=csi->str && (!*pp1 || i==MAX_SYSVARS)) {
421: if(*pp1)
422: *pp1=REALLOC(*pp1,strlen(*pp1)+strlen(*pp2)+1);
423: else
424: *pp1=REALLOC(*pp1,strlen(*pp2)+1); }
425: strcat(*pp1,*pp2);
426: return(0);
427: case FORMAT_STR_VAR:
428: (char **)pp=getstrvar(csi,*(long *)csi->ip);
429: csi->ip+=4; /* Skip variable name */
430: strcpy(str,csi->ip);
431: while(*(csi->ip++)); /* Find NULL */
432: j=*(csi->ip++); /* total args */
433: for(i=0;i<j;i++) {
434: vp=getstrvar(csi,*(long *)csi->ip);
435: if(!vp) {
436: lp=getintvar(csi,*(long *)csi->ip);
437: if(!lp)
438: arglist[i]=0;
439: else
440: arglist[i]=(void *)*lp; }
441: else
442: arglist[i]=*(char **)vp;
443: csi->ip+=4; }
444: vsprintf(tmp,str,arglist);
445: cmdstr(tmp,path,csi->str,str);
446: if(pp)
447: *pp=copystrvar(csi,*pp,str);
448: return(0);
449: case FORMAT_TIME_STR:
450: (char **)pp=getstrvar(csi,*(long *)csi->ip);
451: csi->ip+=4; /* Skip variable name */
452: strcpy(str,csi->ip);
453: while(*(csi->ip++)); /* Find NULL */
454: lp=getintvar(csi,*(long *)csi->ip);
455: csi->ip+=4;
456: if(pp && lp) {
457: tm_p=gmtime(lp);
458: strftime(buf,128,str,tm_p);
459: *pp=copystrvar(csi,*pp,buf); }
460: return(0);
461: case TIME_STR:
462: (char **)pp=getstrvar(csi,*(long *)csi->ip);
463: csi->ip+=4; /* Skip str variable name */
464: lp=getintvar(csi,*(long *)csi->ip);
465: csi->ip+=4; /* Skip int variable name */
466: if(pp && lp) {
467: strcpy(str,timestr(lp));
468: *pp=copystrvar(csi,*pp,str); }
469: return(0);
470: case DATE_STR:
471: (char **)pp=getstrvar(csi,*(long *)csi->ip);
472: csi->ip+=4; /* Skip str variable name */
473: lp=getintvar(csi,*(long *)csi->ip);
474: csi->ip+=4; /* Skip int variable name */
475: if(pp && lp) {
476: unixtodstr(*lp,str);
477: *pp=copystrvar(csi,*pp,str); }
478: return(0);
479: case SECOND_STR:
480: (char **)pp=getstrvar(csi,*(long *)csi->ip);
481: csi->ip+=4; /* Skip str variable name */
482: lp=getintvar(csi,*(long *)csi->ip);
483: csi->ip+=4; /* Skip int variable name */
484: if(pp && lp) {
485: sectostr(*lp,str);
486: *pp=copystrvar(csi,*pp,str); }
487: return(0);
488: case STRUPR_VAR:
489: (char **)pp=getstrvar(csi,*(long *)csi->ip);
490: csi->ip+=4;
491: if(pp && *pp)
492: strupr(*pp);
493: return(0);
494: case STRLWR_VAR:
495: (char **)pp=getstrvar(csi,*(long *)csi->ip);
496: csi->ip+=4;
497: if(pp && *pp)
498: strlwr(*pp);
499: return(0);
500: case TRUNCSP_STR_VAR:
501: (char **)pp=getstrvar(csi,*(long *)csi->ip);
502: csi->ip+=4;
503: if(pp && *pp)
504: truncsp(*pp);
505: return(0);
506: case STRIP_CTRL_STR_VAR:
507: (char **)pp=getstrvar(csi,*(long *)csi->ip);
508: csi->ip+=4;
509: if(pp && *pp)
510: strip_ctrl(*pp);
511: return(0);
512:
513: case ADD_INT_VAR:
514: case SUB_INT_VAR:
515: case MUL_INT_VAR:
516: case DIV_INT_VAR:
517: case MOD_INT_VAR:
518: case AND_INT_VAR:
519: case OR_INT_VAR:
520: case NOT_INT_VAR:
521: case XOR_INT_VAR:
522: i=*(csi->ip-1);
523: lp=getintvar(csi,*(long *)csi->ip);
524: csi->ip+=4;
525: l=*(long *)csi->ip;
526: csi->ip+=4;
527: if(!lp)
528: return(0);
529: switch(i) {
530: case ADD_INT_VAR:
531: *lp+=l;
532: break;
533: case SUB_INT_VAR:
534: *lp-=l;
535: break;
536: case MUL_INT_VAR:
537: *lp*=l;
538: break;
539: case DIV_INT_VAR:
540: *lp/=l;
541: break;
542: case MOD_INT_VAR:
543: *lp%=l;
544: break;
545: case AND_INT_VAR:
546: *lp&=l;
547: break;
548: case OR_INT_VAR:
549: *lp|=l;
550: break;
551: case NOT_INT_VAR:
552: *lp&=~l;
553: break;
554: case XOR_INT_VAR:
555: *lp^=l;
556: break; }
557: return(0);
558: case ADD_INT_VARS:
559: case SUB_INT_VARS:
560: case MUL_INT_VARS:
561: case DIV_INT_VARS:
562: case MOD_INT_VARS:
563: case AND_INT_VARS:
564: case OR_INT_VARS:
565: case NOT_INT_VARS:
566: case XOR_INT_VARS:
567: i=*(csi->ip-1);
568: lp1=getintvar(csi,*(long *)csi->ip);
569: csi->ip+=4;
570: lp2=getintvar(csi,*(long *)csi->ip);
571: csi->ip+=4;
572: if(!lp1)
573: return(0);
574: if(!lp2) {
575: (char **)pp=getstrvar(csi,*(long *)csi->ip);
576: if(!pp || !*pp)
577: return(0);
578: l=strtol(*pp,0,0); }
579: else
580: l=*lp2;
581: switch(i) {
582: case ADD_INT_VARS:
583: *lp1+=l;
584: break;
585: case SUB_INT_VARS:
586: *lp1-=l;
587: break;
588: case MUL_INT_VARS:
589: *lp1*=l;
590: break;
591: case DIV_INT_VARS:
592: *lp1/=l;
593: break;
594: case MOD_INT_VARS:
595: *lp1%=l;
596: break;
597: case AND_INT_VARS:
598: *lp1&=l;
599: break;
600: case OR_INT_VARS:
601: *lp1|=l;
602: break;
603: case NOT_INT_VARS:
604: *lp1&=~l;
605: break;
606: case XOR_INT_VARS:
607: *lp1^=l;
608: break; }
609: return(0);
610: case RANDOM_INT_VAR:
611: lp=getintvar(csi,*(long *)csi->ip);
612: csi->ip+=4;
613: l=*(long *)csi->ip;
614: csi->ip+=4;
615: if(lp)
616: *lp=random(l);
617: return(0);
618: case TIME_INT_VAR:
619: lp=getintvar(csi,*(long *)csi->ip);
620: csi->ip+=4;
621: if(lp)
622: *lp=time(NULL);
623: return(0);
624: case DATE_STR_TO_INT:
625: lp=getintvar(csi,*(long *)csi->ip);
626: csi->ip+=4;
627: (char **)pp=getstrvar(csi,*(long *)csi->ip);
628: csi->ip+=4;
629: if(lp && pp && *pp)
630: *lp=dstrtounix(*pp);
631: return(0);
632: case STRLEN_INT_VAR:
633: lp=getintvar(csi,*(long *)csi->ip);
634: csi->ip+=4;
635: (char **)pp=getstrvar(csi,*(long *)csi->ip);
636: csi->ip+=4;
637: if(lp) {
638: if(pp && *pp)
639: *lp=strlen(*pp);
640: else
641: *lp=0; }
642: return(0);
643: case CRC16_TO_INT:
644: lp=getintvar(csi,*(long *)csi->ip);
645: csi->ip+=4;
646: (char **)pp=getstrvar(csi,*(long *)csi->ip);
647: csi->ip+=4;
648: if(lp) {
649: if(pp && *pp)
650: *lp=crc16(*pp);
651: else
652: *lp=0; }
653: return(0);
654: case CRC32_TO_INT:
655: lp=getintvar(csi,*(long *)csi->ip);
656: csi->ip+=4;
657: (char **)pp=getstrvar(csi,*(long *)csi->ip);
658: csi->ip+=4;
659: if(lp) {
660: if(pp && *pp)
661: *lp=crc32(*pp,strlen(*pp));
662: else
663: *lp=0; }
664: return(0);
665: case CHKSUM_TO_INT:
666: lp=getintvar(csi,*(long *)csi->ip);
667: csi->ip+=4;
668: (char **)pp=getstrvar(csi,*(long *)csi->ip);
669: csi->ip+=4;
670: if(lp) {
671: *lp=0;
672: if(pp && *pp) {
673: i=0;
674: while(*((*pp)+i))
675: *lp+=(uchar)*((*pp)+(i++)); } }
676: return(0);
677: case FLENGTH_TO_INT:
678: lp=getintvar(csi,*(long *)csi->ip);
679: csi->ip+=4;
680: (char **)pp=getstrvar(csi,*(long *)csi->ip);
681: csi->ip+=4;
682: if(lp) {
683: if(pp && *pp)
684: *lp=flength(*pp);
685: else
686: *lp=0; }
687: return(0);
688: case FTIME_TO_INT:
689: lp=getintvar(csi,*(long *)csi->ip);
690: csi->ip+=4;
691: (char **)pp=getstrvar(csi,*(long *)csi->ip);
692: csi->ip+=4;
693: if(lp) {
694: if(pp && *pp)
695: *lp=fdate_dir(*pp);
696: else
697: *lp=0; }
698: return(0);
699: case CHARVAL_TO_INT:
700: lp=getintvar(csi,*(long *)csi->ip);
701: csi->ip+=4;
702: (char **)pp=getstrvar(csi,*(long *)csi->ip);
703: csi->ip+=4;
704: if(lp) {
705: if(pp && *pp)
706: *lp=**pp;
707: else
708: *lp=0; }
709: return(0);
710: case GETSTR_VAR:
711: case GETLINE_VAR:
712: case GETNAME_VAR:
713: case GETSTRUPR_VAR:
714: case GETSTR_MODE:
715: (char **)pp=getstrvar(csi,*(long *)csi->ip);
716: csi->ip+=4;
717: i=*(csi->ip++);
718: csi->logic=LOGIC_FALSE;
719: switch(*(csi->ip-6)) {
720: case GETNAME_VAR:
721: getstr(buf,i,K_UPRLWR);
722: break;
723: case GETSTRUPR_VAR:
724: getstr(buf,i,K_UPPER);
725: break;
726: case GETLINE_VAR:
727: getstr(buf,i,K_LINE);
728: break;
729: case GETSTR_MODE:
730: l=*(long *)csi->ip;
731: csi->ip+=4;
732: if(l&K_EDIT) {
733: if(pp && *pp)
734: strcpy(buf,*pp);
735: else
736: buf[0]=0; }
737: getstr(buf,i,l);
738: break;
739: default:
740: getstr(buf,i,0); }
741: if(sys_status&SS_ABORT)
742: return(0);
743: if(pp) {
744: *pp=copystrvar(csi,*pp,buf);
745: csi->logic=LOGIC_TRUE; }
746: return(0);
747: case GETNUM_VAR:
748: (char **)pp=getstrvar(csi,*(long *)csi->ip);
749: if(!pp)
750: lp=getintvar(csi,*(long *)csi->ip);
751: csi->ip+=4;
752: i=*(short *)csi->ip;
753: csi->ip+=2;
754: csi->logic=LOGIC_FALSE;
755: l=getnum(i);
756: if(!pp && !lp)
757: return(0);
758: if(pp) {
759: if(l<=0)
760: str[0]=0;
761: else
762: ltoa(l,str,10);
763: *pp=copystrvar(csi,*pp,str);
764: csi->logic=LOGIC_TRUE;
765: return(0); }
766: if(lp) {
767: *lp=l;
768: csi->logic=LOGIC_TRUE; }
769: return(0);
770:
771: case SHIFT_STR_VAR:
772: (char **)pp=getstrvar(csi,*(long *)csi->ip);
773: csi->ip+=4;
774: i=*(csi->ip++);
775: if(!pp || !*pp)
776: return(0);
777: if(strlen(*pp)>=i)
778: memmove(*pp,*pp+i,strlen(*pp)+1);
779: return(0);
780:
781: case CHKFILE_VAR:
782: (char **)pp=getstrvar(csi,*(long *)csi->ip);
783: csi->ip+=4;
784: if(pp && *pp && fexist(cmdstr(*pp,path,csi->str,buf)))
785: csi->logic=LOGIC_TRUE;
786: else
787: csi->logic=LOGIC_FALSE;
788: return(0);
789: case PRINTFILE_VAR_MODE:
790: (char **)pp=getstrvar(csi,*(long *)csi->ip);
791: csi->ip+=4;
792: i=*(short *)(csi->ip);
793: csi->ip+=2;
794: if(pp && *pp)
795: printfile(*pp,i);
796: return(0);
797: case PRINTTAIL_VAR_MODE:
798: (char **)pp=getstrvar(csi,*(long *)csi->ip);
799: csi->ip+=4;
800: i=*(short *)(csi->ip);
801: csi->ip+=2;
802: j=*csi->ip;
803: csi->ip++;
804: if(pp && *pp)
805: printtail(*pp,j,i);
806: return(0);
807: case SEND_FILE_VIA:
808: case RECEIVE_FILE_VIA:
809: j=*(csi->ip-1);
810: ch=*(csi->ip++); /* Protocol */
811: cmdstr(csi->ip,csi->str,csi->str,str);
812: while(*(csi->ip++)); /* Find NULL */
813: for(i=0;i<total_prots;i++)
814: if(prot[i]->mnemonic==ch && chk_ar(prot[i]->ar,useron))
815: break;
816: csi->logic=LOGIC_FALSE;
817: if(i<total_prots)
818: if(external(cmdstr(j==SEND_FILE_VIA
819: ? prot[i]->dlcmd : prot[i]->ulcmd,str,str,buf)
820: ,EX_OUTL)==0)
821: csi->logic=LOGIC_TRUE;
822: return(0);
823: case SEND_FILE_VIA_VAR:
824: case RECEIVE_FILE_VIA_VAR:
825: j=*(csi->ip-1);
826: ch=*(csi->ip++); /* Protocol */
827: (char **)pp=getstrvar(csi,*(long *)csi->ip);
828: csi->ip+=4;
829: for(i=0;i<total_prots;i++)
830: if(prot[i]->mnemonic==ch && chk_ar(prot[i]->ar,useron))
831: break;
832: csi->logic=LOGIC_FALSE;
833: if(!pp || !(*pp))
834: return(0);
835: if(i<total_prots)
836: if(external(cmdstr(j==SEND_FILE_VIA_VAR
837: ? prot[i]->dlcmd : prot[i]->ulcmd,*pp,*pp,buf)
838: ,EX_OUTL)==0)
839: csi->logic=LOGIC_TRUE;
840: return(0);
841:
842: default:
843: errormsg(WHERE,ERR_CHK,"var sub-instruction",*(csi->ip-1));
844: return(0); }
845:
846: case CS_FIO_FUNCTION:
847: switch(*(csi->ip++)) { /* sub-op-code stored as next byte */
848: case FIO_OPEN:
849: case FIO_OPEN_VAR:
850: lp=getintvar(csi,*(long *)csi->ip);
851: csi->ip+=4;
852: w=*(ushort *)csi->ip;
853: csi->ip+=2;
854: csi->logic=LOGIC_FALSE;
855: if(*(csi->ip-7)==FIO_OPEN) {
856: cmdstr(csi->ip,path,csi->str,str);
857: while(*(csi->ip++)); } /* skip filename */
858: else {
859: (char **)pp=getstrvar(csi,*(long *)csi->ip);
860: csi->ip+=4;
861: if(!pp || !*pp)
862: return(0);
863: strcpy(str,*pp); }
864: if(csi->files>=MAX_FOPENS)
865: return(0);
866: if(lp) {
867: /* Access flags are not cross-platform, so convert */
868: i=0;
869: if(w&1) i|=O_RDONLY;
870: if(w&2) i|=O_WRONLY;
871: if(w&4) i|=O_RDWR;
872: if(w&0x040) i|=O_DENYNONE;
873: if(w&0x100) i|=O_CREAT;
874: if(w&0x200) i|=O_TRUNC;
875: if(w&0x400) i|=O_EXCL;
876: if(w&0x800) i|=O_APPEND;
877: *lp=(long)fnopen(&j,str,i);
878: if(*lp) {
879: for(i=0;i<csi->files;i++)
880: if(!csi->file[i])
881: break;
882: csi->file[i]=(FILE *)*lp;
883: if(i==csi->files)
884: csi->files++;
885: csi->logic=LOGIC_TRUE; } }
886: return(0);
887: case FIO_CLOSE:
888: lp=getintvar(csi,*(long *)csi->ip);
889: csi->ip+=4;
890: if(lp && *lp) {
891: csi->logic=fclose((FILE *)*lp);
892: for(i=0;i<csi->files;i++)
893: if(csi->file[i]==(FILE *)*lp)
894: csi->file[i]=0; }
895: else
896: csi->logic=LOGIC_FALSE;
897: return(0);
898: case FIO_FLUSH:
899: lp=getintvar(csi,*(long *)csi->ip);
900: csi->ip+=4;
901: if(lp && *lp)
902: csi->logic=fflush((FILE *)*lp);
903: else
904: csi->logic=LOGIC_FALSE;
905: return(0);
906: case FIO_READ:
907: case FIO_READ_VAR:
908: lp1=getintvar(csi,*(long *)csi->ip); /* Handle */
909: csi->ip+=4;
910: (char **)pp=getstrvar(csi,*(long *)csi->ip);
911: if(!pp)
912: lp2=getintvar(csi,*(long *)csi->ip);
913: csi->ip+=4;
914: csi->logic=LOGIC_FALSE;
915: if(*(csi->ip-9)==FIO_READ) {
916: i=*(short *)csi->ip;
917: csi->ip+=2; /* Length */ }
918: else { /* FIO_READ_VAR */
919: vp=getintvar(csi,*(long *)csi->ip);
920: csi->ip+=4;
921: if(!vp)
922: return(0);
923: i=*(short *)vp; }
924: if(i>1024)
925: i=1024;
926: if(!lp1 || !(*lp1) || (!pp && !lp2))
927: return(0);
928: if(pp) {
929: if(i<1) {
930: if(*pp && **pp)
931: i=strlen(*pp);
932: else
933: i=128; }
934: if((j=fread(buf,1,i,(FILE *)*lp1))==i)
935: csi->logic=LOGIC_TRUE;
936: buf[j]=0;
937: if(csi->etx) {
938: p=strchr(buf,csi->etx);
939: if(p) *p=0; }
940: *pp=copystrvar(csi,*pp,buf); }
941: else {
942: *lp2=0;
943: if(i>4 || i<1) i=4;
944: if(fread(lp2,1,i,(FILE *)*lp1)==i)
945: csi->logic=LOGIC_TRUE; }
946: return(0);
947: case FIO_READ_LINE:
948: lp1=getintvar(csi,*(long *)csi->ip); /* Handle */
949: csi->ip+=4;
950: (char **)pp=getstrvar(csi,*(long *)csi->ip);
951: if(!pp)
952: lp2=getintvar(csi,*(long *)csi->ip);
953: csi->ip+=4;
954: csi->logic=LOGIC_FALSE;
955: if(!lp1 || !(*lp1) || feof((FILE *)*lp1) || (!pp && !lp2))
956: return(0);
957: csi->logic=LOGIC_TRUE;
958: for(i=0;i<1024 /* && !eof(*lp1) removed 1/23/96 */;i++) {
959: if(!fread(buf+i,1,1,(FILE *)*lp1))
960: break;
961: if(*(buf+i)==LF) {
962: i++;
963: break; } }
964: buf[i]=0;
965: if(csi->etx) {
966: p=strchr(buf,csi->etx);
967: if(p) *p=0; }
968: if(pp)
969: *pp=copystrvar(csi,*pp,buf);
970: else
971: *lp2=strtol(buf,0,0);
972: return(0);
973: case FIO_WRITE:
974: case FIO_WRITE_VAR:
975: lp1=getintvar(csi,*(long *)csi->ip);
976: csi->ip+=4;
977: (char **)pp=getstrvar(csi,*(long *)csi->ip);
978: if(!pp)
979: lp2=getintvar(csi,*(long *)csi->ip);
980: csi->ip+=4;
981: csi->logic=LOGIC_FALSE;
982: if(*(csi->ip-9)==FIO_WRITE) {
983: i=*(short *)csi->ip;
984: csi->ip+=2; /* Length */ }
985: else { /* FIO_WRITE_VAR */
986: vp=getintvar(csi,*(long *)csi->ip);
987: csi->ip+=4;
988: if(!vp)
989: return(0);
990: i=*(short *)vp; }
991: if(i>1024)
992: i=1024;
993: if(!lp1 || !(*lp1) || (!pp && !lp2) || (pp && !*pp))
994: return(0);
995: if(pp) {
996: j=strlen(*pp);
997: if(i<1) i=j;
998: if(j>i) j=i;
999: j=fwrite(*pp,1,j,(FILE *)*lp1);
1000: if(j<i) {
1001: memset(buf,csi->etx,i-j);
1002: fwrite(buf,1,i-j,(FILE *)*lp1); }
1003: csi->logic=LOGIC_TRUE; }
1004: else {
1005: if(i<1 || i>4) i=4;
1006: if(fwrite(lp2,1,i,(FILE *)*lp1)==i)
1007: csi->logic=LOGIC_TRUE; }
1008: return(0);
1009: case FIO_GET_LENGTH:
1010: lp1=getintvar(csi,*(long *)csi->ip);
1011: csi->ip+=4;
1012: lp2=getintvar(csi,*(long *)csi->ip);
1013: csi->ip+=4;
1014: if(lp1 && *lp1 && lp2)
1015: *lp2=filelength(fileno((FILE *)*lp1));
1016: return(0);
1017: case FIO_GET_TIME:
1018: lp1=getintvar(csi,*(long *)csi->ip);
1019: csi->ip+=4;
1020: lp2=getintvar(csi,*(long *)csi->ip);
1021: csi->ip+=4;
1022: if(lp1 && *lp1 && lp2) {
1023: getftime(fileno((FILE *)*lp1),&ft);
1024: *lp2=ftimetounix(ft); }
1025: return(0);
1026: case FIO_SET_TIME:
1027: lp1=getintvar(csi,*(long *)csi->ip);
1028: csi->ip+=4;
1029: lp2=getintvar(csi,*(long *)csi->ip);
1030: csi->ip+=4;
1031: if(lp1 && *lp1 && lp2) {
1032: ft=unixtoftime(*lp2);
1033: setftime(fileno((FILE *)*lp1),&ft); }
1034: return(0);
1035: case FIO_EOF:
1036: lp=getintvar(csi,*(long *)csi->ip);
1037: csi->ip+=4;
1038: csi->logic=LOGIC_FALSE;
1039: if(lp && *lp)
1040: if(ftell((FILE *)*lp)>=filelength(fileno((FILE *)*lp)))
1041: csi->logic=LOGIC_TRUE;
1042: return(0);
1043: case FIO_GET_POS:
1044: lp1=getintvar(csi,*(long *)csi->ip);
1045: csi->ip+=4;
1046: lp2=getintvar(csi,*(long *)csi->ip);
1047: csi->ip+=4;
1048: if(lp1 && *lp1 && lp2)
1049: *lp2=ftell((FILE *)*lp1);
1050: return(0);
1051: case FIO_SEEK:
1052: case FIO_SEEK_VAR:
1053: lp1=getintvar(csi,*(long *)csi->ip);
1054: csi->ip+=4;
1055: csi->logic=LOGIC_FALSE;
1056: if(*(csi->ip-5)==FIO_SEEK) {
1057: l=*(long *)csi->ip;
1058: csi->ip+=4; }
1059: else {
1060: lp2=getintvar(csi,*(long *)csi->ip);
1061: csi->ip+=4;
1062: if(!lp2) {
1063: csi->ip+=2;
1064: return(0); }
1065: l=*lp2; }
1066: i=*(short *)csi->ip;
1067: csi->ip+=2;
1068: if(lp1 && *lp1)
1069: if(fseek((FILE *)*lp1,l,i)!=-1)
1070: csi->logic=LOGIC_TRUE;
1071: return(0);
1072: case FIO_LOCK:
1073: case FIO_LOCK_VAR:
1074: lp1=getintvar(csi,*(long *)csi->ip);
1075: csi->ip+=4;
1076: csi->logic=LOGIC_FALSE;
1077: if(*(csi->ip-5)==FIO_LOCK) {
1078: l=*(long *)csi->ip;
1079: csi->ip+=4; }
1080: else {
1081: lp2=getintvar(csi,*(long *)csi->ip);
1082: csi->ip+=4;
1083: if(!lp2)
1084: return(0);
1085: l=*lp2; }
1086: if(lp1 && *lp1) {
1087: fflush((FILE *)*lp1);
1088: lseek(fileno((FILE *)*lp1),ftell((FILE *)*lp1),SEEK_SET);
1089: csi->logic=locking(fileno((FILE *)*lp1),LK_LOCK,l); }
1090: return(0);
1091: case FIO_UNLOCK:
1092: case FIO_UNLOCK_VAR:
1093: lp1=getintvar(csi,*(long *)csi->ip);
1094: csi->ip+=4;
1095: csi->logic=LOGIC_FALSE;
1096: if(*(csi->ip-5)==FIO_UNLOCK) {
1097: l=*(long *)csi->ip;
1098: csi->ip+=4; }
1099: else {
1100: lp2=getintvar(csi,*(long *)csi->ip);
1101: csi->ip+=4;
1102: if(!lp2)
1103: return(0);
1104: l=*lp2; }
1105: if(lp1 && *lp1) {
1106: fflush((FILE *)*lp1);
1107: lseek(fileno((FILE *)*lp1),ftell((FILE *)*lp1),SEEK_SET);
1108: csi->logic=locking(fileno((FILE *)*lp1),LK_UNLCK,l); }
1109: return(0);
1110: case FIO_SET_LENGTH:
1111: case FIO_SET_LENGTH_VAR:
1112: lp1=getintvar(csi,*(long *)csi->ip);
1113: csi->ip+=4;
1114: csi->logic=LOGIC_FALSE;
1115: if(*(csi->ip-5)==FIO_SET_LENGTH) {
1116: l=*(long *)csi->ip;
1117: csi->ip+=4; }
1118: else {
1119: lp2=getintvar(csi,*(long *)csi->ip);
1120: csi->ip+=4;
1121: if(!lp2)
1122: return(0);
1123: l=*lp2; }
1124: if(lp1 && *lp1)
1125: csi->logic=chsize(fileno((FILE *)*lp1),l);
1126: return(0);
1127: case FIO_PRINTF:
1128: lp1=getintvar(csi,*(long *)csi->ip);
1129: csi->ip+=4;
1130: strcpy(str,csi->ip);
1131: while(*(csi->ip++)); /* Find NULL */
1132: j=*(csi->ip++); /* total args */
1133: for(i=0;i<j;i++) {
1134: vp=getstrvar(csi,*(long *)csi->ip);
1135: if(!vp) {
1136: lp2=getintvar(csi,*(long *)csi->ip);
1137: if(!lp2)
1138: arglist[i]=0;
1139: else
1140: arglist[i]=(void *)*lp2; }
1141: else
1142: arglist[i]=*(char **)vp;
1143: csi->ip+=4; }
1144: vsprintf(tmp,str,arglist);
1145: if(lp1 && *lp1) {
1146: cmdstr(tmp,path,csi->str,str);
1147: fwrite(str,1,strlen(str),(FILE *)*lp1); }
1148: return(0);
1149: case FIO_SET_ETX:
1150: csi->etx=*(csi->ip++);
1151: return(0);
1152: case REMOVE_FILE:
1153: (char **)pp=getstrvar(csi,*(long *)csi->ip);
1154: csi->ip+=4;
1155: if(pp && *pp && remove(*pp)==0)
1156: csi->logic=LOGIC_TRUE;
1157: else
1158: csi->logic=LOGIC_FALSE;
1159: return(0);
1160: case RENAME_FILE:
1161: case COPY_FILE:
1162: case MOVE_FILE:
1163: (char **)pp1=getstrvar(csi,*(long *)csi->ip);
1164: csi->ip+=4; /* Skip variable name */
1165: (char **)pp2=getstrvar(csi,*(long *)csi->ip);
1166: csi->ip+=4;
1167: if(pp1 && *pp1 && pp2 && *pp2)
1168: switch(*(csi->ip-9)) {
1169: case RENAME_FILE:
1170: csi->logic=rename(*pp1,*pp2);
1171: break;
1172: case COPY_FILE:
1173: csi->logic=mv(*pp1,*pp2,1);
1174: break;
1175: case MOVE_FILE:
1176: csi->logic=mv(*pp1,*pp2,0);
1177: break; }
1178: else
1179: csi->logic=LOGIC_FALSE;
1180: return(0);
1181: case GET_FILE_ATTRIB:
1182: case SET_FILE_ATTRIB:
1183: lp=getintvar(csi,*(long *)csi->ip);
1184: csi->ip+=4;
1185: (char **)pp=getstrvar(csi,*(long *)csi->ip);
1186: csi->ip+=4;
1187: if(pp && *pp && lp) {
1188: if(*(csi->ip-9)==GET_FILE_ATTRIB)
1189: *lp=_chmod(*pp,0,0);
1190: else
1191: *lp=_chmod(*pp,1,(int)*lp); }
1192: return(0);
1193: case MAKE_DIR:
1194: case REMOVE_DIR:
1195: case CHANGE_DIR:
1196: (char **)pp=getstrvar(csi,*(long *)csi->ip);
1197: csi->ip+=4;
1198: if(pp && *pp)
1199: switch(*(csi->ip-5)) {
1200: case MAKE_DIR:
1201: csi->logic=mkdir(*pp);
1202: break;
1203: case REMOVE_DIR:
1204: csi->logic=rmdir(*pp);
1205: break;
1206: case CHANGE_DIR:
1207: csi->logic=chdir(*pp);
1208: break; }
1209: else
1210: csi->logic=LOGIC_FALSE;
1211: return(0);
1212: case OPEN_DIR:
1213: lp=getintvar(csi,*(long *)csi->ip);
1214: csi->ip+=4;
1215: (char **)pp=getstrvar(csi,*(long *)csi->ip);
1216: csi->ip+=4;
1217: csi->logic=LOGIC_FALSE;
1218: if(pp && *pp && lp) {
1219: *lp=(long)opendir((char *)*pp);
1220: if(*lp)
1221: csi->logic=LOGIC_TRUE; }
1222: return(0);
1223: case READ_DIR:
1224: lp=getintvar(csi,*(long *)csi->ip);
1225: csi->ip+=4;
1226: (char **)pp=getstrvar(csi,*(long *)csi->ip);
1227: csi->ip+=4;
1228: csi->logic=LOGIC_FALSE;
1229: if(pp && lp) {
1230: de=readdir((DIR *)(*lp));
1231: if(de!=NULL) {
1232: csi->logic=LOGIC_TRUE;
1233: *pp=copystrvar(csi,*pp,de->d_name); } }
1234: return(0);
1235: case REWIND_DIR:
1236: lp=getintvar(csi,*(long *)csi->ip);
1237: csi->ip+=4;
1238: if(lp) {
1239: rewinddir((DIR *)(*lp));
1240: csi->logic=LOGIC_TRUE; }
1241: else
1242: csi->logic=LOGIC_FALSE;
1243: return(0);
1244: case CLOSE_DIR:
1245: lp=getintvar(csi,*(long *)csi->ip);
1246: csi->ip+=4;
1247: if(lp && closedir((DIR *)(*lp))==0)
1248: csi->logic=LOGIC_TRUE;
1249: else
1250: csi->logic=LOGIC_FALSE;
1251: return(0);
1252: default:
1253: errormsg(WHERE,ERR_CHK,"fio sub-instruction",*(csi->ip-1));
1254: return(0); }
1255:
1256:
1257: case CS_SWITCH:
1258: lp=getintvar(csi,*(long *)csi->ip);
1259: csi->ip+=4;
1260: if(!lp) {
1261: skipto(csi,CS_END_SWITCH);
1262: csi->ip++; }
1263: else {
1264: csi->misc|=CS_IN_SWITCH;
1265: csi->switch_val=*lp; }
1266: return(0);
1267: case CS_CASE:
1268: l=*(long *)csi->ip;
1269: csi->ip+=4;
1270: if(csi->misc&CS_IN_SWITCH && csi->switch_val!=l)
1271: skipto(csi,CS_NEXTCASE);
1272: else
1273: csi->misc&=~CS_IN_SWITCH;
1274: return(0);
1275: case CS_COMPARE_ARS:
1276: i=*(csi->ip++); /* Length of ARS stored as byte before ARS */
1277: csi->logic=!chk_ar(csi->ip,useron);
1278: csi->ip+=i;
1279: return(0);
1280: case CS_TOGGLE_USER_MISC:
1281: useron.misc^=*(long *)csi->ip;
1282: putuserrec(useron.number,U_MISC,8,ultoa(useron.misc,tmp,16));
1283: csi->ip+=4;
1284: return(0);
1285: case CS_COMPARE_USER_MISC:
1286: if((useron.misc&*(long *)csi->ip)==*(long *)csi->ip)
1287: csi->logic=LOGIC_TRUE;
1288: else
1289: csi->logic=LOGIC_FALSE;
1290: csi->ip+=4;
1291: return(0);
1292: case CS_TOGGLE_USER_CHAT:
1293: useron.chat^=*(long *)csi->ip;
1294: putuserrec(useron.number,U_CHAT,8,ultoa(useron.chat,tmp,16));
1295: csi->ip+=4;
1296: return(0);
1297: case CS_COMPARE_USER_CHAT:
1298: if((useron.chat&*(long *)csi->ip)==*(long *)csi->ip)
1299: csi->logic=LOGIC_TRUE;
1300: else
1301: csi->logic=LOGIC_FALSE;
1302: csi->ip+=4;
1303: return(0);
1304: case CS_TOGGLE_USER_QWK:
1305: useron.qwk^=*(long *)csi->ip;
1306: putuserrec(useron.number,U_QWK,8,ultoa(useron.qwk,tmp,16));
1307: csi->ip+=4;
1308: return(0);
1309: case CS_COMPARE_USER_QWK:
1310: if((useron.qwk&*(long *)csi->ip)==*(long *)csi->ip)
1311: csi->logic=LOGIC_TRUE;
1312: else
1313: csi->logic=LOGIC_FALSE;
1314: csi->ip+=4;
1315: return(0);
1316: case CS_REPLACE_TEXT:
1317: i=*(ushort *)csi->ip;
1318: csi->ip+=2;
1319: i--;
1320: if(i>=TOTAL_TEXT) {
1321: errormsg(WHERE,ERR_CHK,"replace text #",i);
1322: while(*(csi->ip++)); /* Find NULL */
1323: return(0); }
1324: if(text[i]!=text_sav[i] && text[i]!=nulstr)
1325: FREE(text[i]);
1326: j=strlen(cmdstr(csi->ip,path,csi->str,buf));
1327: if(!j)
1328: text[i]=nulstr;
1329: else
1330: text[i]=MALLOC(j+1);
1331: if(!text[i]) {
1332: errormsg(WHERE,ERR_ALLOC,"replacement text",j);
1333: while(*(csi->ip++)); /* Find NULL */
1334: text[i]=text_sav[i];
1335: return(0); }
1336: if(j)
1337: strcpy(text[i],buf);
1338: while(*(csi->ip++)); /* Find NULL */
1339: return(0);
1340: case CS_USE_INT_VAR: // Self-modifying code!
1341: (char **)pp=getstrvar(csi,*(long *)csi->ip);
1342: if(pp && *pp)
1343: l=strtol(*pp,0,0);
1344: else {
1345: lp=getintvar(csi,*(long *)csi->ip);
1346: if(lp)
1347: l=*lp;
1348: else
1349: l=0; }
1350: csi->ip+=4; // Variable
1351: i=*(csi->ip++); // Offset
1352: if(i<1 || csi->ip+1+i>=csi->cs+csi->length) {
1353: errormsg(WHERE,ERR_CHK,"offset",i);
1354: csi->ip++;
1355: return(0); }
1356: switch(*(csi->ip++)) { // Length
1357: case sizeof(char):
1358: *(csi->ip+i)=(char)l;
1359: break;
1360: case sizeof(short):
1361: *((short *)(csi->ip+i))=(short)l;
1362: break;
1363: case sizeof(long):
1364: *((long *)(csi->ip+i))=l;
1365: break;
1366: default:
1367: errormsg(WHERE,ERR_CHK,"length",*(csi->ip-1));
1368: break; }
1369: return(0);
1370: default:
1371: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1));
1372: return(0); }
1373: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.