Commit | Line | Data |
---|---|---|
c49d4268 RC |
1 | #ifndef lint |
2 | static char sccsid[] = "@(#)hysq.c 4.1 (Berkeley) %G%"; | |
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 |