|
|
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.