date and time created 86/02/12 17:31:09 by bloom
[unix-history] / usr / src / usr.bin / uucp / libacu / hysq.c
CommitLineData
c49d4268
RC
1#ifndef lint
2static 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
38hysqpopn(telno, flds, dev)
39char *telno, *flds[];
40struct Devices *dev;
41{
42 return hysqopn(telno, flds, dev, 0);
43}
44
45hysqtopn(telno, flds, dev)
46char *telno, *flds[];
47struct Devices *dev;
48{
49 return hysqopn(telno, flds, dev, 1);
50}
51
52hysqopn(telno, flds, dev, toneflag)
53char *telno, *flds[];
54struct Devices *dev;
55int 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
119hysqcls(fd)
120int 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