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