|
|
1.1 ! root 1: /* exec.cpp */ ! 2: ! 3: /* Synchronet command shell/module interpretter */ ! 4: ! 5: /* $Id: exec.cpp,v 1.6 2000/12/11 23:21:11 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: char ** sbbs_t::getstrvar(csi_t *bin, long name) ! 42: { ! 43: uint i; ! 44: ! 45: if(sysvar_pi>=MAX_SYSVARS) sysvar_pi=0; ! 46: switch(name) { ! 47: case 0: ! 48: return((char **)&(bin->str)); ! 49: case 0x490873f1: ! 50: sysvar_p[sysvar_pi]=(char*)useron.alias; ! 51: break; ! 52: case 0x5de44e8b: ! 53: sysvar_p[sysvar_pi]=(char*)useron.name; ! 54: break; ! 55: case 0x979ef1de: ! 56: sysvar_p[sysvar_pi]=(char*)useron.handle; ! 57: break; ! 58: case 0xc8cd5fb7: ! 59: sysvar_p[sysvar_pi]=(char*)useron.comp; ! 60: break; ! 61: case 0xcc7aca99: ! 62: sysvar_p[sysvar_pi]=(char*)useron.note; ! 63: break; ! 64: case 0xa842c43b: ! 65: sysvar_p[sysvar_pi]=(char*)useron.address; ! 66: break; ! 67: case 0x4ee1ff3a: ! 68: sysvar_p[sysvar_pi]=(char*)useron.location; ! 69: break; ! 70: case 0xf000aa78: ! 71: sysvar_p[sysvar_pi]=(char*)useron.zipcode; ! 72: break; ! 73: case 0xcdb7e4a9: ! 74: sysvar_p[sysvar_pi]=(char*)useron.pass; ! 75: break; ! 76: case 0x94d59a7a: ! 77: sysvar_p[sysvar_pi]=(char*)useron.birth; ! 78: break; ! 79: case 0xec2b8fb8: ! 80: sysvar_p[sysvar_pi]=(char*)useron.phone; ! 81: break; ! 82: case 0x08f65a2a: ! 83: sysvar_p[sysvar_pi]=(char*)useron.modem; ! 84: break; ! 85: case 0xc7e0e8ce: ! 86: sysvar_p[sysvar_pi]=(char*)useron.netmail; ! 87: break; ! 88: case 0xd3606303: ! 89: sysvar_p[sysvar_pi]=(char*)useron.tmpext; ! 90: break; ! 91: case 0x3178f9d6: ! 92: sysvar_p[sysvar_pi]=(char*)useron.comment; ! 93: break; ! 94: ! 95: case 0x41239e21: ! 96: sysvar_p[sysvar_pi]=(char*)connection; ! 97: break; ! 98: case 0xe9f1fad0: ! 99: sysvar_p[sysvar_pi]=(char*)cap_fname; ! 100: break; ! 101: case 0x90fc82b4: ! 102: sysvar_p[sysvar_pi]=(char*)cid; ! 103: break; ! 104: case 0x15755030: ! 105: return((char **)&comspec); ! 106: ! 107: case 0xf19cd046: ! 108: sysvar_p[sysvar_pi]=(char*)wordwrap; ! 109: break; ! 110: ! 111: default: ! 112: if(bin->str_var && bin->str_var_name) ! 113: for(i=0;i<bin->str_vars;i++) ! 114: if(bin->str_var_name[i]==name) ! 115: return((char **)&(bin->str_var[i])); ! 116: if(global_str_var && global_str_var_name) ! 117: for(i=0;i<global_str_vars;i++) ! 118: if(global_str_var_name[i]==name) ! 119: return(&(global_str_var[i])); ! 120: return(NULL); } ! 121: ! 122: return((char **)&sysvar_p[sysvar_pi++]); ! 123: } ! 124: ! 125: long * sbbs_t::getintvar(csi_t *bin, long name) ! 126: { ! 127: uint i; ! 128: ! 129: if(sysvar_li>=MAX_SYSVARS) sysvar_li=0; ! 130: switch(name) { ! 131: case 0: ! 132: sysvar_l[sysvar_li]=strtol((char*)bin->str,0,0); ! 133: break; ! 134: case 0x908ece53: ! 135: sysvar_l[sysvar_li]=useron.number; ! 136: break; ! 137: case 0xdcedf626: ! 138: sysvar_l[sysvar_li]=useron.uls; ! 139: break; ! 140: case 0xc1093f61: ! 141: sysvar_l[sysvar_li]=useron.dls; ! 142: break; ! 143: case 0x2039a29f: ! 144: sysvar_l[sysvar_li]=useron.posts; ! 145: break; ! 146: case 0x4a9f3955: ! 147: sysvar_l[sysvar_li]=useron.emails; ! 148: break; ! 149: case 0x0c8dcf3b: ! 150: sysvar_l[sysvar_li]=useron.fbacks; ! 151: break; ! 152: case 0x9a13bf95: ! 153: sysvar_l[sysvar_li]=useron.etoday; ! 154: break; ! 155: case 0xc9082cbd: ! 156: sysvar_l[sysvar_li]=useron.ptoday; ! 157: break; ! 158: case 0x7c72376d: ! 159: sysvar_l[sysvar_li]=useron.timeon; ! 160: break; ! 161: case 0xac72c50b: ! 162: sysvar_l[sysvar_li]=useron.textra; ! 163: break; ! 164: case 0x04807a11: ! 165: sysvar_l[sysvar_li]=useron.logons; ! 166: break; ! 167: case 0x52996eab: ! 168: sysvar_l[sysvar_li]=useron.ttoday; ! 169: break; ! 170: case 0x098bdfcb: ! 171: sysvar_l[sysvar_li]=useron.tlast; ! 172: break; ! 173: case 0xbd1cee5d: ! 174: sysvar_l[sysvar_li]=useron.ltoday; ! 175: break; ! 176: case 0x07954570: ! 177: sysvar_l[sysvar_li]=useron.xedit; ! 178: break; ! 179: case 0xedf6aa98: ! 180: sysvar_l[sysvar_li]=useron.shell; ! 181: break; ! 182: case 0x328ed476: ! 183: sysvar_l[sysvar_li]=useron.level; ! 184: break; ! 185: case 0x9e70e855: ! 186: sysvar_l[sysvar_li]=useron.sex; ! 187: break; ! 188: case 0x094cc42c: ! 189: sysvar_l[sysvar_li]=useron.rows; ! 190: break; ! 191: case 0xabc4317e: ! 192: sysvar_l[sysvar_li]=useron.prot; ! 193: break; ! 194: case 0x7dd9aac0: ! 195: sysvar_l[sysvar_li]=useron.leech; ! 196: break; ! 197: case 0x7c602a37: ! 198: return((long *)&useron.misc); ! 199: case 0x61be0d36: ! 200: return((long *)&useron.qwk); ! 201: case 0x665ac227: ! 202: return((long *)&useron.chat); ! 203: case 0x951341ab: ! 204: return((long *)&useron.flags1); ! 205: case 0x0c1a1011: ! 206: return((long *)&useron.flags2); ! 207: case 0x7b1d2087: ! 208: return((long *)&useron.flags3); ! 209: case 0xe579b524: ! 210: return((long *)&useron.flags4); ! 211: case 0x12e7d6d2: ! 212: return((long *)&useron.exempt); ! 213: case 0xfed3115d: ! 214: return((long *)&useron.rest); ! 215: case 0xb65dd6d4: ! 216: return((long *)&useron.ulb); ! 217: case 0xabb91f93: ! 218: return((long *)&useron.dlb); ! 219: case 0x92fb364f: ! 220: return((long *)&useron.cdt); ! 221: case 0xd0a99c72: ! 222: return((long *)&useron.min); ! 223: case 0xd7ae3022: ! 224: return((long *)&useron.freecdt); ! 225: case 0x1ef214ef: ! 226: return((long *)&useron.firston); ! 227: case 0x0ea515b1: ! 228: return((long *)&useron.laston); ! 229: case 0x2aaf9bd3: ! 230: return((long *)&useron.expire); ! 231: case 0x89c91dc8: ! 232: return((long *)&useron.pwmod); ! 233: case 0x5b0d0c54: ! 234: return((long *)&useron.ns_time); ! 235: ! 236: case 0xae256560: ! 237: return((long *)&cur_rate); ! 238: case 0x2b3c257f: ! 239: return((long *)&cur_cps); ! 240: case 0x1c4455ee: ! 241: return((long *)&dte_rate); ! 242: case 0x7fbf958e: ! 243: return((long *)&lncntr); ! 244: case 0x5c1c1500: ! 245: return((long *)&tos); ! 246: case 0x613b690e: ! 247: return((long *)&rows); ! 248: case 0x205ace36: ! 249: return((long *)&autoterm); ! 250: case 0x7d0ed0d1: ! 251: return((long *)&console); ! 252: case 0xbf31a280: ! 253: return((long *)&answertime); ! 254: case 0x83aa2a6a: ! 255: return((long *)&logontime); ! 256: case 0xb50cb889: ! 257: return((long *)&ns_time); ! 258: case 0xae92d249: ! 259: return((long *)&last_ns_time); ! 260: case 0x97f99eef: ! 261: return((long *)&online); ! 262: case 0x381d3c2a: ! 263: return((long *)&sys_status); ! 264: case 0x7e29c819: ! 265: return((long *)&cfg.sys_misc); ! 266: case 0x11c83294: ! 267: return((long *)&cfg.sys_psnum); ! 268: case 0x02408dc5: ! 269: sysvar_l[sysvar_li]=cfg.sys_timezone; ! 270: break; ! 271: case 0x78afeaf1: ! 272: sysvar_l[sysvar_li]=cfg.sys_pwdays; ! 273: break; ! 274: case 0xd859385f: ! 275: sysvar_l[sysvar_li]=cfg.sys_deldays; ! 276: break; ! 277: case 0x6392dc62: ! 278: sysvar_l[sysvar_li]=cfg.sys_autodel; ! 279: break; ! 280: case 0x698d59b4: ! 281: sysvar_l[sysvar_li]=cfg.sys_nodes; ! 282: break; ! 283: case 0x6fb1c46e: ! 284: sysvar_l[sysvar_li]=cfg.sys_exp_warn; ! 285: break; ! 286: case 0xdf391ca7: ! 287: sysvar_l[sysvar_li]=cfg.sys_lastnode; ! 288: break; ! 289: case 0xdd982780: ! 290: sysvar_l[sysvar_li]=cfg.sys_autonode; ! 291: break; ! 292: case 0xf53db6c7: ! 293: sysvar_l[sysvar_li]=cfg.node_scrnlen; ! 294: break; ! 295: case 0xa1f0fcb7: ! 296: sysvar_l[sysvar_li]=cfg.node_scrnblank; ! 297: break; ! 298: case 0x709c07da: ! 299: return((long *)&cfg.node_misc); ! 300: case 0xb17e7914: ! 301: sysvar_l[sysvar_li]=cfg.node_valuser; ! 302: break; ! 303: case 0xadae168a: ! 304: sysvar_l[sysvar_li]=cfg.node_ivt; ! 305: break; ! 306: case 0x2aa89801: ! 307: sysvar_l[sysvar_li]=cfg.node_swap; ! 308: break; ! 309: case 0x4f02623a: ! 310: sysvar_l[sysvar_li]=cfg.node_minbps; ! 311: break; ! 312: case 0xe7a7fb07: ! 313: sysvar_l[sysvar_li]=cfg.node_num; ! 314: break; ! 315: case 0x6c8e350a: ! 316: sysvar_l[sysvar_li]=cfg.new_level; ! 317: break; ! 318: case 0xccfe7c5d: ! 319: return((long *)&cfg.new_flags1); ! 320: case 0x55f72de7: ! 321: return((long *)&cfg.new_flags2); ! 322: case 0x22f01d71: ! 323: return((long *)&cfg.new_flags3); ! 324: case 0xbc9488d2: ! 325: return((long *)&cfg.new_flags4); ! 326: case 0x4b0aeb24: ! 327: return((long *)&cfg.new_exempt); ! 328: case 0x20cb6325: ! 329: return((long *)&cfg.new_rest); ! 330: case 0x31178ba2: ! 331: return((long *)&cfg.new_cdt); ! 332: case 0x7345219f: ! 333: return((long *)&cfg.new_min); ! 334: case 0xb3f64be4: ! 335: sysvar_l[sysvar_li]=cfg.new_shell; ! 336: break; ! 337: case 0xa278584f: ! 338: return((long *)&cfg.new_misc); ! 339: case 0x7342a625: ! 340: sysvar_l[sysvar_li]=cfg.new_expire; ! 341: break; ! 342: case 0x75dc4306: ! 343: sysvar_l[sysvar_li]=cfg.new_prot; ! 344: break; ! 345: case 0xfb394e27: ! 346: sysvar_l[sysvar_li]=cfg.expired_level; ! 347: break; ! 348: case 0x89b69753: ! 349: return((long *)&cfg.expired_flags1); ! 350: case 0x10bfc6e9: ! 351: return((long *)&cfg.expired_flags2); ! 352: case 0x67b8f67f: ! 353: return((long *)&cfg.expired_flags3); ! 354: case 0xf9dc63dc: ! 355: return((long *)&cfg.expired_flags4); ! 356: case 0x0e42002a: ! 357: return((long *)&cfg.expired_exempt); ! 358: case 0x4569c62e: ! 359: return((long *)&cfg.expired_rest); ! 360: case 0xfcf3542e: ! 361: sysvar_l[sysvar_li]=cfg.min_dspace; ! 362: break; ! 363: case 0xcf9ce02c: ! 364: sysvar_l[sysvar_li]=cfg.cdt_min_value; ! 365: break; ! 366: case 0xfcb5b274: ! 367: return((long *)&cfg.cdt_per_dollar); ! 368: case 0x4db200d2: ! 369: sysvar_l[sysvar_li]=cfg.leech_pct; ! 370: break; ! 371: case 0x9a7d9cca: ! 372: sysvar_l[sysvar_li]=cfg.leech_sec; ! 373: break; ! 374: case 0x396b7167: ! 375: return((long *)&cfg.netmail_cost); ! 376: case 0x5eeaff21: ! 377: sysvar_l[sysvar_li]=cfg.netmail_misc; ! 378: break; ! 379: case 0x82d9484e: ! 380: return((long *)&cfg.inetmail_cost); ! 381: case 0xe558c608: ! 382: return((long *)&cfg.inetmail_misc); ! 383: ! 384: case 0xc6e8539d: ! 385: return((long *)&logon_ulb); ! 386: case 0xdb0c9ada: ! 387: return((long *)&logon_dlb); ! 388: case 0xac58736f: ! 389: return((long *)&logon_uls); ! 390: case 0xb1bcba28: ! 391: return((long *)&logon_dls); ! 392: case 0x9c5051c9: ! 393: return((long *)&logon_posts); ! 394: case 0xc82ba467: ! 395: return((long *)&logon_emails); ! 396: case 0x8e395209: ! 397: return((long *)&logon_fbacks); ! 398: case 0x8b12ba9d: ! 399: return((long *)&posts_read); ! 400: case 0xe51c1956: ! 401: sysvar_l[sysvar_li]=(ulong)logfile_fp; ! 402: break; ! 403: case 0x5a22d4bd: ! 404: sysvar_l[sysvar_li]=(ulong)nodefile_fp; ! 405: break; ! 406: case 0x3a37c26b: ! 407: sysvar_l[sysvar_li]=(ulong)node_ext_fp; ! 408: break; ! 409: ! 410: case 0xeb6c9c73: ! 411: sysvar_l[sysvar_li]=errorlevel; ! 412: break; ! 413: ! 414: case 0x5aaccfc5: ! 415: sysvar_l[sysvar_li]=errno; ! 416: break; ! 417: ! 418: case 0x057e4cd4: ! 419: sysvar_l[sysvar_li]=timeleft; ! 420: break; ! 421: ! 422: case 0x1e5052a7: ! 423: return((long *)&cfg.max_minutes); ! 424: case 0xedc643f1: ! 425: return((long *)&cfg.max_qwkmsgs); ! 426: ! 427: case 0x430178ec: ! 428: return((long *)&cfg.uq); ! 429: ! 430: default: ! 431: if(bin->int_var && bin->int_var_name) ! 432: for(i=0;i<bin->int_vars;i++) ! 433: if(bin->int_var_name[i]==name) ! 434: return(&bin->int_var[i]); ! 435: if(global_int_var && global_int_var_name) ! 436: for(i=0;i<global_int_vars;i++) ! 437: if(global_int_var_name[i]==name) ! 438: return(&global_int_var[i]); ! 439: return(NULL); } ! 440: ! 441: return(&sysvar_l[sysvar_li++]); ! 442: } ! 443: ! 444: void sbbs_t::clearvars(csi_t *bin) ! 445: { ! 446: bin->str_vars=0; ! 447: bin->str_var=NULL; ! 448: bin->str_var_name=NULL; ! 449: bin->int_vars=0; ! 450: bin->int_var=NULL; ! 451: bin->int_var_name=NULL; ! 452: bin->files=0; ! 453: bin->retval=0; ! 454: } ! 455: ! 456: void sbbs_t::freevars(csi_t *bin) ! 457: { ! 458: uint i; ! 459: ! 460: if(bin->str_var) { ! 461: for(i=0;i<bin->str_vars;i++) ! 462: if(bin->str_var[i]) ! 463: FREE(bin->str_var[i]); ! 464: FREE(bin->str_var); ! 465: } ! 466: if(bin->int_var) ! 467: FREE(bin->int_var); ! 468: if(bin->str_var_name) ! 469: FREE(bin->str_var_name); ! 470: if(bin->int_var_name) ! 471: FREE(bin->int_var_name); ! 472: for(i=0;i<bin->files;i++) { ! 473: if(bin->file[i]) { ! 474: fclose((FILE *)bin->file[i]); ! 475: bin->file[i]=0; ! 476: } ! 477: } ! 478: } ! 479: ! 480: /****************************************************************************/ ! 481: /* Copies a new value (str) into the string variable pointed to by p */ ! 482: /* re-allocating if necessary */ ! 483: /****************************************************************************/ ! 484: char * sbbs_t::copystrvar(csi_t *csi, char *p, char *str) ! 485: { ! 486: char *np; /* New pointer after realloc */ ! 487: int i; ! 488: ! 489: if(p!=csi->str) { ! 490: if(p) ! 491: for(i=0;i<MAX_SYSVARS;i++) ! 492: if(p==sysvar_p[i]) ! 493: break; ! 494: if(!p || i==MAX_SYSVARS) { /* Not system variable */ ! 495: if((np=(char*)REALLOC(p,strlen(str)+1))==NULL) ! 496: errormsg(WHERE,ERR_ALLOC,"variable",strlen(str)+1); ! 497: else ! 498: p=np; } } ! 499: if(p) ! 500: strcpy(p,str); ! 501: return(p); ! 502: } ! 503: ! 504: ! 505: long sbbs_t::exec_bin(char *mod, csi_t *csi) ! 506: { ! 507: char str[128]; ! 508: int file; ! 509: csi_t bin; ! 510: ! 511: memcpy(&bin,csi,sizeof(csi_t)); ! 512: clearvars(&bin); ! 513: ! 514: sprintf(str,"%s%s.bin",cfg.exec_dir,mod); ! 515: if((file=nopen(str,O_RDONLY))==-1) { ! 516: errormsg(WHERE,ERR_OPEN,str,O_RDONLY); ! 517: return(-1); } ! 518: ! 519: bin.length=filelength(file); ! 520: if((bin.cs=(uchar *)MALLOC(bin.length))==NULL) { ! 521: close(file); ! 522: errormsg(WHERE,ERR_ALLOC,str,bin.length); ! 523: return(-1); } ! 524: if(lread(file,bin.cs,bin.length)!=bin.length) { ! 525: close(file); ! 526: errormsg(WHERE,ERR_READ,str,bin.length); ! 527: FREE(bin.cs); ! 528: return(-1); } ! 529: close(file); ! 530: ! 531: bin.ip=bin.cs; ! 532: bin.rets=0; ! 533: bin.cmdrets=0; ! 534: bin.misc=0; ! 535: ! 536: while(exec(&bin)==0) ! 537: if(!(bin.misc&CS_OFFLINE_EXEC)) { ! 538: checkline(); ! 539: if(!online) ! 540: break; } ! 541: ! 542: freevars(&bin); ! 543: FREE(bin.cs); ! 544: csi->logic=bin.logic; ! 545: return(bin.retval); ! 546: } ! 547: ! 548: /****************************************************************************/ ! 549: /* Skcsi->ip to a specific instruction */ ! 550: /****************************************************************************/ ! 551: void sbbs_t::skipto(csi_t *csi, uchar inst) ! 552: { ! 553: int i,j; ! 554: ! 555: while(csi->ip<csi->cs+csi->length && ((inst&0x80) || *csi->ip!=inst)) { ! 556: ! 557: if(*csi->ip==CS_IF_TRUE || *csi->ip==CS_IF_FALSE ! 558: || (*csi->ip>=CS_IF_GREATER && *csi->ip<=CS_IF_LESS_OR_EQUAL)) { ! 559: csi->ip++; ! 560: skipto(csi,CS_ENDIF); ! 561: csi->ip++; ! 562: continue; } ! 563: ! 564: if(inst==CS_ELSEORENDIF ! 565: && (*csi->ip==CS_ELSE || *csi->ip==CS_ENDIF)) ! 566: break; ! 567: ! 568: if(inst==CS_NEXTCASE ! 569: && (*csi->ip==CS_CASE || *csi->ip==CS_DEFAULT ! 570: || *csi->ip==CS_END_SWITCH)) ! 571: break; ! 572: ! 573: if(*csi->ip==CS_SWITCH) { ! 574: csi->ip++; ! 575: csi->ip+=4; /* Skip variable name */ ! 576: skipto(csi,CS_END_SWITCH); ! 577: csi->ip++; ! 578: continue; } ! 579: ! 580: if(*csi->ip==CS_CASE) { ! 581: csi->ip++; ! 582: csi->ip+=4; /* Skip value */ ! 583: skipto(csi,CS_NEXTCASE); ! 584: continue; } ! 585: ! 586: if(*csi->ip==CS_CMDKEY || *csi->ip==CS_CMDCHAR) { ! 587: csi->ip+=2; ! 588: skipto(csi,CS_END_CMD); ! 589: csi->ip++; ! 590: continue; } ! 591: if(*csi->ip==CS_CMDSTR || *csi->ip==CS_CMDKEYS) { ! 592: csi->ip++; /* skip inst */ ! 593: while(*(csi->ip++)); /* skip string */ ! 594: skipto(csi,CS_END_CMD); ! 595: csi->ip++; ! 596: continue; } ! 597: ! 598: if(*csi->ip>=CS_FUNCTIONS) { ! 599: csi->ip++; ! 600: continue; } ! 601: ! 602: if(*csi->ip>=CS_MISC) { ! 603: switch(*csi->ip) { ! 604: case CS_VAR_INSTRUCTION: ! 605: csi->ip++; ! 606: switch(*(csi->ip++)) { ! 607: case SHOW_VARS: ! 608: continue; ! 609: case PRINT_VAR: ! 610: case DEFINE_STR_VAR: ! 611: case DEFINE_INT_VAR: ! 612: case DEFINE_GLOBAL_STR_VAR: ! 613: case DEFINE_GLOBAL_INT_VAR: ! 614: case TIME_INT_VAR: ! 615: case STRUPR_VAR: ! 616: case STRLWR_VAR: ! 617: case TRUNCSP_STR_VAR: ! 618: case CHKFILE_VAR: ! 619: case STRIP_CTRL_STR_VAR: ! 620: csi->ip+=4; /* Skip variable name */ ! 621: continue; ! 622: case GETSTR_VAR: ! 623: case GETNAME_VAR: ! 624: case GETLINE_VAR: ! 625: case GETSTRUPR_VAR: ! 626: case SHIFT_STR_VAR: ! 627: case SEND_FILE_VIA_VAR: ! 628: case RECEIVE_FILE_VIA_VAR: ! 629: case COMPARE_FIRST_CHAR: ! 630: csi->ip+=4; /* Skip variable name */ ! 631: csi->ip++; /* Skip char */ ! 632: continue; ! 633: case PRINTTAIL_VAR_MODE: ! 634: csi->ip++; /* Skip length */ ! 635: case PRINTFILE_VAR_MODE: ! 636: case GETNUM_VAR: ! 637: csi->ip+=4; /* Skip variable name */ ! 638: csi->ip+=2; /* Skip max num */ ! 639: continue; ! 640: case STRNCMP_VAR: ! 641: csi->ip++; /* Skip length */ ! 642: case SET_STR_VAR: ! 643: case COMPARE_STR_VAR: ! 644: case CAT_STR_VAR: ! 645: case STRSTR_VAR: ! 646: case TELNET_GATE_STR: ! 647: csi->ip+=4; /* Skip variable name */ ! 648: while(*(csi->ip++)); /* skip string */ ! 649: continue; ! 650: case FORMAT_TIME_STR: ! 651: csi->ip+=4; /* Skip destination variable */ ! 652: while(*(csi->ip++)); /* Skip string */ ! 653: csi->ip+=4; /* Skip int variable */ ! 654: continue; ! 655: case FORMAT_STR_VAR: /* SPRINTF */ ! 656: csi->ip+=4; /* Skip destination variable */ ! 657: case VAR_PRINTF: ! 658: while(*(csi->ip++)); /* Skip string */ ! 659: j=*(csi->ip++); /* Skip number of arguments */ ! 660: for(i=0;i<j;i++) ! 661: csi->ip+=4; /* Skip arguments */ ! 662: continue; ! 663: case SEND_FILE_VIA: ! 664: case RECEIVE_FILE_VIA: ! 665: csi->ip++; /* Skip prot */ ! 666: while(*(csi->ip++)); /* Skip filepath */ ! 667: continue; ! 668: case GETSTR_MODE: ! 669: case STRNCMP_VARS: ! 670: csi->ip++; /* Skip length */ ! 671: default: ! 672: csi->ip+=8; /* Skip two variable names or var & val */ ! 673: continue; } ! 674: ! 675: case CS_FIO_FUNCTION: ! 676: csi->ip++; ! 677: switch(*(csi->ip++)) { ! 678: case FIO_OPEN: ! 679: csi->ip+=4; /* File handle */ ! 680: csi->ip+=2; /* Access */ ! 681: while(*(csi->ip++)); /* path/filename */ ! 682: continue; ! 683: case FIO_CLOSE: ! 684: case FIO_FLUSH: ! 685: case FIO_EOF: ! 686: case REMOVE_FILE: ! 687: case REMOVE_DIR: ! 688: case CHANGE_DIR: ! 689: case MAKE_DIR: ! 690: case REWIND_DIR: ! 691: case CLOSE_DIR: ! 692: csi->ip+=4; /* File handle */ ! 693: continue; ! 694: case FIO_SET_ETX: ! 695: csi->ip++; ! 696: continue; ! 697: case FIO_PRINTF: ! 698: csi->ip+=4; /* File handle */ ! 699: while(*(csi->ip++)); /* String */ ! 700: j=*(csi->ip++); /* Number of arguments */ ! 701: for(i=0;i<j;i++) ! 702: csi->ip+=4; /* Arguments */ ! 703: continue; ! 704: case FIO_READ: ! 705: case FIO_WRITE: ! 706: case FIO_SEEK: ! 707: case FIO_SEEK_VAR: ! 708: case FIO_OPEN_VAR: ! 709: csi->ip+=4; /* File handle */ ! 710: csi->ip+=4; /* Variable */ ! 711: csi->ip+=2; /* Length/access */ ! 712: continue; ! 713: case FIO_READ_VAR: ! 714: case FIO_WRITE_VAR: ! 715: csi->ip+=4; /* File handle */ ! 716: csi->ip+=4; /* Buf Variable */ ! 717: csi->ip+=4; /* Length Variable */ ! 718: continue; ! 719: default: ! 720: csi->ip+=4; /* File handle */ ! 721: csi->ip+=4; /* Variable */ ! 722: continue; } ! 723: ! 724: case CS_COMPARE_ARS: ! 725: csi->ip++; ! 726: csi->ip+=(*csi->ip); ! 727: csi->ip++; ! 728: break; ! 729: case CS_TOGGLE_USER_MISC: ! 730: case CS_COMPARE_USER_MISC: ! 731: case CS_TOGGLE_USER_CHAT: ! 732: case CS_COMPARE_USER_CHAT: ! 733: case CS_TOGGLE_USER_QWK: ! 734: case CS_COMPARE_USER_QWK: ! 735: csi->ip+=5; ! 736: break; ! 737: case CS_REPLACE_TEXT: ! 738: csi->ip+=3; /* skip inst and text # */ ! 739: while(*(csi->ip++)); /* skip string */ ! 740: break; ! 741: case CS_USE_INT_VAR: ! 742: csi->ip+=7; // inst, var, offset, len ! 743: break; ! 744: default: ! 745: csi->ip++; } ! 746: continue; } ! 747: ! 748: if(*csi->ip==CS_ONE_MORE_BYTE) { ! 749: csi->ip++; /* skip extension */ ! 750: csi->ip++; /* skip instruction */ ! 751: continue; } ! 752: ! 753: if(*csi->ip==CS_TWO_MORE_BYTES) { ! 754: csi->ip++; /* skip extension */ ! 755: csi->ip++; /* skip instruction */ ! 756: csi->ip++; /* skip argument */ ! 757: continue; } ! 758: ! 759: if(*csi->ip==CS_THREE_MORE_BYTES) { ! 760: csi->ip++; /* skip extension */ ! 761: csi->ip++; /* skip instruction */ ! 762: csi->ip+=2; /* skip argument */ ! 763: continue; } ! 764: ! 765: if(*csi->ip==CS_STR_FUNCTION) { ! 766: csi->ip++; /* skip extension */ ! 767: csi->ip++; /* skip instruction */ ! 768: while(*(csi->ip++)); /* skip string */ ! 769: continue; } ! 770: ! 771: if(*csi->ip>=CS_ASCIIZ) { ! 772: csi->ip++; /* skip inst */ ! 773: while(*(csi->ip++)); /* skip string */ ! 774: continue; } ! 775: ! 776: if(*csi->ip>=CS_THREE_BYTE) { ! 777: csi->ip+=3; ! 778: continue; } ! 779: ! 780: if(*csi->ip>=CS_TWO_BYTE) { ! 781: csi->ip+=2; ! 782: continue; } ! 783: ! 784: csi->ip++; } ! 785: } ! 786: ! 787: ! 788: int sbbs_t::exec(csi_t *csi) ! 789: { ! 790: char str[256],*path; ! 791: char tmp[512]; ! 792: uchar buf[1025],ch; ! 793: int i,j,file; ! 794: long l; ! 795: FILE *stream; ! 796: ! 797: if(usrgrps) ! 798: cursubnum=usrsub[curgrp][cursub[curgrp]]; /* Used for ARS */ ! 799: else ! 800: cursubnum=INVALID_SUB; ! 801: if(usrlibs) { ! 802: curdirnum=usrdir[curlib][curdir[curlib]]; /* Used for ARS */ ! 803: path=cfg.dir[usrdir[curlib][curdir[curlib]]]->path; } ! 804: else { ! 805: curdirnum=INVALID_DIR; ! 806: path=nulstr; } ! 807: now=time(NULL); ! 808: ! 809: if(csi->ip>=csi->cs+csi->length) ! 810: return(1); ! 811: ! 812: if(*csi->ip>=CS_FUNCTIONS) ! 813: return(exec_function(csi)); ! 814: ! 815: /**********************************************/ ! 816: /* Miscellaneous variable length instructions */ ! 817: /**********************************************/ ! 818: ! 819: if(*csi->ip>=CS_MISC) ! 820: return(exec_misc(csi,path)); ! 821: ! 822: /********************************/ ! 823: /* ASCIIZ argument instructions */ ! 824: /********************************/ ! 825: ! 826: if(*csi->ip>=CS_ASCIIZ) { ! 827: switch(*(csi->ip++)) { ! 828: case CS_STR_FUNCTION: ! 829: switch(*(csi->ip++)) { ! 830: case CS_LOGIN: ! 831: csi->logic=login(csi->str,(char*)csi->ip); ! 832: break; ! 833: case CS_LOAD_TEXT: ! 834: csi->logic=LOGIC_FALSE; ! 835: for(i=0;i<TOTAL_TEXT;i++) ! 836: if(text[i]!=text_sav[i]) { ! 837: if(text[i]!=nulstr) ! 838: FREE(text[i]); ! 839: text[i]=text_sav[i]; } ! 840: sprintf(str,"%s%s.dat" ! 841: ,cfg.ctrl_dir,cmdstr((char*)csi->ip,path,csi->str,(char*)buf)); ! 842: if((stream=fnopen(&file,str,O_RDONLY))==NULL) { ! 843: errormsg(WHERE,ERR_OPEN,str,O_RDONLY); ! 844: break; } ! 845: for(i=0;i<TOTAL_TEXT && !feof(stream);i++) { ! 846: if((text[i]=readtext((long *)NULL,stream))==NULL) { ! 847: i--; ! 848: continue; } ! 849: if(!strcmp(text[i],text_sav[i])) { /* If identical */ ! 850: FREE(text[i]); /* Don't alloc */ ! 851: text[i]=text_sav[i]; } ! 852: else if(text[i][0]==0) { ! 853: FREE(text[i]); ! 854: text[i]=nulstr; } } ! 855: if(i<TOTAL_TEXT) { ! 856: fclose(stream); ! 857: errormsg(WHERE,ERR_READ,str,TOTAL_TEXT); ! 858: break; } ! 859: fclose(stream); ! 860: csi->logic=LOGIC_TRUE; ! 861: break; ! 862: default: ! 863: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); ! 864: break; } ! 865: while(*(csi->ip++)); /* Find NULL */ ! 866: return(0); ! 867: case CS_LOG: ! 868: log(cmdstr((char*)csi->ip,path,csi->str,(char*)buf)); ! 869: break; ! 870: case CS_GETCMD: ! 871: csi->cmd=(uchar)getkeys((char*)csi->ip,0); ! 872: if((char)csi->cmd==-1) ! 873: csi->cmd=3; ! 874: break; ! 875: case CS_CMDSTR: ! 876: if(stricmp(csi->str,(char*)csi->ip)) { ! 877: while(*(csi->ip++)); /* Find NULL */ ! 878: skipto(csi,CS_END_CMD); ! 879: csi->ip++; ! 880: return(0); } ! 881: break; ! 882: case CS_CMDKEYS: ! 883: for(i=0;csi->ip[i];i++) ! 884: if(csi->cmd==csi->ip[i]) ! 885: break; ! 886: if(!csi->ip[i]) { ! 887: while(*(csi->ip++)); /* Find NULL */ ! 888: skipto(csi,CS_END_CMD); ! 889: csi->ip++; ! 890: return(0); } ! 891: break; ! 892: case CS_GET_TEMPLATE: ! 893: gettmplt(csi->str,(char*)csi->ip,K_LINE); ! 894: if(sys_status&SS_ABORT) ! 895: csi->str[0]=0; ! 896: csi->cmd=csi->str[0]; ! 897: break; ! 898: case CS_TRASHCAN: ! 899: csi->logic=!trashcan(csi->str,(char*)csi->ip); ! 900: break; ! 901: case CS_CREATE_SIF: ! 902: create_sif_dat((char*)csi->ip,csi->str); ! 903: break; ! 904: case CS_READ_SIF: ! 905: read_sif_dat((char*)csi->ip,csi->str); ! 906: break; ! 907: case CS_MNEMONICS: ! 908: mnemonics((char*)csi->ip); ! 909: break; ! 910: case CS_PRINT: ! 911: putmsg(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),P_SAVEATR|P_NOABORT); ! 912: break; ! 913: case CS_PRINT_LOCAL: ! 914: lputs(cmdstr((char*)csi->ip,path,csi->str,(char*)buf)); ! 915: break; ! 916: case CS_PRINT_REMOTE: ! 917: putcom(cmdstr((char*)csi->ip,path,csi->str,(char*)buf)); ! 918: break; ! 919: case CS_PRINTFILE: ! 920: printfile(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),P_SAVEATR); ! 921: break; ! 922: case CS_PRINTFILE_REMOTE: ! 923: if(online!=ON_REMOTE || !(console&CON_R_ECHO)) ! 924: break; ! 925: console&=~CON_L_ECHO; ! 926: printfile(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),P_SAVEATR); ! 927: console|=CON_L_ECHO; ! 928: break; ! 929: case CS_PRINTFILE_LOCAL: ! 930: if(!(console&CON_L_ECHO)) ! 931: break; ! 932: console&=~CON_R_ECHO; ! 933: printfile(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),P_SAVEATR); ! 934: console|=CON_R_ECHO; ! 935: break; ! 936: case CS_CHKFILE: ! 937: csi->logic=!fexist(cmdstr((char*)csi->ip,path,csi->str,(char*)buf)); ! 938: break; ! 939: case CS_EXEC: ! 940: external(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),0); ! 941: break; ! 942: case CS_EXEC_INT: ! 943: external(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),EX_OUTR|EX_INR|EX_OUTL); ! 944: break; ! 945: case CS_EXEC_XTRN: ! 946: for(i=0;i<cfg.total_xtrns;i++) ! 947: if(!stricmp(cfg.xtrn[i]->code,(char*)csi->ip)) ! 948: break; ! 949: if(i<cfg.total_xtrns) ! 950: exec_xtrn(i); ! 951: break; ! 952: case CS_EXEC_BIN: ! 953: exec_bin(cmdstr((char*)csi->ip,path,csi->str,(char*)buf),csi); ! 954: break; ! 955: case CS_YES_NO: ! 956: csi->logic=!yesno(cmdstr((char*)csi->ip,path,csi->str,(char*)buf)); ! 957: break; ! 958: case CS_NO_YES: ! 959: csi->logic=!noyes(cmdstr((char*)csi->ip,path,csi->str,(char*)buf)); ! 960: break; ! 961: case CS_MENU: ! 962: menu(cmdstr((char*)csi->ip,path,csi->str,(char*)buf)); ! 963: break; ! 964: case CS_SETSTR: ! 965: strcpy(csi->str,cmdstr((char*)csi->ip,path,csi->str,(char*)buf)); ! 966: break; ! 967: case CS_SET_MENU_DIR: ! 968: cmdstr((char*)csi->ip,path,csi->str,menu_dir); ! 969: break; ! 970: case CS_SET_MENU_FILE: ! 971: cmdstr((char*)csi->ip,path,csi->str,menu_file); ! 972: break; ! 973: case CS_COMPARE_STR: ! 974: csi->logic=stricmp(csi->str,cmdstr((char*)csi->ip,path,csi->str,(char*)buf)); ! 975: break; ! 976: case CS_COMPARE_KEYS: ! 977: for(i=0;csi->ip[i];i++) ! 978: if(csi->cmd==csi->ip[i]) ! 979: break; ! 980: if(csi->ip[i]) ! 981: csi->logic=LOGIC_TRUE; ! 982: else ! 983: csi->logic=LOGIC_FALSE; ! 984: break; ! 985: case CS_COMPARE_WORD: ! 986: csi->logic=strnicmp(csi->str,(char*)csi->ip,strlen((char*)csi->ip)); ! 987: break; ! 988: default: ! 989: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); ! 990: break; } ! 991: while(*(csi->ip++)); /* Find NULL */ ! 992: return(0); } ! 993: ! 994: if(*csi->ip>=CS_THREE_BYTE) { ! 995: switch(*(csi->ip++)) { ! 996: case CS_THREE_MORE_BYTES: ! 997: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); ! 998: return(0); ! 999: case CS_GOTO: ! 1000: csi->ip=csi->cs+*((ushort *)(csi->ip)); ! 1001: return(0); ! 1002: case CS_CALL: ! 1003: csi->ret[csi->rets++]=csi->ip+2; ! 1004: csi->ip=csi->cs+*((ushort *)(csi->ip)); ! 1005: return(0); ! 1006: case CS_MSWAIT: ! 1007: mswait(*(ushort *)csi->ip); ! 1008: csi->ip+=2; ! 1009: return(0); ! 1010: case CS_TOGGLE_NODE_MISC: ! 1011: getnodedat(cfg.node_num,&thisnode,1); ! 1012: thisnode.misc^=*(ushort *)csi->ip; ! 1013: csi->ip+=2; ! 1014: putnodedat(cfg.node_num,&thisnode); ! 1015: return(0); ! 1016: case CS_COMPARE_NODE_MISC: ! 1017: getnodedat(cfg.node_num,&thisnode,0); ! 1018: if((thisnode.misc&*(ushort *)csi->ip)==*(ushort *)csi->ip) ! 1019: csi->logic=LOGIC_TRUE; ! 1020: else ! 1021: csi->logic=LOGIC_FALSE; ! 1022: csi->ip+=2; ! 1023: return(0); ! 1024: case CS_ADJUST_USER_CREDITS: ! 1025: i=*(short *)csi->ip; ! 1026: l=i*1024L; ! 1027: if(l<0) ! 1028: subtract_cdt(&cfg,&useron,-l); ! 1029: else ! 1030: useron.cdt=adjustuserrec(&cfg,useron.number,U_CDT,10,l); ! 1031: csi->ip+=2; ! 1032: return(0); ! 1033: case CS_ADJUST_USER_MINUTES: ! 1034: i=*(short *)csi->ip; ! 1035: useron.min=adjustuserrec(&cfg,useron.number,U_MIN,10,i); ! 1036: csi->ip+=2; ! 1037: return(0); ! 1038: case CS_GETNUM: ! 1039: i=*(short *)csi->ip; ! 1040: csi->ip+=2; ! 1041: l=getnum(i); ! 1042: if(l<=0) { ! 1043: csi->str[0]=0; ! 1044: csi->logic=LOGIC_FALSE; } ! 1045: else { ! 1046: sprintf(csi->str,"%lu",l); ! 1047: csi->logic=LOGIC_TRUE; } ! 1048: return(0); ! 1049: ! 1050: case CS_TOGGLE_USER_FLAG: ! 1051: i=*(csi->ip++); ! 1052: ch=*(csi->ip++); ! 1053: switch(i) { ! 1054: case '1': ! 1055: useron.flags1^=FLAG(ch); ! 1056: putuserrec(&cfg,useron.number,U_FLAGS1,8 ! 1057: ,ultoa(useron.flags1,tmp,16)); ! 1058: break; ! 1059: case '2': ! 1060: useron.flags2^=FLAG(ch); ! 1061: putuserrec(&cfg,useron.number,U_FLAGS2,8 ! 1062: ,ultoa(useron.flags2,tmp,16)); ! 1063: break; ! 1064: case '3': ! 1065: useron.flags3^=FLAG(ch); ! 1066: putuserrec(&cfg,useron.number,U_FLAGS3,8 ! 1067: ,ultoa(useron.flags3,tmp,16)); ! 1068: break; ! 1069: case '4': ! 1070: useron.flags4^=FLAG(ch); ! 1071: putuserrec(&cfg,useron.number,U_FLAGS4,8 ! 1072: ,ultoa(useron.flags4,tmp,16)); ! 1073: break; ! 1074: case 'R': ! 1075: useron.rest^=FLAG(ch); ! 1076: putuserrec(&cfg,useron.number,U_REST,8 ! 1077: ,ultoa(useron.rest,tmp,16)); ! 1078: break; ! 1079: case 'E': ! 1080: useron.exempt^=FLAG(ch); ! 1081: putuserrec(&cfg,useron.number,U_EXEMPT,8 ! 1082: ,ultoa(useron.exempt,tmp,16)); ! 1083: break; ! 1084: default: ! 1085: errormsg(WHERE,ERR_CHK,"user flag type",*(csi->ip-2)); ! 1086: return(0); } ! 1087: return(0); ! 1088: case CS_REVERT_TEXT: ! 1089: i=*(ushort *)csi->ip; ! 1090: csi->ip+=2; ! 1091: if((ushort)i==0xffff) { ! 1092: for(i=0;i<TOTAL_TEXT;i++) { ! 1093: if(text[i]!=text_sav[i] && text[i]!=nulstr) ! 1094: FREE(text[i]); ! 1095: text[i]=text_sav[i]; } ! 1096: return(0); } ! 1097: i--; ! 1098: if(i>=TOTAL_TEXT) { ! 1099: errormsg(WHERE,ERR_CHK,"revert text #",i); ! 1100: return(0); } ! 1101: if(text[i]!=text_sav[i] && text[i]!=nulstr) ! 1102: FREE(text[i]); ! 1103: text[i]=text_sav[i]; ! 1104: return(0); ! 1105: default: ! 1106: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); ! 1107: return(0); } } ! 1108: ! 1109: if(*csi->ip>=CS_TWO_BYTE) { ! 1110: switch(*(csi->ip++)) { ! 1111: case CS_TWO_MORE_BYTES: ! 1112: switch(*(csi->ip++)) { ! 1113: case CS_USER_EVENT: ! 1114: user_event(*(csi->ip++)); ! 1115: return(0); ! 1116: } ! 1117: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); ! 1118: return(0); ! 1119: case CS_SETLOGIC: ! 1120: csi->logic=*csi->ip++; ! 1121: return(0); ! 1122: case CS_CMDKEY: ! 1123: if( ((*csi->ip)==CS_DIGIT && isdigit(csi->cmd)) ! 1124: || ((*csi->ip)==CS_EDIGIT && csi->cmd&0x80 ! 1125: && isdigit(csi->cmd&0x7f))) { ! 1126: csi->ip++; ! 1127: return(0); } ! 1128: if(csi->cmd!=*csi->ip) { ! 1129: csi->ip++; ! 1130: skipto(csi,CS_END_CMD); } /* skip code */ ! 1131: csi->ip++; /* skip key */ ! 1132: return(0); ! 1133: case CS_CMDCHAR: ! 1134: if(csi->cmd!=*csi->ip) { ! 1135: csi->ip++; ! 1136: skipto(csi,CS_END_CMD); } /* skip code */ ! 1137: csi->ip++; /* skip key */ ! 1138: return(0); ! 1139: case CS_NODE_ACTION: ! 1140: action=*csi->ip++; ! 1141: return(0); ! 1142: case CS_NODE_STATUS: ! 1143: getnodedat(cfg.node_num,&thisnode,1); ! 1144: thisnode.status=*csi->ip++; ! 1145: putnodedat(cfg.node_num,&thisnode); ! 1146: return(0); ! 1147: case CS_GETSTR: ! 1148: csi->logic=LOGIC_TRUE; ! 1149: getstr(csi->str,*csi->ip++,0); ! 1150: if(sys_status&SS_ABORT) { ! 1151: csi->str[0]=0; ! 1152: csi->logic=LOGIC_FALSE; } ! 1153: if(csi->str[0]=='/' && csi->str[1]) ! 1154: csi->cmd=csi->str[1]|0x80; ! 1155: else ! 1156: csi->cmd=csi->str[0]; ! 1157: return(0); ! 1158: case CS_GETLINE: ! 1159: getstr(csi->str,*csi->ip++,K_LINE); ! 1160: if(sys_status&SS_ABORT) ! 1161: csi->str[0]=0; ! 1162: if(csi->str[0]=='/' && csi->str[1]) ! 1163: csi->cmd=csi->str[1]|0x80; ! 1164: else ! 1165: csi->cmd=csi->str[0]; ! 1166: return(0); ! 1167: case CS_GETSTRUPR: ! 1168: getstr(csi->str,*csi->ip++,K_UPPER); ! 1169: if(sys_status&SS_ABORT) ! 1170: csi->str[0]=0; ! 1171: if(csi->str[0]=='/' && csi->str[1]) ! 1172: csi->cmd=csi->str[1]|0x80; ! 1173: else ! 1174: csi->cmd=csi->str[0]; ! 1175: return(0); ! 1176: case CS_GETNAME: ! 1177: getstr(csi->str,*csi->ip++,K_UPRLWR); ! 1178: if(sys_status&SS_ABORT) ! 1179: csi->str[0]=0; ! 1180: return(0); ! 1181: case CS_SHIFT_STR: ! 1182: if(strlen(csi->str)>=*csi->ip) ! 1183: memmove(csi->str,csi->str+(*csi->ip) ! 1184: ,strlen(csi->str)+1); ! 1185: csi->ip++; ! 1186: return(0); ! 1187: case CS_COMPARE_KEY: ! 1188: if( ((*csi->ip)==CS_DIGIT && isdigit(csi->cmd)) ! 1189: || ((*csi->ip)==CS_EDIGIT && csi->cmd&0x80 ! 1190: && isdigit(csi->cmd&0x7f))) { ! 1191: csi->ip++; ! 1192: csi->logic=LOGIC_TRUE; } ! 1193: else { ! 1194: if(csi->cmd==*(csi->ip++)) ! 1195: csi->logic=LOGIC_TRUE; ! 1196: else ! 1197: csi->logic=LOGIC_FALSE; } ! 1198: return(0); ! 1199: case CS_COMPARE_CHAR: ! 1200: if(csi->cmd==*(csi->ip++)) ! 1201: csi->logic=LOGIC_TRUE; ! 1202: else ! 1203: csi->logic=LOGIC_FALSE; ! 1204: return(0); ! 1205: case CS_SET_USER_LEVEL: ! 1206: useron.level=*(csi->ip++); ! 1207: putuserrec(&cfg,useron.number,U_LEVEL,2,ultoa(useron.level,tmp,10)); ! 1208: return(0); ! 1209: case CS_SET_USER_STRING: ! 1210: csi->logic=LOGIC_FALSE; ! 1211: if(!csi->str[0]) { ! 1212: csi->ip++; ! 1213: return(0); } ! 1214: switch(*(csi->ip++)) { ! 1215: case USER_STRING_ALIAS: ! 1216: if(!isalpha(csi->str[0]) || trashcan(csi->str,"name")) ! 1217: break; ! 1218: i=matchuser(&cfg,csi->str); ! 1219: if(i && i!=useron.number) ! 1220: break; ! 1221: sprintf(useron.alias,"%.*s",LEN_ALIAS,csi->str); ! 1222: putuserrec(&cfg,useron.number,U_ALIAS,LEN_ALIAS,useron.alias); ! 1223: putusername(useron.number,useron.alias); ! 1224: csi->logic=LOGIC_TRUE; ! 1225: break; ! 1226: case USER_STRING_REALNAME: ! 1227: if(trashcan(csi->str,"name")) ! 1228: break; ! 1229: if(cfg.uq&UQ_DUPREAL ! 1230: && userdatdupe(useron.number,U_NAME,LEN_NAME ! 1231: ,csi->str,0)) ! 1232: break; ! 1233: sprintf(useron.name,"%.*s",LEN_NAME,csi->str); ! 1234: putuserrec(&cfg,useron.number,U_NAME,LEN_NAME ! 1235: ,useron.name); ! 1236: csi->logic=LOGIC_TRUE; ! 1237: break; ! 1238: case USER_STRING_HANDLE: ! 1239: if(trashcan(csi->str,"name")) ! 1240: break; ! 1241: if(cfg.uq&UQ_DUPHAND ! 1242: && userdatdupe(useron.number,U_HANDLE,LEN_HANDLE ! 1243: ,csi->str,0)) ! 1244: break; ! 1245: sprintf(useron.handle,"%.*s",LEN_HANDLE,csi->str); ! 1246: putuserrec(&cfg,useron.number,U_HANDLE,LEN_HANDLE ! 1247: ,useron.handle); ! 1248: csi->logic=LOGIC_TRUE; ! 1249: break; ! 1250: case USER_STRING_COMPUTER: ! 1251: sprintf(useron.comp,"%.*s",LEN_COMP,csi->str); ! 1252: putuserrec(&cfg,useron.number,U_COMP,LEN_COMP ! 1253: ,useron.comp); ! 1254: csi->logic=LOGIC_TRUE; ! 1255: break; ! 1256: case USER_STRING_NOTE: ! 1257: sprintf(useron.note,"%.*s",LEN_NOTE,csi->str); ! 1258: putuserrec(&cfg,useron.number,U_NOTE,LEN_NOTE ! 1259: ,useron.note); ! 1260: csi->logic=LOGIC_TRUE; ! 1261: break; ! 1262: case USER_STRING_ADDRESS: ! 1263: sprintf(useron.address,"%.*s",LEN_ADDRESS,csi->str); ! 1264: putuserrec(&cfg,useron.number,U_ADDRESS,LEN_ADDRESS ! 1265: ,useron.address); ! 1266: csi->logic=LOGIC_TRUE; ! 1267: break; ! 1268: case USER_STRING_LOCATION: ! 1269: sprintf(useron.location,"%.*s",LEN_LOCATION,csi->str); ! 1270: putuserrec(&cfg,useron.number,U_LOCATION,LEN_LOCATION ! 1271: ,useron.location); ! 1272: csi->logic=LOGIC_TRUE; ! 1273: break; ! 1274: case USER_STRING_ZIPCODE: ! 1275: sprintf(useron.zipcode,"%.*s",LEN_ZIPCODE,csi->str); ! 1276: putuserrec(&cfg,useron.number,U_ZIPCODE,LEN_ZIPCODE ! 1277: ,useron.zipcode); ! 1278: csi->logic=LOGIC_TRUE; ! 1279: break; ! 1280: case USER_STRING_PASSWORD: ! 1281: sprintf(useron.pass,"%.*s",LEN_PASS,csi->str); ! 1282: putuserrec(&cfg,useron.number,U_PASS,LEN_PASS ! 1283: ,useron.pass); ! 1284: csi->logic=LOGIC_TRUE; ! 1285: break; ! 1286: case USER_STRING_BIRTHDAY: ! 1287: if(!getage(&cfg,csi->str)) ! 1288: break; ! 1289: sprintf(useron.birth,"%.*s",LEN_BIRTH,csi->str); ! 1290: putuserrec(&cfg,useron.number,U_BIRTH,LEN_BIRTH ! 1291: ,useron.birth); ! 1292: csi->logic=LOGIC_TRUE; ! 1293: break; ! 1294: case USER_STRING_PHONE: ! 1295: if(trashcan(csi->str,"phone")) ! 1296: break; ! 1297: sprintf(useron.phone,"%.*s",LEN_PHONE,csi->str); ! 1298: putuserrec(&cfg,useron.number,U_PHONE,LEN_PHONE ! 1299: ,useron.phone); ! 1300: csi->logic=LOGIC_TRUE; ! 1301: break; ! 1302: case USER_STRING_MODEM: ! 1303: sprintf(useron.modem,"%.*s",LEN_MODEM,csi->str); ! 1304: putuserrec(&cfg,useron.number,U_MODEM,LEN_MODEM ! 1305: ,useron.phone); ! 1306: csi->logic=LOGIC_TRUE; ! 1307: break; ! 1308: case USER_STRING_COMMENT: ! 1309: sprintf(useron.comment,"%.*s",LEN_COMMENT,csi->str); ! 1310: putuserrec(&cfg,useron.number,U_COMMENT,LEN_COMMENT ! 1311: ,useron.comment); ! 1312: csi->logic=LOGIC_TRUE; ! 1313: break; ! 1314: case USER_STRING_NETMAIL: ! 1315: sprintf(useron.netmail,"%.*s",LEN_NETMAIL,csi->str); ! 1316: putuserrec(&cfg,useron.number,U_NETMAIL,LEN_NETMAIL ! 1317: ,useron.netmail); ! 1318: csi->logic=LOGIC_TRUE; ! 1319: break; ! 1320: default: ! 1321: errormsg(WHERE,ERR_CHK,"user string type",*(csi->ip-1)); ! 1322: return(0); } ! 1323: return(0); ! 1324: default: ! 1325: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); ! 1326: return(0); } } ! 1327: ! 1328: ! 1329: /*********************************/ ! 1330: /* Single Byte Instrcutions ONLY */ ! 1331: /*********************************/ ! 1332: ! 1333: switch(*(csi->ip++)) { ! 1334: case CS_ONE_MORE_BYTE: /* Just one MORE byte */ ! 1335: switch(*(csi->ip++)) { ! 1336: case CS_OFFLINE: ! 1337: csi->misc|=CS_OFFLINE_EXEC; ! 1338: return(0); ! 1339: case CS_ONLINE: ! 1340: csi->misc&=~CS_OFFLINE_EXEC; ! 1341: return(0); ! 1342: case CS_NEWUSER: ! 1343: newuser(); ! 1344: return(0); ! 1345: case CS_LOGON: ! 1346: if(logon()) ! 1347: csi->logic=LOGIC_TRUE; ! 1348: else ! 1349: csi->logic=LOGIC_FALSE; ! 1350: return(0); ! 1351: case CS_LOGOUT: ! 1352: logout(); ! 1353: return(0); ! 1354: case CS_EXIT: ! 1355: return(1); ! 1356: default: ! 1357: errormsg(WHERE,ERR_CHK,"one byte extended function" ! 1358: ,*(csi->ip-1)); ! 1359: return(0); } ! 1360: case CS_CRLF: ! 1361: CRLF; ! 1362: return(0); ! 1363: case CS_CLS: ! 1364: CLS; ! 1365: return(0); ! 1366: case CS_PAUSE: ! 1367: pause(); ! 1368: return(0); ! 1369: case CS_PAUSE_RESET: ! 1370: lncntr=0; ! 1371: return(0); ! 1372: case CS_GETLINES: ! 1373: ansi_getlines(); ! 1374: return(0); ! 1375: case CS_HANGUP: ! 1376: hangup(); ! 1377: return(0); ! 1378: case CS_LOGKEY: ! 1379: logch(csi->cmd,0); ! 1380: return(0); ! 1381: case CS_LOGKEY_COMMA: ! 1382: logch(csi->cmd,1); ! 1383: return(0); ! 1384: case CS_LOGSTR: ! 1385: log(csi->str); ! 1386: return(0); ! 1387: case CS_CHKSYSPASS: ! 1388: csi->logic=!chksyspass(0); ! 1389: return(0); ! 1390: case CS_PUT_NODE: ! 1391: getnodedat(cfg.node_num,&thisnode,1); ! 1392: putnodedat(cfg.node_num,&thisnode); ! 1393: return(0); ! 1394: case CS_SYNC: ! 1395: SYNC; ! 1396: return(0); ! 1397: case CS_ASYNC: ! 1398: ASYNC; ! 1399: return(0); ! 1400: case CS_RIOSYNC: ! 1401: RIOSYNC(0); ! 1402: return(0); ! 1403: case CS_GETTIMELEFT: ! 1404: gettimeleft(); ! 1405: return(0); ! 1406: case CS_RETURN: ! 1407: if(!csi->rets) ! 1408: return(1); ! 1409: csi->ip=csi->ret[--csi->rets]; ! 1410: return(0); ! 1411: case CS_GETKEY: ! 1412: csi->cmd=getkey(K_UPPER); ! 1413: return(0); ! 1414: case CS_GETCHAR: ! 1415: csi->cmd=csi->str[0]=getkey(0); ! 1416: return(0); ! 1417: case CS_INKEY: ! 1418: csi->cmd=toupper(inkey(K_GETSTR)); ! 1419: if(csi->cmd) ! 1420: csi->logic=LOGIC_TRUE; ! 1421: else ! 1422: csi->logic=LOGIC_FALSE; ! 1423: return(0); ! 1424: case CS_GETKEYE: ! 1425: csi->cmd=getkey(K_UPPER); ! 1426: if(csi->cmd=='/') { ! 1427: outchar('/'); ! 1428: csi->cmd=getkey(K_UPPER); ! 1429: csi->cmd|=0x80; } ! 1430: return(0); ! 1431: case CS_GETFILESPEC: ! 1432: if(getfilespec(csi->str)) ! 1433: csi->logic=LOGIC_TRUE; ! 1434: else ! 1435: csi->logic=LOGIC_FALSE; ! 1436: return(0); ! 1437: case CS_SAVELINE: ! 1438: SAVELINE; ! 1439: return(0); ! 1440: case CS_RESTORELINE: ! 1441: RESTORELINE; ! 1442: return(0); ! 1443: case CS_SELECT_SHELL: ! 1444: csi->logic=LOGIC_TRUE; ! 1445: for(i=0;i<cfg.total_shells;i++) ! 1446: uselect(1,i,"Command Shell",cfg.shell[i]->name,cfg.shell[i]->ar); ! 1447: if((i=uselect(0,useron.shell,0,0,0))>=0) { ! 1448: useron.shell=i; ! 1449: putuserrec(&cfg,useron.number,U_SHELL,8,cfg.shell[i]->code); } ! 1450: else ! 1451: csi->logic=LOGIC_FALSE; ! 1452: return(0); ! 1453: case CS_SET_SHELL: ! 1454: csi->logic=LOGIC_TRUE; ! 1455: for(i=0;i<cfg.total_shells;i++) ! 1456: if(!stricmp(csi->str,cfg.shell[i]->code) ! 1457: && chk_ar(cfg.shell[i]->ar,&useron)) ! 1458: break; ! 1459: if(i<cfg.total_shells) { ! 1460: useron.shell=i; ! 1461: putuserrec(&cfg,useron.number,U_SHELL,8,cfg.shell[i]->code); } ! 1462: else ! 1463: csi->logic=LOGIC_FALSE; ! 1464: return(0); ! 1465: ! 1466: case CS_SELECT_EDITOR: ! 1467: csi->logic=LOGIC_TRUE; ! 1468: for(i=0;i<cfg.total_xedits;i++) ! 1469: uselect(1,i,"External Editor",cfg.xedit[i]->name,cfg.xedit[i]->ar); ! 1470: if(useron.xedit) useron.xedit--; ! 1471: if((i=uselect(0,useron.xedit,0,0,0))>=0) { ! 1472: useron.xedit=i+1; ! 1473: putuserrec(&cfg,useron.number,U_XEDIT,8,cfg.xedit[i]->code); } ! 1474: else ! 1475: csi->logic=LOGIC_FALSE; ! 1476: return(0); ! 1477: case CS_SET_EDITOR: ! 1478: csi->logic=LOGIC_TRUE; ! 1479: for(i=0;i<cfg.total_xedits;i++) ! 1480: if(!stricmp(csi->str,cfg.xedit[i]->code) ! 1481: && chk_ar(cfg.xedit[i]->ar,&useron)) ! 1482: break; ! 1483: if(i<cfg.total_xedits) { ! 1484: useron.xedit=i+1; ! 1485: putuserrec(&cfg,useron.number,U_XEDIT,8,cfg.xedit[i]->code); } ! 1486: else ! 1487: csi->logic=LOGIC_FALSE; ! 1488: return(0); ! 1489: ! 1490: case CS_CLEAR_ABORT: ! 1491: sys_status&=~SS_ABORT; ! 1492: return(0); ! 1493: case CS_FINDUSER: ! 1494: i=finduser(csi->str); ! 1495: if(i) { ! 1496: csi->logic=LOGIC_TRUE; ! 1497: username(&cfg,i,csi->str); } ! 1498: else ! 1499: csi->logic=LOGIC_FALSE; ! 1500: return(0); ! 1501: case CS_UNGETKEY: ! 1502: ungetkey(csi->cmd&0x7f); ! 1503: return(0); ! 1504: case CS_UNGETSTR: ! 1505: j=strlen(csi->str); ! 1506: for(i=0;i<j;i++) ! 1507: ungetkey(csi->str[i]); ! 1508: return(0); ! 1509: case CS_PRINTKEY: ! 1510: if((csi->cmd&0x7f)>=SP) ! 1511: outchar(csi->cmd&0x7f); ! 1512: return(0); ! 1513: case CS_PRINTSTR: ! 1514: putmsg(csi->str,P_SAVEATR|P_NOABORT); ! 1515: return(0); ! 1516: case CS_CMD_HOME: ! 1517: csi->cmdret[csi->cmdrets++]=(csi->ip-1); ! 1518: return(0); ! 1519: case CS_END_CMD: ! 1520: if(csi->cmdrets) ! 1521: csi->ip=csi->cmdret[--csi->cmdrets]; ! 1522: /* Removed 06/07/95 ! 1523: else ! 1524: errormsg(WHERE,ERR_CHK,"misplaced end_cmd",(csi->ip-csi->cs)-1); ! 1525: */ ! 1526: return(0); ! 1527: case CS_CMD_POP: ! 1528: if(csi->cmdrets) ! 1529: csi->cmdrets--; ! 1530: return(0); ! 1531: case CS_IF_TRUE: ! 1532: if(csi->logic!=LOGIC_TRUE) { ! 1533: skipto(csi,CS_ELSEORENDIF); ! 1534: csi->ip++; } ! 1535: return(0); ! 1536: case CS_IF_GREATER: ! 1537: if(csi->logic!=LOGIC_GREATER) { ! 1538: skipto(csi,CS_ELSEORENDIF); ! 1539: csi->ip++; } ! 1540: return(0); ! 1541: case CS_IF_GREATER_OR_EQUAL: ! 1542: if(csi->logic!=LOGIC_GREATER && csi->logic!=LOGIC_EQUAL) { ! 1543: skipto(csi,CS_ELSEORENDIF); ! 1544: csi->ip++; } ! 1545: return(0); ! 1546: case CS_IF_LESS: ! 1547: if(csi->logic!=LOGIC_LESS) { ! 1548: skipto(csi,CS_ELSEORENDIF); ! 1549: csi->ip++; } ! 1550: return(0); ! 1551: case CS_IF_LESS_OR_EQUAL: ! 1552: if(csi->logic!=LOGIC_LESS && csi->logic!=LOGIC_EQUAL) { ! 1553: skipto(csi,CS_ELSEORENDIF); ! 1554: csi->ip++; } ! 1555: return(0); ! 1556: case CS_IF_FALSE: ! 1557: if(csi->logic==LOGIC_TRUE) { ! 1558: skipto(csi,CS_ELSEORENDIF); ! 1559: csi->ip++; } ! 1560: return(0); ! 1561: case CS_ELSE: ! 1562: skipto(csi,CS_ENDIF); ! 1563: csi->ip++; ! 1564: return(0); ! 1565: case CS_END_CASE: ! 1566: skipto(csi,CS_END_SWITCH); ! 1567: csi->misc&=~CS_IN_SWITCH; ! 1568: csi->ip++; ! 1569: return(0); ! 1570: case CS_DEFAULT: ! 1571: case CS_END_SWITCH: ! 1572: csi->misc&=~CS_IN_SWITCH; ! 1573: return(0); ! 1574: case CS_ENDIF: ! 1575: return(0); ! 1576: default: ! 1577: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); ! 1578: return(0); } ! 1579: } ! 1580:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.