|
|
1.1 ! root 1: /* EXECDOS.C */ ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: /* Execute DOS external BBS programs from OS/2 BBS */ ! 6: ! 7: #include "sbbs.h" ! 8: ! 9: extern unsigned _heaplen=2048; ! 10: ! 11: extern uint riobp; ! 12: ! 13: ulong user_misc; ! 14: ! 15: /****************************************************************************/ ! 16: /* Truncates white-space chars off end of 'str' and terminates at first tab */ ! 17: /****************************************************************************/ ! 18: void truncsp(char *str) ! 19: { ! 20: uint c; ! 21: ! 22: str[strcspn(str,"\t")]=0; ! 23: c=strlen(str); ! 24: while(c && (uchar)str[c-1]<=SP) c--; ! 25: str[c]=0; ! 26: } ! 27: ! 28: void interrupt (*oldfunc)(void); ! 29: ! 30: /*****************************************************************************/ ! 31: /* Interrupt routine to expand WWIV Ctrl-C# codes into ANSI escape sequences */ ! 32: /*****************************************************************************/ ! 33: void interrupt wwiv_expand() ! 34: { ! 35: char str[256],al; ! 36: static int ctrl_c; ! 37: int i,j; ! 38: ! 39: al=_AL; ! 40: if(al!=3 && !ctrl_c) ! 41: oldfunc(); ! 42: else if(al!=3 && ctrl_c) { ! 43: ctrl_c=0; ! 44: if(user_misc&ANSI) { ! 45: switch(al) { ! 46: default: ! 47: strcpy(str,"\x1b[0m"); /* low grey */ ! 48: break; ! 49: case '1': ! 50: strcpy(str,"\x1b[0;1;36m"); /* high cyan */ ! 51: break; ! 52: case '2': ! 53: strcpy(str,"\x1b[0;1;33m"); /* high yellow */ ! 54: break; ! 55: case '3': ! 56: strcpy(str,"\x1b[0;35m"); /* low magenta */ ! 57: break; ! 58: case '4': ! 59: strcpy(str,"\x1b[0;1;44m"); /* white on blue */ ! 60: break; ! 61: case '5': ! 62: strcpy(str,"\x1b[0;32m"); /* low green */ ! 63: break; ! 64: case '6': ! 65: strcpy(str,"\x1b[0;1;5;31m"); /* high blinking red */ ! 66: break; ! 67: case '7': ! 68: strcpy(str,"\x1b[0;1;34m"); /* high blue */ ! 69: break; ! 70: case '8': ! 71: strcpy(str,"\x1b[0;34m"); /* low blue */ ! 72: break; ! 73: case '9': ! 74: strcpy(str,"\x1b[0;36m"); /* low cyan */ ! 75: break; } ! 76: j=strlen(str); ! 77: for(i=0;i<j;i++) { ! 78: _AL=str[i]; ! 79: oldfunc(); } } } ! 80: else ! 81: ctrl_c=1; ! 82: } ! 83: ! 84: int main(int argc, char **argv) ! 85: { ! 86: char str[256],commandline[128],sbbsnode[81],sbbsnnum[81],msr[31]="0" ! 87: ,user_name[LEN_NAME+1] ! 88: ,user_alias[LEN_ALIAS+1] ! 89: ,user_phone[LEN_PHONE+1] ! 90: ,user_location[LEN_LOCATION+1] ! 91: ,user_age ! 92: ,user_sex ! 93: ,user_level ! 94: ,node_scrnlen ! 95: ,*envvar[30],*arg[30],c,d; ! 96: int i,file,base,com_base=0,com_irq,dte_rate,rmode,mode,node_num,col,row; ! 97: FILE *stream; ! 98: ! 99: if(argc<2) { ! 100: printf("This program is for the internal use of Synchronet.\r\n"); ! 101: return(-1); } ! 102: ! 103: sprintf(sbbsnode,"SBBSNODE=%s",argv[1]); ! 104: putenv(sbbsnode); ! 105: sprintf(str,"%sEXECDOS.DAT",argv[1]); ! 106: if((file=open(str,O_RDONLY|O_BINARY))!=-1) { ! 107: stream=fdopen(file,"rb"); ! 108: str[0]=0; ! 109: fgets(str,128,stream); ! 110: truncsp(str); ! 111: if(strcmp(str,"V1.00")) { ! 112: printf("\7EXECDOS: SBBS VERSION MISMATCH!\7\r\n"); ! 113: delay(5000); ! 114: return(-1); } ! 115: str[0]=0; ! 116: fgets(str,128,stream); ! 117: com_base=strtoul(str,0,16); ! 118: str[0]=0; ! 119: fgets(str,128,stream); ! 120: com_irq=atoi(str); ! 121: str[0]=0; ! 122: fgets(str,128,stream); ! 123: dte_rate=atoi(str); ! 124: str[0]=0; ! 125: fgets(str,128,stream); ! 126: rmode=strtoul(str,0,16); ! 127: str[0]=0; ! 128: fgets(str,128,stream); ! 129: mode=strtoul(str,0,16); ! 130: str[0]=0; ! 131: fgets(str,128,stream); ! 132: user_misc=strtoul(str,0,16); ! 133: str[0]=0; ! 134: fgets(str,128,stream); ! 135: node_num=atoi(str); ! 136: if(node_num) { ! 137: sprintf(sbbsnnum,"SBBSNNUM=%u",node_num); ! 138: putenv(sbbsnnum); } ! 139: fgets(commandline,128,stream); ! 140: truncsp(commandline); ! 141: str[0]=0; ! 142: fgets(str,128,stream); ! 143: i=atoi(str); /* total env vars */ ! 144: while(i--) { ! 145: str[0]=0; ! 146: fgets(str,128,stream); ! 147: truncsp(str); ! 148: if((envvar[i]=MALLOC(strlen(str)+1))!=NULL) { ! 149: strcpy(envvar[i],str); ! 150: putenv(envvar[i]); } } ! 151: str[0]=0; ! 152: fgets(str,128,stream); ! 153: truncsp(str); ! 154: sprintf(user_alias,"%.*s",LEN_ALIAS,str); ! 155: str[0]=0; ! 156: fgets(str,128,stream); ! 157: truncsp(str); ! 158: sprintf(user_name,"%.*s",LEN_NAME,str); ! 159: str[0]=0; ! 160: fgets(str,128,stream); ! 161: user_level=atoi(str); ! 162: str[0]=0; ! 163: fgets(str,128,stream); ! 164: user_age=atoi(str); ! 165: str[0]=0; ! 166: fgets(str,128,stream); ! 167: user_sex=str[0]; ! 168: str[0]=0; ! 169: fgets(str,128,stream); ! 170: truncsp(str); ! 171: sprintf(user_phone,"%.*s",LEN_PHONE,str); ! 172: str[0]=0; ! 173: fgets(str,128,stream); ! 174: truncsp(str); ! 175: sprintf(user_location,"%.*s",LEN_LOCATION,str); ! 176: fclose(stream); } ! 177: ! 178: printf("\nEXECDOS: %s\n",commandline); ! 179: ! 180: if(rmode && com_base) { /* Capture the port and intercept I/O */ ! 181: base=0xffff; ! 182: switch(com_base) { ! 183: case 0xb: ! 184: rioctl(I14PC); ! 185: break; ! 186: case 0xffff: ! 187: case 0xd: ! 188: rioctl(I14DB); ! 189: break; ! 190: case 0xe: ! 191: rioctl(I14PS); ! 192: break; ! 193: case 0xf: ! 194: rioctl(I14FO); ! 195: break; ! 196: default: ! 197: base=com_base; ! 198: break; } ! 199: ! 200: if(rioini(base,com_irq)) { ! 201: printf("\7EXECDOS: Error initializing COM port (%x,%d)\7\r\n" ! 202: ,base,com_irq); ! 203: return(-1); } ! 204: rioctl(IOSM|CTSCK|RTSCK|PAUSE|ABORT); ! 205: rioctl(CPTON); /* Cvt ^p to ^^ */ ! 206: ! 207: sprintf(msr,"%lu",&riobp-1); ! 208: ! 209: sprintf(str,"%sINTRSBBS.DAT",argv[1]); ! 210: if((stream=fopen(str,"wb"))!=NULL) { ! 211: fprintf(stream,"%lu\r\n",&riobp-1); ! 212: fclose(stream); } } ! 213: ! 214: setbaud(dte_rate); ! 215: ! 216: if(rmode) { ! 217: ivhctl(rmode); ! 218: ! 219: if(mode&EX_WWIV) { /* WWIV code expansion */ ! 220: rioctl(CPTOFF); /* turn off ctrl-p translation */ ! 221: oldfunc=getvect(0x29); ! 222: setvect(0x29,wwiv_expand); } } ! 223: ! 224: ! 225: if(rmode&INT29L && user_alias[0]) { ! 226: node_scrnlen=lclini(0xd<<8); /* Tab expansion, no CRLF expansion */ ! 227: lclini(node_scrnlen-1); ! 228: col=lclwx(); ! 229: row=lclwy(); ! 230: lclxy(1,node_scrnlen); ! 231: lclatr(CYAN|HIGH|(BLUE<<4)); ! 232: lputs(" "); ! 233: sprintf(str,"%-25.25s %02d %-25.25s %02d %c %s" ! 234: ,user_alias,user_level,user_name[0] ? user_name : user_location ! 235: ,user_age ! 236: ,user_sex ? user_sex : SP ! 237: ,user_phone); ! 238: lputs(str); ! 239: lputc(CLREOL); ! 240: lclatr(LIGHTGRAY); ! 241: lclxy(col,row); } ! 242: ! 243: /* separate args */ ! 244: ! 245: arg[0]=commandline; /* point to the beginning of the string */ ! 246: for(c=0,d=1;commandline[c];c++) /* Break up command line */ ! 247: if(commandline[c]==SP) { ! 248: commandline[c]=0; /* insert nulls */ ! 249: if(!strncmp(commandline+c+1,"%& ",3)) ! 250: arg[d++]=msr; ! 251: else /* point to the beginning of the next arg */ ! 252: arg[d++]=commandline+c+1; } ! 253: arg[d]=0; ! 254: ! 255: /* spawn it */ ! 256: ! 257: i=spawnvp(P_WAIT,arg[0],arg); ! 258: ! 259: if(rmode) { ! 260: rioctl(TXSYNC|(3<<8)); ! 261: rioctl(IOFB); ! 262: if(mode&EX_WWIV) ! 263: setvect(0x29,oldfunc); ! 264: ivhctl(0); /* replace DOS output interrupt vectors */ ! 265: if(com_base) ! 266: rioini(0,0); } /* replace com port */ ! 267: ! 268: //if(i) // debug ! 269: // getch(); ! 270: return(i); ! 271: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.