Annotation of sbbs/sbbs2/execdos/execdos.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.