|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)hys.c 4.7 (Berkeley) 2/24/88";
3: #endif
4:
5: #include "../condevs.h"
6:
7: #ifdef USR2400
8: #define DROPDTR
9: /*
10: * The "correct" switch settings for a USR Courier 2400 are
11: * Dialin/out: 0 0 1 1 0 0 0 1 0 0
12: * Dialout only: 0 0 1 1 1 1 0 1 0 0
13: * where 0 = off and 1 = on
14: */
15: #endif USR2400
16:
17: /*
18: * hyspopn(telno, flds, dev) connect to hayes smartmodem (pulse call)
19: * hystopn(telno, flds, dev) connect to hayes smartmodem (tone call)
20: * char *flds[], *dev[];
21: *
22: * return codes:
23: * >0 - file number - ok
24: * CF_DIAL,CF_DEVICE - failed
25: */
26:
27: hyspopn(telno, flds, dev)
28: char *telno, *flds[];
29: struct Devices *dev;
30: {
31: return hysopn(telno, flds, dev, 0);
32: }
33:
34: hystopn(telno, flds, dev)
35: char *telno, *flds[];
36: struct Devices *dev;
37: {
38: return hysopn(telno, flds, dev, 1);
39: }
40:
41: /* ARGSUSED */
42: hysopn(telno, flds, dev, toneflag)
43: char *telno;
44: char *flds[];
45: struct Devices *dev;
46: int toneflag;
47: {
48: extern errno;
49: char dcname[20];
50: char cbuf[MAXPH];
51: register char *cp;
52: register int i;
53: int dh = -1, nrings = 0;
54:
55: sprintf(dcname, "/dev/%s", dev->D_line);
56: DEBUG(4, "dc - %s\n", dcname);
57: if (setjmp(Sjbuf)) {
58: logent(dcname, "TIMEOUT");
59: if (dh >= 0)
60: hyscls(dh);
61: return CF_DIAL;
62: }
63: signal(SIGALRM, alarmtr);
64: getnextfd();
65: alarm(10);
66: dh = open(dcname, 2); /* read/write */
67: alarm(0);
68:
69: /* modem is open */
70: next_fd = -1;
71: if (dh >= 0) {
72: fixline(dh, dev->D_speed);
73: if (dochat(dev, flds, dh)) {
74: logent(dcname, "CHAT FAILED");
75: hyscls(dh);
76: return CF_DIAL;
77: }
78: write(dh, "ATV1E0H\r", 8);
79: if (expect("OK\r\n", dh) != 0) {
80: logent(dcname, "HSM seems dead");
81: hyscls(dh);
82: return CF_DIAL;
83: }
84: #ifdef USR2400
85: write(dh, "ATX6S7=44\r", 10);
86: if (expect("OK\r\n", dh) != 0) {
87: logent(dcname, "HSM seems dead");
88: hyscls(dh);
89: return CF_DIAL;
90: }
91: #endif USR2400
92: if (toneflag)
93: write(dh, "\rATDT", 5);
94: else
95: #ifdef USR2400
96: write(dh, "\rATD", 4);
97: #else HAYES
98: write(dh, "\rATDP", 5);
99: #endif HAYES
100: write(dh, telno, strlen(telno));
101: write(dh, "\r", 1);
102:
103: if (setjmp(Sjbuf)) {
104: logent(dcname, "TIMEOUT");
105: strcpy(devSel, dev->D_line);
106: hyscls(dh);
107: return CF_DIAL;
108: }
109: signal(SIGALRM, alarmtr);
110: alarm(2*MAXMSGTIME);
111: do {
112: cp = cbuf;
113: while (read(dh, cp ,1) == 1)
114: if (*cp >= ' ')
115: break;
116: while (++cp < &cbuf[MAXPH] && read(dh, cp, 1) == 1 && *cp != '\n')
117: ;
118: alarm(0);
119: *cp-- = '\0';
120: if (*cp == '\r')
121: *cp = '\0';
122: DEBUG(4,"\nGOT: %s", cbuf);
123: alarm(MAXMSGTIME);
124: } while ((strncmp(cbuf, "RING", 4) == 0 ||
125: strncmp(cbuf, "RRING", 5) == 0) && nrings++ < 5);
126: if (strncmp(cbuf, "CONNECT", 7) != 0) {
127: logent(cbuf, _FAILED);
128: strcpy(devSel, dev->D_line);
129: hyscls(dh);
130: return CF_DIAL;
131: }
132: #undef DONTRESETBAUDRATE
133: #ifndef DONTRESETBAUDRATE
134: i = atoi(&cbuf[8]);
135: if (i > 0 && i != dev->D_speed) {
136: DEBUG(4,"Baudrate reset to %d\n", i);
137: fixline(dh, i);
138: }
139: #endif /* DONTRESETBAUDRATE */
140:
141: }
142: if (dh < 0) {
143: logent(dcname, "CAN'T OPEN");
144: return dh;
145: }
146: DEBUG(4, "hayes ok\n", CNULL);
147: return dh;
148: }
149:
150: hyscls(fd)
151: int fd;
152: {
153: char dcname[20];
154: #ifdef DROPDTR
155: struct sgttyb hup, sav;
156: #endif
157:
158: if (fd > 0) {
159: sprintf(dcname, "/dev/%s", devSel);
160: DEBUG(4, "Hanging up fd = %d\n", fd);
161: #ifdef DROPDTR
162: /*
163: * code to drop DTR -- change to 0 baud then back to default.
164: */
165: gtty(fd, &hup);
166: gtty(fd, &sav);
167: hup.sg_ispeed = B0;
168: hup.sg_ospeed = B0;
169: stty(fd, &hup);
170: sleep(2);
171: stty(fd, &sav);
172: /*
173: * now raise DTR -- close the device & open it again.
174: */
175: sleep(2);
176: close(fd);
177: sleep(2);
178: fd = open(dcname, 2);
179: stty(fd, &sav);
180: #else
181: sleep(3);
182: write(fd, "+++", 3);
183: #endif
184: sleep(3);
185: write(fd, "ATH\r", 4);
186: /*
187: if (expect("OK",fd) != 0)
188: logent(devSel, "HSM did not respond to ATZ");
189: */
190: sleep(1);
191: write(fd, "ATZ\r", 4);
192: sleep(1);
193: close(fd);
194: delock(devSel);
195: }
196: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.