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

1.1       root        1: #line 1 "COMIO.C"
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: /***********************************/
                      6: /* COM port and modem i/o routines */
                      7: /***********************************/
                      8: 
                      9: #include "sbbs.h"
                     10: 
                     11: #ifndef __FLAT__
                     12: extern mswtyp;
                     13: #endif
                     14: 
                     15: extern char term_ret;
                     16: extern uint addrio;
                     17: 
                     18: /****************************************************************************/
                     19: /* Outputs a NULL terminated string to the COM port verbatim                           */
                     20: /* Called from functions putmsg, getstr and color                                                      */
                     21: /****************************************************************************/
                     22: void putcom(char *str)
                     23: {
                     24:        ulong   l=0;
                     25: 
                     26: while(str[l])
                     27:        putcomch(str[l++]);
                     28: }
                     29: 
                     30: /****************************************************************************/
                     31: /* Outputs a single character to the COM port                                                          */
                     32: /****************************************************************************/
                     33: void putcomch(char ch)
                     34: {
                     35:        char    lch;
                     36:        int     i=0;
                     37: 
                     38: if(!com_port)
                     39:        return;
                     40: while(outcom(ch)&TXBOF && i<1440) {    /* 3 minute pause delay */
                     41:     if(lkbrd(1)) {
                     42:                lch=lkbrd(0);   /* ctrl-c */
                     43:                if(lch==3) {
                     44:                        lputs("local abort (putcomch)\r\n");
                     45:                        i=1440;
                     46:                        break; }
                     47:                ungetkey(lch); }
                     48:        if(!DCDHIGH)
                     49:                break;
                     50:        i++;
                     51:        if(sys_status&SS_SYSPAGE)
                     52:                beep(i,80);
                     53:        else
                     54:                mswait(80); }
                     55: if(i==1440) {                                          /* timeout - beep flush outbuf */
                     56:        i=rioctl(TXBC);
                     57:        lprintf("timeout(putcomch) %04X %04X\r\n",i,rioctl(IOFO));
                     58:        outcom(7);
                     59:        lputc(7);
                     60:        rioctl(IOCS|PAUSE); }
                     61: }
                     62: 
                     63: /****************************************************************************/
                     64: /* Sends string of characters to COM port. Interprets ^M and ~ (pause)         */
                     65: /* Called from functions waitforcall and offhook                                                       */
                     66: /****************************************************************************/
                     67: void mdmcmd(char *str)
                     68: {
                     69:        int     i=0;
                     70:        uint    lch;
                     71: 
                     72: if(mdm_misc&MDM_DUMB)
                     73:        return;
                     74: if(sys_status&SS_MDMDEBUG)
                     75:        lputs("\r\nModem command  : ");
                     76: while(str[i]) {
                     77:        if(str[i]=='~')
                     78:                mswait(DELAY_MDMTLD);
                     79:        else {
                     80:                if(i && str[i-1]=='^' && str[i]!='^')  /* control character */
                     81:                        putcomch(toupper(str[i])-64);
                     82:                else if(str[i]!='^' || (i && str[i-1]=='^'))
                     83:                        putcomch(str[i]);
                     84:                if(sys_status&SS_MDMDEBUG)
                     85:                        lputc(str[i]); }
                     86:        i++; }
                     87: putcomch(CR);
                     88: i=0;
                     89: while(rioctl(TXSYNC|(1<<8)) && i<10) { /* wait for modem to receive all chars */
                     90:        if(lkbrd(1)) {
                     91:                lch=lkbrd(0);   /* ctrl-c */
                     92:                if(lch==0x2e03) {
                     93:                        lputs("local abort (mdmcmd)\r\n");
                     94:                        break; }
                     95:                if(lch==0xff00)
                     96:                        bail(1);
                     97:                ungetkey(lch); }
                     98:        i++; }
                     99: if(i==10) {
                    100:        i=rioctl(TXBC);
                    101:        lprintf("\r\ntimeout(mdmcmd) %04X %04X\r\n",i,rioctl(IOFO)); }
                    102: if(sys_status&SS_MDMDEBUG)
                    103:        lputs(crlf);
                    104: }
                    105: 
                    106: /****************************************************************************/
                    107: /* Returns CR terminated string from the COM port.                                                     */
                    108: /* Called from function waitforcall                                                                            */
                    109: /****************************************************************************/
                    110: char getmdmstr(char *str, int sec)
                    111: {
                    112:        uchar   j=0,ch;
                    113:        uint    lch;
                    114:        time_t  start;
                    115: 
                    116: if(sys_status&SS_MDMDEBUG)
                    117:        lputs("Modem response : ");
                    118: start=time(NULL);
                    119: while(time(NULL)-start<sec && j<81) {
                    120:        if(lkbrd(1)) {
                    121:                lch=lkbrd(0);   /* ctrl-c */
                    122:                if(lch==0x2e03 || lch==3) {
                    123:                        lputs("local abort (getmdmstr)\r\n");
                    124:                        break; }
                    125:                if(lch==0xff00)
                    126:                        bail(1);
                    127:                ungetkey(lch); }
                    128:        if((ch=incom())==CR && j) {
                    129:                if(mdm_misc&MDM_VERBAL)
                    130:                        incom();        /* LF */
                    131:                break; }
                    132:        if(ch && (ch<0x20 || ch>0x7f)) { /* ignore ctrl characters and ex-ascii */
                    133:                if(sys_status&SS_MDMDEBUG)
                    134:                        lprintf("[%02X]",ch);
                    135:                continue; }
                    136:        if(ch) {
                    137:                str[j++]=ch;
                    138:                if(sys_status&SS_MDMDEBUG)
                    139:                        lputc(ch); }
                    140:        else mswait(0); }
                    141: mswait(500);
                    142: str[j]=0;
                    143: if(sys_status&SS_MDMDEBUG)
                    144:        lputs(crlf);
                    145: return(j);
                    146: }
                    147: 
                    148: /****************************************************************************/
                    149: /* Drops DTR (if COM port used), clears KEY and COM Buffers and other vars     */
                    150: /* Called from functions checkline, getkey, inkey, main, waitforcall,          */
                    151: /* main_sec, xfer_sec, gettimeleft and newuser                                                         */
                    152: /****************************************************************************/
                    153: void hangup()
                    154: {
                    155:        char    str1[256],str2[256],c;
                    156:        uint    i;
                    157: 
                    158: rioctl(MSR);
                    159: if(!term_ret && com_port && (rioctl(IOSTATE)&DCD)) {  /* if carrier detect */
                    160:        riosync(0);
                    161:        mswait(DELAY_HANGUP);            /* wait for modem buffer to clear */
                    162:        if(mdm_misc&MDM_NODTR)
                    163:                mdmcmd(mdm_hang);
                    164:        else {
                    165:                lputs("\r\nDropping DTR...");
                    166:                if(dtr(15))  {                  /* drop dtr, wait 15 seconds for dcd to drop */
                    167:                        lputs("\rDropping DTR Failed");
                    168:                        logline("@!","Dropping DTR Failed");
                    169:                        mdmcmd(mdm_hang); } }
                    170:        mswait(110);
                    171:        rioctl(MSR);
                    172:        if(rioctl(IOSTATE)&DCD) {
                    173:                mswait(5000);
                    174:                rioctl(MSR);
                    175:                if(rioctl(IOSTATE)&DCD) {
                    176:                        lputs("\r\nDCD high after hang up");
                    177:                        logline("@!","DCD high after hang up");
                    178:                        mswait(5000); } } }
                    179: if(sys_status&SS_CAP) {        /* Close capture if open */
                    180:        fclose(capfile);
                    181: #ifdef __MSDOS__
                    182:        freedosmem=farcoreleft(); /* fnopen allocates memory and fclose frees */
                    183: #endif
                    184:        sys_status^=SS_CAP; }
                    185: if(sys_status&SS_FINPUT) { /* Close file input if open */
                    186:        close(inputfile);
                    187:        sys_status^=SS_FINPUT; }
                    188: 
                    189: keybufbot=keybuftop=online=console=0;
                    190: sys_status&=~(SS_TMPSYSOP|SS_LCHAT|SS_SYSPAGE|SS_ABORT);
                    191: nosound();
                    192: if(com_port)
                    193:        dtr(1);
                    194: }
                    195: 
                    196: /****************************************************************************/
                    197: /* Sends 'off-hook' string to modem to pick up phone (if COM port used)                */
                    198: /* Called from function waitforcall                                                                                    */
                    199: /****************************************************************************/
                    200: void offhook()
                    201: {
                    202: if(com_port && !(mdm_misc&MDM_DUMB)) {
                    203:        mdmcmd(mdm_offh);
                    204:        rioctl(TXSYNC|(2<<8));  /* wait up 2 seconds for modem to receive */
                    205:        }
                    206: }
                    207: 
                    208: /****************************************************************************/
                    209: /* Checks to see if remote user has hung up.                                                           */
                    210: /* Called from function getkey                                                                                         */
                    211: /****************************************************************************/
                    212: void checkline()
                    213: {
                    214: if(online!=ON_REMOTE) return;
                    215: if(!DCDHIGH) {
                    216:        lprintf("\r\nHung up");
                    217:        logline(nulstr,"Hung up");
                    218:        hangup(); }
                    219: }
                    220: 
                    221: /****************************************************************************/
                    222: /* Syncronizes the remote and local machines before command prompts         */
                    223: /****************************************************************************/
                    224: void riosync(char abortable)
                    225: {
                    226:        int     i=0;
                    227: 
                    228: if(useron.misc&(RIP|WIP))      /* don't allow abort with RIP or WIP */
                    229:        abortable=0;            /* mainly because of ANSI cursor posistion response */
                    230: if(sys_status&SS_ABORT)        /* no need to sync if already aborting */
                    231:        return;
                    232: if(online==ON_REMOTE && console&CON_R_ECHO) {
                    233:        while(rioctl(TXSYNC|(1<<8)) && i<180) { /* three minutes till tx buf empty */
                    234:                if(sys_status&SS_SYSPAGE)
                    235:                        beep(i,10);
                    236:                if(lkbrd(1))
                    237:                        break;
                    238:                if(abortable && rioctl(RXBC)) {         /* incoming characer */
                    239:                        rioctl(IOFO);                                   /* flush output */
                    240:                        sys_status|=SS_ABORT;                   /* set abort flag so no pause */
                    241:                        break; }                                                /* abort sync */
                    242:                if(!DCDHIGH)
                    243:                        break;
                    244:                mswait(0);
                    245:                i++; }
                    246:        if(i==180) {
                    247:                i=rioctl(TXBC);
                    248:                lprintf("timeout(sync) %04X %04X\r\n",i,rioctl(IOFO));
                    249:                outcom(7);
                    250:                lputc(7);
                    251:                rioctl(IOCS|PAUSE); }
                    252:        if(rioctl(IOSTATE)&ABORT)
                    253:                sys_status|=SS_ABORT;
                    254:        rioctl(IOCS|ABORT); }
                    255: }
                    256: 
                    257: /*****************************************************************************/
                    258: /* Initializes com i/o routines and sets baud rate                           */
                    259: /*****************************************************************************/
                    260: void comini()
                    261: {
                    262:        int     i;
                    263: #ifndef __FLAT__
                    264:        uint    base=0xffff;
                    265: #endif
                    266: 
                    267: if(sys_status&SS_COMISR)       /* Already installed */
                    268:        return;
                    269: lprintf("\r\nInitializing COM port %u: ",com_port);
                    270: #ifndef __FLAT__
                    271: switch(com_base) {
                    272:        case 0xb:
                    273:                lputs("PC BIOS");
                    274:                break;
                    275:        case 0xd:
                    276:                lputs("DigiBoard");
                    277:                break;
                    278:        case 0xe:
                    279:                lputs("PS/2 BIOS");
                    280:                break;
                    281:        case 0xf:
                    282:                lputs("FOSSIL");
                    283:                break;
                    284:        case 0:
                    285:                base=com_port;
                    286:                lputs("UART I/O (BIOS), ");
                    287:                if(com_irq)
                    288:             lprintf("IRQ %d",com_irq);
                    289:         else lputs("default IRQ");
                    290:                break;
                    291:        default:
                    292:                base=com_base;
                    293:                lprintf("UART I/O %Xh, ",com_base);
                    294:                if(com_irq)
                    295:             lprintf("IRQ %d",com_irq);
                    296:         else lputs("default IRQ");
                    297:         break; }
                    298: 
                    299: if(base==0xffff)
                    300:        lprintf(" channel %u",com_irq);
                    301: i=rioini(base,com_irq);
                    302: #else
                    303: #ifdef __OS2__
                    304: if(rio_handle!=-1)     // Already opened, prolly passed to SBBS4OS2 via cmd line
                    305:        lprintf("handle %d",rio_handle);
                    306: #endif
                    307: i=rioini(com_port,0);
                    308: #endif
                    309: if(i) {
                    310:        lprintf(" - Failed! (%d)\r\n",i);
                    311:        bail(1); }
                    312: i=0;
                    313: if(mdm_misc&MDM_CTS)
                    314:        i=CTSCK;
                    315: if(mdm_misc&MDM_RTS)
                    316:        i|=RTSCK;
                    317: if(i)
                    318:        rioctl(IOSM|i); /* set cts checking if hardware flow control */
                    319: 
                    320: #ifndef __FLAT__
                    321: rioctl(TSTYPE|mswtyp);  /* set time-slice API type */
                    322: #endif
                    323: 
                    324: rioctl(CPTON);                 /* ctrl-p translation */
                    325: 
                    326: if(addrio) {
                    327:        lprintf("\r\nAdditional rioctl: %04Xh",addrio);
                    328:        rioctl(addrio); }
                    329: 
                    330: sys_status|=SS_COMISR;
                    331: }
                    332: 
                    333: /****************************************************************************/
                    334: /* Sets the current baud rate to either the current connect rate or the        */
                    335: /* DTE rate                                                                                                                            */
                    336: /****************************************************************************/
                    337: void setrate()
                    338: {
                    339:        int i;
                    340: 
                    341: if(online==ON_REMOTE && !(mdm_misc&MDM_STAYHIGH))
                    342:        dte_rate=cur_rate;
                    343: else
                    344:        dte_rate=com_rate;
                    345: lprintf("\r\nSetting DTE rate: %lu baud",dte_rate);
                    346: #ifdef __FLAT__
                    347: if((i=setbaud(dte_rate))!=0) {
                    348: #else
                    349: if((i=setbaud((uint)(dte_rate&0xffffL)))!=0) {
                    350: #endif
                    351:        lprintf(" - Failed! (%d)\r\n",i);
                    352:        bail(1); }
                    353: lputs(crlf);
                    354: }

unix.superglobalmegacorp.com

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