Annotation of 43BSD/usr.bin/uucp/aculib/vmacs.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)vmacs.c    4.3 (Berkeley) 10/10/85";
                      3: #endif
                      4: 
                      5: #include "../condevs.h"
                      6: #ifdef VMACS
                      7: /*
                      8:  * Racal-Vadic 'RV811' MACS system with 831 adaptor.
                      9:  *
                     10:  * A typical 300 baud L-devices entry is
                     11:  *     ACU /dev/tty10 /dev/tty11,48,1200 300 vmacs
                     12:  * where tty10 is the communication line (D_Line),
                     13:  * tty11 is the dialer line (D_calldev),
                     14:  * the '4' is the dialer address + modem type (viz. dialer 0, Bell 103),
                     15:  * and the '8' is the communication port
                     16:  * (Note: Based on RVMACS version for 820 dialer.  This version
                     17:  *  developed by Doug Kingston @ BRL, 13 December 83.)
                     18:  */
                     19: 
                     20: #define        SOH     01      /* Abort */
                     21: #define        STX     02      /* Access Adaptor */
                     22: #define        ETX     03      /* Transfer to Dialer */
                     23: #define        SI      017     /* Buffer Empty (end of phone number) */
                     24: 
                     25: vmacsopn(ph, flds, dev)
                     26: char *ph, *flds[];
                     27: struct Devices *dev;
                     28: {
                     29:        register int va, i, child;
                     30:        register char *p;
                     31:        char c, acu[20], com[20];
                     32:        char    modem, dialer;
                     33:        int     dialspeed;
                     34:        char c_STX = STX;
                     35:        char c_ETX = ETX;
                     36:        char c_SI = SI;
                     37:        char c_SOH = SOH;
                     38: 
                     39:        /* create child to open comm line */
                     40:        child = -1;
                     41:        sprintf(com, "/dev/%s", dev->D_line);
                     42:        if ((child = fork()) == 0) {
                     43:                signal(SIGINT, SIG_DFL);
                     44:                open(com, 0);
                     45:                DEBUG(5, "%s Opened.", com);
                     46:                sleep(5);
                     47:                exit(1);
                     48:        }
                     49: 
                     50:        if ((p = index(dev->D_calldev, ',')) == NULL) {
                     51:                DEBUG(2, "No dialer/modem specification\n", 0);
                     52:                goto failret;
                     53:        }
                     54:        *p++ = '\0';
                     55:        if (*p < '0' || *p > '7') {
                     56:                logent(p, "Bad dialer address/modem type");
                     57:                goto failret;
                     58:        }
                     59:        dialer = *p++;
                     60:        if (*p < '0' || *p > '>') {
                     61:                logent(p, "Bad modem address");
                     62:                goto failret;
                     63:        }
                     64:        modem = *p++;
                     65:        if (*p++ == ',')
                     66:                dialspeed = atoi (p);
                     67:        else
                     68:                dialspeed = dev->D_speed;
                     69:        if (setjmp(Sjbuf)) {
                     70:                logent("vmacsopn", "TIMEOUT");
                     71:                i = CF_DIAL;
                     72:                goto ret;
                     73:        }
                     74:        DEBUG(4, "STARTING CALL\n", 0);
                     75:        sprintf(acu, "/dev/%s", dev->D_calldev);
                     76:        getnextfd();
                     77:        signal(SIGALRM, alarmtr);
                     78:        alarm(60);
                     79:        if ((va = open(acu, 2)) < 0) {
                     80:                logent(acu, "CAN'T OPEN");
                     81:                i = CF_NODEV;
                     82:                goto ret;
                     83:        }
                     84:        DEBUG(5, "ACU %s opened.\n", acu);
                     85:        next_fd = -1;
                     86:        fixline(va, dialspeed);
                     87: 
                     88:        write(va, &c_SOH, 1);           /* abort, reset the dialer */
                     89:        do {
                     90:                if (read (va, &c, 1) != 1) {
                     91:                        logent ("MACS initialization", _FAILED);
                     92:                        goto failret;
                     93:                }
                     94:        } while ((c&0177) != 'B');
                     95:        DEBUG(5, "ACU initialized\n", 0);
                     96: 
                     97:        write(va, &c_STX, 1);           /* start text, access adaptor */
                     98:        write(va, &dialer, 1);          /* send dialer address digit */
                     99:        write(va, &modem, 1);           /* send modem address digit */
                    100:        for (p=ph; *p; p++) {
                    101:                if (*p == '=' || (*p >= '0' && *p <= '9'))
                    102:                        write(va, p, 1);
                    103:        }
                    104:        write(va, &c_SI, 1);            /* send buffer empty */
                    105:        write(va, &c_ETX, 1);           /* end of text, initiate call */
                    106: 
                    107:        if (read(va, &c, 1) != 1) {
                    108:                logent("ACU READ", _FAILED);
                    109:                goto failret;
                    110:        }
                    111:        switch(c) {
                    112:        case 'A':
                    113:                /* Fine! */
                    114:                DEBUG(5, "Call connected\n", 0);
                    115:                break;
                    116:        case 'B':
                    117:                DEBUG(2, "Dialer Timeout or Abort\n", 0);
                    118:                goto failret;
                    119:        case 'D':
                    120:                DEBUG(2, "Dialer format error\n", 0);
                    121:                goto failret;
                    122:        case 'E':
                    123:                DEBUG(2, "Dialer parity error\n", 0);
                    124:                goto failret;
                    125:        case 'F':
                    126:                DEBUG(2, "Phone number too long\n", 0);
                    127:                goto failret;
                    128:        case 'G':
                    129:                DEBUG(2, "Busy signal\n", 0);
                    130:                goto failret;
                    131:        default:
                    132:                DEBUG(2, "Unknown MACS return code '%c'\n", i);
                    133:                goto failret;
                    134:        }
                    135:        /*
                    136:         * open line - will return on carrier
                    137:         */
                    138:        if ((i = open(com, 2)) < 0) {
                    139:                if (errno == EIO)
                    140:                        logent("carrier", "LOST");
                    141:                else
                    142:                        logent("dialup open", _FAILED);
                    143:                goto failret;
                    144:        }
                    145:        fixline(i, dev->D_speed);
                    146:        goto ret;
                    147: failret:
                    148:        i = CF_DIAL;
                    149: ret:
                    150:        alarm(0);
                    151:        if (child > 1)
                    152:                kill(child, SIGKILL);
                    153:        close(va);
                    154:        sleep(2);
                    155:        return i;
                    156: }
                    157: 
                    158: vmacscls(fd)
                    159: register int fd;
                    160: {
                    161:        char c_SOH = SOH;
                    162: 
                    163:        DEBUG(2, "MACS close %d\n", fd);
                    164:        write(fd, &c_SOH, 1);
                    165: /*     ioctl(fd, TIOCCDTR, NULL);*/
                    166:        close(fd);
                    167: }
                    168: #endif VMACS

unix.superglobalmegacorp.com

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