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

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

unix.superglobalmegacorp.com

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