Annotation of 43BSD/usr.bin/uucp/aculib/vmacs.c, revision 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.