Annotation of sbbs/sbbs2/xtrn.c, revision 1.1.1.1

1.1       root        1: #line 1 "XTRN.C"
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: /***************************************************************************/
                      6: /* Functions that pertain to external programs (other EXE or COM programs) */
                      7: /***************************************************************************/
                      8: 
                      9: #include "sbbs.h"
                     10: #include "cmdshell.h"
                     11: 
                     12: #ifndef __FLAT__
                     13: 
                     14: #include "spawno.h"
                     15: 
                     16: void interrupt (*oldfunc)(void);
                     17: 
                     18: /*****************************************************************************/
                     19: /* Interrupt routine to expand WWIV Ctrl-C# codes into ANSI escape sequences */
                     20: /*****************************************************************************/
                     21: void interrupt wwiv_expand()
                     22: {
                     23:        char str[256],al;
                     24:        static int ctrl_c;
                     25:        int i,j;
                     26: 
                     27: al=_AL;
                     28: if(al!=3 && !ctrl_c)
                     29:        oldfunc();
                     30: else if(al!=3 && ctrl_c) {
                     31:        ctrl_c=0;
                     32:        if(useron.misc&ANSI) {
                     33:                switch(al) {
                     34:                        default:
                     35:                                strcpy(str,"\x1b[0m");          /* low grey */
                     36:                                break;
                     37:                        case '1':
                     38:                                strcpy(str,"\x1b[0;1;36m");     /* high cyan */
                     39:                                break;
                     40:                        case '2':
                     41:                                strcpy(str,"\x1b[0;1;33m");     /* high yellow */
                     42:                                break;
                     43:                        case '3':
                     44:                                strcpy(str,"\x1b[0;35m");       /* low magenta */
                     45:                                break;
                     46:                        case '4':
                     47:                                strcpy(str,"\x1b[0;1;44m");     /* white on blue */
                     48:                                break;
                     49:                        case '5':
                     50:                                strcpy(str,"\x1b[0;32m");       /* low green */
                     51:                                break;
                     52:                        case '6':
                     53:                                strcpy(str,"\x1b[0;1;5;31m");   /* high blinking red */
                     54:                                break;
                     55:                        case '7':
                     56:                                strcpy(str,"\x1b[0;1;34m");     /* high blue */
                     57:                                break;
                     58:                        case '8':
                     59:                                strcpy(str,"\x1b[0;34m");       /* low blue */
                     60:                                break;
                     61:                        case '9':
                     62:                                strcpy(str,"\x1b[0;36m");       /* low cyan */
                     63:                                break; }
                     64:                j=strlen(str);
                     65:                for(i=0;i<j;i++) {
                     66:                        _AL=str[i];
                     67:                        oldfunc(); } } }
                     68: else
                     69:        ctrl_c=1;
                     70: }
                     71: #endif
                     72: 
                     73: /****************************************************************************/
                     74: /* Runs an external program directly using spawnvp                                                     */
                     75: /****************************************************************************/
                     76: int external(char *cmdline,char mode)
                     77: {
                     78:        char c,d,cmdlen,*arg[30],str[256],str2[256],fname[128],*p,x,y;
                     79:        int i,file,rmode=0;
                     80:        long l;
                     81:        FILE *fp;
                     82: #ifdef __OS2__
                     83:        RESULTCODES rc;
                     84: #endif
                     85: 
                     86: if(cmdline[0]=='*') {   /* Baja module */
                     87:        strcpy(str,cmdline+1);
                     88:        p=strchr(str,SP);
                     89:        if(p) {
                     90:                strcpy(main_csi.str,p+1);
                     91:                *p=0; }
                     92:        return(exec_bin(str,&main_csi)); }
                     93: 
                     94: #ifdef __MSDOS__
                     95: nosound();                                             /* if page is on, turn off sound */
                     96: #endif
                     97: attr(LIGHTGRAY);                /* set attributes to normal text */
                     98: 
                     99: strcpy(str,cmdline);           /* Set str to program name only */
                    100: p=strchr(str,SP);
                    101: if(p) *p=0;
                    102: strcpy(fname,str);
                    103: 
                    104: 
                    105: if(!(mode&EX_CC)) {
                    106:        if(strcspn(cmdline,"<>|")!=strlen(cmdline))
                    107:                mode|=EX_CC;    /* DOS I/O redirection; so, use command.com */
                    108:        else {
                    109:                i=strlen(str);
                    110:                if(i>4 && !stricmp(str+(i-4),".BAT"))   /* specified .BAT file */
                    111:                        mode|=EX_CC;
                    112:                else {
                    113:                        strcat(str,".BAT");
                    114:                        if(fexist(str))                                         /* and it's a .BAT file */
                    115:                                mode|=EX_CC; } } }
                    116: 
                    117: p=strrchr(fname,'\\');
                    118: if(!p) p=strchr(fname,':');
                    119: if(!p) p=fname;
                    120: else   p++;
                    121: 
                    122: #ifndef __FLAT__
                    123: 
                    124: for(i=0;i<total_swaps;i++)
                    125:        if(!stricmp(p,swap[i]->cmd))
                    126:                break;
                    127: if(i<total_swaps)
                    128:        mode|=EX_SWAP;
                    129: 
                    130: #else
                    131: 
                    132: for(i=0;i<total_os2pgms;i++)
                    133:        if(!stricmp(p,os2pgm[i]->name))
                    134:                break;
                    135: if(i<total_os2pgms) {
                    136:        mode|=EX_OS2;
                    137:        if(os2pgm[i]->misc&OS2_POPEN)
                    138:                mode|=EX_POPEN; }
                    139: 
                    140: #endif
                    141: 
                    142: #ifndef __FLAT__
                    143: 
                    144: if(node_swap&SWAP_NONE || mode&EX_WWIV)
                    145:        mode&=~EX_SWAP;
                    146: 
                    147: if(mode&EX_SWAP) {
                    148:        if(lclwy()>1 || lclwx()>1)
                    149:         lputs(crlf);
                    150:        lputs("Swapping...\r\n"); }
                    151: 
                    152: #endif
                    153: 
                    154: 
                    155: if(!(mode&EX_OS2) && mode&EX_CC)
                    156:        sprintf(str,"%s /C %s",
                    157: #ifdef __OS2__
                    158:        node_comspec     // Only used node_comspec for OS/2 ver
                    159: #else
                    160:        comspec
                    161: #endif
                    162:        ,cmdline);
                    163: 
                    164: else strcpy(str,cmdline);
                    165: if(!(mode&EX_OS2) && strlen(str)>126) {
                    166:        errormsg(WHERE,ERR_LEN,str,strlen(str));
                    167:        errorlevel=-1;
                    168:        return(-1); }
                    169: 
                    170: #ifndef __FLAT__
                    171: 
                    172: arg[0]=str;    /* point to the beginning of the string */
                    173: cmdlen=strlen(str);
                    174: for(c=0,d=1;c<cmdlen;c++)      /* Break up command line */
                    175:        if(str[c]==SP) {
                    176:                str[c]=0;                       /* insert nulls */
                    177:                arg[d++]=str+c+1; } /* point to the beginning of the next arg */
                    178: arg[d]=0;
                    179: 
                    180: #endif
                    181: 
                    182: if(mode&EX_OUTR && (console&CON_R_ECHO))
                    183:        rmode|=INT29R;
                    184: if(mode&EX_OUTL)
                    185:        rmode|=INT29L;
                    186: if(mode&EX_INR && (console&CON_R_INPUT))
                    187:        rmode|=INT16;
                    188: 
                    189: #ifndef __FLAT__
                    190: 
                    191: if(rmode)
                    192:        ivhctl(rmode);  /* set DOS output interception vectors */
                    193: 
                    194: if(mode&EX_WWIV) {     /* WWIV code expansion */
                    195:        rioctl(CPTOFF); /* turn off ctrl-p translation */
                    196:        oldfunc=getvect(0x29);
                    197:        setvect(0x29,wwiv_expand); }
                    198: 
                    199: if(com_port && sys_status&SS_COMISR && !(mode&(EX_OUTR|EX_INR))) {
                    200:        riosync(0);
                    201:        rioini(0,0);
                    202:        sys_status&=~SS_COMISR; }
                    203: 
                    204: if(!rmode) {                                   /* clear the status line */
                    205:     lclini(node_scrnlen);
                    206:     x=lclwx();
                    207:     y=lclwy();
                    208:        STATUSLINE;
                    209:     lclxy(1,node_scrnlen);
                    210:        lputc(CLREOL);
                    211:        TEXTWINDOW;
                    212:        lclxy(x,y); }
                    213: 
                    214: if(mode&EX_SWAP) {                             /* set the resident size */
                    215:        if(rmode)
                    216:                __spawn_resident=7000;  /* was 6000 */
                    217:        else
                    218:                __spawn_resident=0;
                    219:        i=spawnvpeo(node_swapdir,arg[0],(const char **)arg
                    220:                ,(const char **)environ); }
                    221: else
                    222:        i=spawnvpe(P_WAIT,arg[0],arg,environ);
                    223: 
                    224: #else //lif defined(__OS2__)
                    225: 
                    226: if(com_port && !(mode&EX_POPEN)
                    227:        && sys_status&SS_COMISR) {      /* Uninstall COM routines */
                    228:        riosync(0);
                    229:        rioini(0,0);
                    230:        sys_status&=~SS_COMISR; }
                    231: 
                    232: textattr(LIGHTGRAY);   // Redundant
                    233: if(!(mode&EX_OS2)) {   /* DOS pgm */
                    234:        if(lclwy()>1 || lclwx()>1)
                    235:         lputs(crlf);
                    236:        lprintf("Executing DOS program: %s\r\n",str);
                    237:        sprintf(str2,"%sEXECDOS.DAT",node_dir);
                    238:        if((file=nopen(str2,O_WRONLY|O_TRUNC|O_CREAT))!=-1) {
                    239:                sprintf(str2,"V1.00\r\n%X\r\n%lu\r\n%u\r\n%X\r\n%X\r\n%lX\r\n%u\r\n"
                    240:                        "%s\r\n"
                    241:                        ,online==ON_REMOTE ? com_base:0
                    242:                        ,com_irq,dte_rate,rmode,mode,useron.misc,node_num,str);
                    243:                write(file,str2,strlen(str2));
                    244:                sprintf(str2,"%u\r\nDSZLOG=%s\r\n"
                    245:                        ,1      /* Total env vars to setup */
                    246:                        ,getenv("DSZLOG"));
                    247:                write(file,str2,strlen(str2));
                    248:                if(online) {
                    249:                        sprintf(str2,"%s\r\n%s\r\n%u\r\n%u\r\n%c\r\n%s\r\n%s\r\n"
                    250:                                ,useron.alias
                    251:                                ,useron.name
                    252:                                ,useron.level
                    253:                                ,getage(useron.birth)
                    254:                                ,useron.sex
                    255:                                ,useron.phone
                    256:                                ,useron.location);
                    257:                        write(file,str2,strlen(str2)); }
                    258:                close(file); }
                    259: 
                    260:        sprintf(str,"%sEXECDOS.EXE %s",exec_dir,node_dir);
                    261: 
                    262:        x=wherex();
                    263:        y=wherey();
                    264:        i=system(str);
                    265:        gotoxy(x,y); }
                    266: else {  /* OS/2 pgm */
                    267:        window(1,1,80,node_scrnlen);
                    268:        x=lclwx();
                    269:     y=lclwy();
                    270:     lclxy(1,node_scrnlen);
                    271:        lputc(CLREOL);
                    272:     lclxy(x,y);
                    273:        i=system(cmdline);
                    274:        lputs(crlf);
                    275:        lputs(crlf);
                    276:        lclxy(1,node_scrnlen-1);
                    277:        }
                    278: 
                    279: #ifdef __OS2__
                    280: fixkbdmode();
                    281: #endif
                    282: textattr(LIGHTGRAY);
                    283: 
                    284: #endif
                    285: 
                    286: #ifndef __WIN32__
                    287: while(lkbrd(0))        /* suck up any chars in the keyboard buffer */
                    288:        ;
                    289: #endif
                    290: 
                    291: #ifdef __MSDOS__
                    292: setcbrk(0);
                    293: 
                    294: lclatr(LIGHTGRAY);
                    295: c=wherey();
                    296: if(c>=node_scrnlen)
                    297:        c=node_scrnlen-1;
                    298: lclxy(wherex(),c);                     /* put the cursor where BIOS thinks it is */
                    299: 
                    300: #endif
                    301: 
                    302: if(com_port && !(mode&EX_POPEN)
                    303: #ifndef __OS2__
                    304:        && !(mode&(EX_OUTR|EX_INR))
                    305: #endif
                    306:        ) {
                    307:        comini();
                    308:        setrate();
                    309:        rioctl(IOSM|PAUSE|ABORT); }
                    310: 
                    311: rioctl(CPTON); /* turn on ctrl-p translation */
                    312: 
                    313: #ifndef __FLAT__
                    314: if(mode&EX_WWIV)
                    315:        setvect(0x29,oldfunc);
                    316: 
                    317: if(rmode)
                    318:        ivhctl(0);              /* replace DOS output interrupt vectors */
                    319: #endif
                    320: 
                    321: setdisk(node_disk);
                    322: strcpy(str,node_dir);
                    323: str[strlen(str)-1]=0;
                    324: if(chdir(str))
                    325:        errormsg(WHERE,ERR_CHDIR,str,0);
                    326: 
                    327: #ifndef __FLAT__
                    328: lclini(node_scrnlen-1);
                    329: #endif
                    330: 
                    331: lncntr=0;
                    332: if(online)
                    333:        statusline();  /*  Replace status line after calling external program */
                    334: errorlevel=i;
                    335: return(i);
                    336: }
                    337: 
                    338: #ifndef __FLAT__
                    339: extern uint riobp;
                    340: extern mswtyp;
                    341: #endif
                    342: 
                    343: uint fakeriobp=0xffff;
                    344: 
                    345: /*****************************************************************************/
                    346: /* Returns command line generated from instr with %c replacments             */
                    347: /*****************************************************************************/
                    348: char *cmdstr(char *instr, char *fpath, char *fspec, char *outstr)
                    349: {
                    350:        static char static_cmd[128];
                    351:        char str[256],str2[128],*cmd;
                    352:     int i,j,len;
                    353: 
                    354: if(outstr==NULL)
                    355:        cmd=static_cmd;
                    356: else
                    357:        cmd=outstr;
                    358: len=strlen(instr);
                    359: for(i=j=0;i<len && j<128;i++) {
                    360:     if(instr[i]=='%') {
                    361:         i++;
                    362:         cmd[j]=0;
                    363:         switch(toupper(instr[i])) {
                    364:             case 'A':   /* User alias */
                    365:                 strcat(cmd,useron.alias);
                    366:                 break;
                    367:             case 'B':   /* Baud (DTE) Rate */
                    368:                 strcat(cmd,ultoa(dte_rate,str,10));
                    369:                 break;
                    370:             case 'C':   /* Connect Description */
                    371:                 strcat(cmd,connection);
                    372:                 break;
                    373:             case 'D':   /* Connect (DCE) Rate */
                    374:                 strcat(cmd,ultoa((ulong)cur_rate,str,10));
                    375:                 break;
                    376:             case 'E':   /* Estimated Rate */
                    377:                 strcat(cmd,ultoa((ulong)cur_cps*10,str,10));
                    378:                 break;
                    379:             case 'F':   /* File path */
                    380:                 strcat(cmd,fpath);
                    381:                 break;
                    382:             case 'G':   /* Temp directory */
                    383:                                strcat(cmd,temp_dir);
                    384:                 break;
                    385:                        case 'H':   /* Port Handle or Hardware Flow Control */
                    386: #ifdef __OS2__
                    387:                                strcat(cmd,itoa(rio_handle,str,10));
                    388: #else
                    389:                 if(mdm_misc&MDM_CTS)
                    390:                     strcat(cmd,"Y");
                    391:                 else
                    392:                     strcat(cmd,"N");
                    393: #endif
                    394:                 break;
                    395:             case 'I':   /* UART IRQ Line */
                    396:                 strcat(cmd,itoa(com_irq,str,10));
                    397:                 break;
                    398:             case 'J':
                    399:                                strcat(cmd,data_dir);
                    400:                 break;
                    401:             case 'K':
                    402:                                strcat(cmd,ctrl_dir);
                    403:                 break;
                    404:             case 'L':   /* Lines per message */
                    405:                 strcat(cmd,itoa(level_linespermsg[useron.level],str,10));
                    406:                 break;
                    407:             case 'M':   /* Minutes (credits) for user */
                    408:                 strcat(cmd,ultoa(useron.min,str,10));
                    409:                 break;
                    410:             case 'N':   /* Node Directory (same as SBBSNODE environment var) */
                    411:                 strcat(cmd,node_dir);
                    412:                 break;
                    413:             case 'O':   /* SysOp */
                    414:                 strcat(cmd,sys_op);
                    415:                 break;
                    416:             case 'P':   /* COM Port */
                    417:                 strcat(cmd,itoa(online==ON_LOCAL ? 0:com_port,str,10));
                    418:                 break;
                    419:             case 'Q':   /* QWK ID */
                    420:                 strcat(cmd,sys_id);
                    421:                 break;
                    422:             case 'R':   /* Rows */
                    423:                 strcat(cmd,itoa(rows,str,10));
                    424:                 break;
                    425:             case 'S':   /* File Spec */
                    426:                 strcat(cmd,fspec);
                    427:                 break;
                    428:             case 'T':   /* Time left in seconds */
                    429:                 gettimeleft();
                    430:                 strcat(cmd,itoa(timeleft,str,10));
                    431:                 break;
                    432:             case 'U':   /* UART I/O Address (in hex) */
                    433:                 strcat(cmd,itoa(com_base,str,16));
                    434:                 break;
                    435:             case 'V':   /* Synchronet Version */
                    436:                 sprintf(str,"%s%c",VERSION,REVISION);
                    437:                 break;
                    438:             case 'W':   /* Time-slice API type (mswtype) */
                    439: #ifndef __FLAT__
                    440:                 strcat(cmd,itoa(mswtyp,str,10));
                    441: #endif
                    442:                 break;
                    443:             case 'X':
                    444:                 strcat(cmd,shell[useron.shell]->code);
                    445:                 break;
                    446:             case '&':   /* Address of msr */
                    447: #ifndef __FLAT__
                    448:                 sprintf(str,"%lu",sys_status&SS_DCDHIGH ? &fakeriobp
                    449:                     : online==ON_REMOTE ? &riobp-1 : 0);
                    450:                 strcat(cmd,str);
                    451: #else
                    452:                                strcat(cmd,"%&");
                    453: #endif
                    454:                 break;
                    455:                        case 'Y':
                    456:                                strcat(cmd,
                    457: #ifdef __OS2__
                    458:                                node_comspec
                    459: #else
                    460:                                comspec
                    461: #endif
                    462:                                );
                    463:                                break;
                    464:                        case 'Z':
                    465:                                strcat(cmd,text_dir);
                    466:                 break;
                    467:             case '!':   /* EXEC Directory */
                    468:                                strcat(cmd,exec_dir);
                    469:                 break;
                    470:             case '#':   /* Node number (same as SBBSNNUM environment var) */
                    471:                 sprintf(str,"%d",node_num);
                    472:                 strcat(cmd,str);
                    473:                 break;
                    474:             case '*':
                    475:                 sprintf(str,"%03d",node_num);
                    476:                 strcat(cmd,str);
                    477:                 break;
                    478:             case '$':   /* Credits */
                    479:                 strcat(cmd,ultoa(useron.cdt+useron.freecdt,str,10));
                    480:                 break;
                    481:             case '%':   /* %% for percent sign */
                    482:                 strcat(cmd,"%");
                    483:                 break;
                    484:             default:    /* unknown specification */
                    485:                 if(isdigit(instr[i])) {
                    486:                     sprintf(str,"%0*d",instr[i]&0xf,useron.number);
                    487:                     strcat(cmd,str); }
                    488: /*
                    489:                 else
                    490:                     errormsg(WHERE,ERR_CHK,instr,i);
                    491: */
                    492:                 break; }
                    493:         j=strlen(cmd); }
                    494:     else
                    495:         cmd[j++]=instr[i]; }
                    496: cmd[j]=0;
                    497: 
                    498: return(cmd);
                    499: }
                    500: 

unix.superglobalmegacorp.com

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