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