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