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