Annotation of 43BSD/usr.bin/uucp/aculib/hysq.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)hysq.c     4.1 (Berkeley) 1/22/85";
        !             3: #endif
        !             4: 
        !             5: #include "../condevs.h"
        !             6: 
        !             7: #ifdef HAYESQ
        !             8: /*
        !             9:  * New dialout routine to work with Hayes' SMART MODEM
        !            10:  * 13-JUL-82, Mike Mitchell
        !            11:  * Modified 23-MAR-83 to work with Tom Truscott's (rti!trt)
        !            12:  * version of UUCP     (ncsu!mcm)
        !            13:  *
        !            14:  * The modem should be set to NOT send any result codes to
        !            15:  * the system (switch 3 up, 4 down). This end will figure out
        !            16:  * what is wrong.
        !            17:  *
        !            18:  * I had lots of problems with the modem sending
        !            19:  * result codes since I am using the same modem for both incomming and
        !            20:  * outgoing calls.  I'd occasionally miss the result code (getty would
        !            21:  * grab it), and the connect would fail.  Worse yet, the getty would
        !            22:  * think the result code was a user name, and send garbage to it while
        !            23:  * it was in the command state.  I turned off ALL result codes, and hope
        !            24:  * for the best.  99% of the time the modem is in the correct state.
        !            25:  * Occassionally it doesn't connect, or the phone was busy, etc., and
        !            26:  * uucico sits there trying to log in.  It eventually times out, calling
        !            27:  * clsacu() in the process, so it resets itself for the next attempt.
        !            28:  */
        !            29: 
        !            30: /*
        !            31:  * NOTE: this version is not for the faint-hearted.
        !            32:  * Someday it would be nice to have a single version of hayes dialer
        !            33:  * with a way to specify the switch settings that are on the dialer
        !            34:  * as well as tone/pulse.
        !            35:  * In the meantime, using HAYES rather than HAYESQ is probably best.
        !            36:  */
        !            37: 
        !            38: hysqpopn(telno, flds, dev)
        !            39: char *telno, *flds[];
        !            40: struct Devices *dev;
        !            41: {
        !            42:        return hysqopn(telno, flds, dev, 0);
        !            43: }
        !            44: 
        !            45: hysqtopn(telno, flds, dev)
        !            46: char *telno, *flds[];
        !            47: struct Devices *dev;
        !            48: {
        !            49:        return hysqopn(telno, flds, dev, 1);
        !            50: }
        !            51: 
        !            52: hysqopn(telno, flds, dev, toneflag)
        !            53: char *telno, *flds[];
        !            54: struct Devices *dev;
        !            55: int toneflag;
        !            56: {
        !            57:        char dcname[20], phone[MAXPH+10], c = 0;
        !            58: #ifdef USG
        !            59:        struct termio ttbuf;
        !            60: #endif USG
        !            61:        int status, dnf;
        !            62:        unsigned timelim;
        !            63: 
        !            64:        signal(SIGALRM, alarmtr);
        !            65:        sprintf(dcname, "/dev/%s", dev->D_line);
        !            66: 
        !            67:        getnextfd();
        !            68:        if (setjmp(Sjbuf)) {
        !            69:                logent("DEVICE", "NO");
        !            70:                DEBUG(4, "Open timed out %s", dcname);
        !            71:                return CF_NODEV;
        !            72:        }
        !            73:        alarm(10);
        !            74: 
        !            75:        if ((dnf = open(dcname, 2)) <= 0) {
        !            76:                logent("DEVICE", "NO");
        !            77:                DEBUG(4, "Can't open %s", dcname);
        !            78:                return CF_NODEV;
        !            79:        }
        !            80: 
        !            81:        alarm(0);
        !            82:        next_fd = -1;
        !            83:        fixline(dnf, dev->D_speed);
        !            84:        DEBUG(4, "Hayes port - %s, ", dcname);
        !            85: 
        !            86:        if (toneflag)
        !            87:                sprintf(phone, "\rATDT%s\r", telno);
        !            88:        else
        !            89:                sprintf(phone, "\rATDP%s\r", telno);
        !            90: 
        !            91:        write(dnf, phone, strlen(phone));
        !            92: 
        !            93:        /* calculate delay time for the other system to answer the phone.
        !            94:         * Default is 15 seconds, add 2 seconds for each comma in the phone
        !            95:         * number.
        !            96:         */
        !            97:        timelim = 150;
        !            98:        while(*telno) {
        !            99:                c = *telno++;
        !           100:                if (c == ',')
        !           101:                        timelim += 20;
        !           102:                else if (toneflag)
        !           103:                        timelim += 2;   /* .2 seconds per tone */
        !           104:                else {
        !           105:                        if (c == '0') timelim += 10;   /* .1 sec per digit */
        !           106:                        else if (c > '0' && c <= '9')
        !           107:                                timelim += (c - '0');
        !           108:                }
        !           109:        }
        !           110:        alarm(timelim/10 + 1);
        !           111:        if (setjmp(Sjbuf) == 0) {
        !           112:                read(dnf, &c, 1);
        !           113:                alarm(0);
        !           114:        }
        !           115: 
        !           116:        return dnf;
        !           117: }
        !           118: 
        !           119: hysqcls(fd)
        !           120: int fd;
        !           121: {
        !           122:        char dcname[20];
        !           123:        struct sgttyb hup, sav;
        !           124: 
        !           125:        if (fd > 0) {
        !           126:                sprintf(dcname, "/dev/%s", devSel);
        !           127:                DEBUG(4, "Hanging up fd = %d\n", fd);
        !           128:                /*
        !           129:                 * code to drop DTR -- change to 0 baud then back to default.
        !           130:                 */
        !           131:                gtty(fd, &hup);
        !           132:                gtty(fd, &sav);
        !           133:                hup.sg_ispeed = B0;
        !           134:                hup.sg_ospeed = B0;
        !           135:                stty(fd, &hup);
        !           136:                sleep(2);
        !           137:                stty(fd, &sav);
        !           138:                /*
        !           139:                 * now raise DTR -- close the device & open it again.
        !           140:                 */
        !           141:                sleep(2);
        !           142:                close(fd);
        !           143:                sleep(2);
        !           144:                fd = open(dcname, 2);
        !           145:                /*
        !           146:                 * Since we have a getty sleeping on this line, when it wakes up it sends
        !           147:                 * all kinds of garbage to the modem.  Unfortunatly, the modem likes to
        !           148:                 * execute the previous command when it sees the garbage.  The previous
        !           149:                 * command was to dial the phone, so let's make the last command reset
        !           150:                 * the modem.
        !           151:                 */
        !           152:                sleep(2);
        !           153:                write(fd, "\rATZ\r", 5);
        !           154:                close(fd);
        !           155:                delock(devSel);
        !           156:        }
        !           157: }
        !           158: 
        !           159: #endif HAYESQ

unix.superglobalmegacorp.com

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