|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)hys24.c 1.6 (Berkeley) 6/27/90";
3: #endif !lint
4:
5: #include "../condevs.h"
6:
7: /*
8: * hyspopn24(telno, flds, dev) connect to hayes smartmodem (pulse call)
9: * hystopn24(telno, flds, dev) connect to hayes smartmodem (tone call)
10: *
11: * return codes: >0 - file number - ok CF_DIAL,CF_DEVICE - failed
12: */
13:
14: #include <sys/file.h>
15: #include <sys/ioctl.h>
16:
17: hyspopn24(telno, flds, dev)
18: char *telno, *flds[];
19: struct Devices *dev;
20: {
21: return hysopn24(telno, flds, dev, 0);
22: }
23:
24: hystopn24(telno, flds, dev)
25: char *telno, *flds[];
26: struct Devices *dev;
27: {
28: return hysopn24(telno, flds, dev, 1);
29: }
30:
31: /* ARGSUSED */
32: hysopn24(telno, flds, dev, toneflag)
33: char *telno;
34: char *flds[];
35: struct Devices *dev;
36: int toneflag;
37: {
38: int dh = -1;
39: int result, ix, speed;
40: char *ii;
41: extern errno;
42: char dcname[20];
43: char resultbuf[16];
44:
45: sprintf(dcname, "/dev/%s", dev->D_line);
46: DEBUG(4, "dc - %s\n", dcname);
47: if (setjmp(Sjbuf)) {
48: logent(dcname, "TIMEOUT");
49: if (dh >= 0)
50: hyscls24(dh, 0);
51: return CF_DIAL;
52: }
53: signal(SIGALRM, alarmtr);
54: getnextfd();
55: alarm(10);
56: dh = open(dcname, 2); /* read/write */
57: alarm(0);
58:
59: for (ii = telno; *ii; ii++)
60: if (*ii == '=')
61: *ii = ',';
62:
63: /* modem is open */
64: next_fd = -1;
65: if (dh >= 0) {
66: ioctl(dh, TIOCHPCL, 0);
67: fixline(dh, dev->D_speed);
68: if (dochat(dev, flds, dh)) {
69: logent(dcname, "CHAT FAILED");
70: hyscls24(dh, 0);
71: return CF_DIAL;
72: }
73: hyscls24(dh, 1);/* make sure the line is reset */
74: write(dh, "AT&F&D3&C1E0M0X3QV0Y\r", 21);
75: if (expect("0\r", dh) != 0) {
76: logent(dcname, "HSM not responding OK");
77: hyscls24(dh, 0);
78: return CF_DIAL;
79: }
80: if (toneflag)
81: write(dh, "\rATDT", 5);
82: else
83: write(dh, "\rATDP", 5);
84: write(dh, telno, strlen(telno));
85: write(dh, "\r", 1);
86:
87: if (setjmp(Sjbuf)) {
88: logent(dcname, "Modem Hung");
89: if (dh >= 0)
90: hyscls24(dh, 0);
91: return CF_DIAL;
92: }
93: signal(SIGALRM, alarmtr);
94: alarm(120);
95: do {
96: for (ix = 0; ix < 16; ix++) {
97: read(dh, resultbuf + ix, 1);
98: DEBUG(6, "character read = 0x%X \n", resultbuf[ix]);
99: if ((0x7f & resultbuf[ix]) == 0xd)
100: break;
101: }
102:
103: result = atol(resultbuf);
104: switch (result) {
105: case 0:
106: logent("HSM Spurious OK response", _FAILED);
107: speed = 0;
108: break;
109: case 1:
110: logent("HSM connected at 300 baud!", _FAILED);
111: speed = -1;
112: break;
113: case 2:
114: speed = 0;
115: DEBUG(4, "Ringing", 0);
116: break;
117: case 3:
118: logent("HSM No Carrier", _FAILED);
119: speed = -1;
120: break;
121: case 4:
122: logent("HSM Error", _FAILED);
123: speed = -1;
124: break;
125: case 5:
126: speed = 1200;
127: break;
128: case 6:
129: logent("HSM No dialtone", _FAILED);
130: speed = -1;
131: break;
132: case 7:
133: logent("HSM detected BUSY", _FAILED);
134: speed = -1;
135: break;
136: case 8:
137: logent("HSM No quiet answer", _FAILED);
138: speed = -1;
139: break;
140: case 10:
141: speed = 2400;
142: break;
143: default:
144: logent("HSM Unknown response", _FAILED);
145: speed = -1;
146: break;
147: }
148:
149: } while (speed == 0);
150:
151: alarm(0);
152:
153: if (speed < 0) {
154: strcpy(devSel, dev->D_line);
155: hyscls24(dh, 0);
156: return CF_DIAL;
157: } else if (speed != dev->D_speed) {
158: DEBUG(4, "changing line speed to %d baud\n", speed);
159: fixline(dh, speed);
160: }
161: }
162: if (dh < 0) {
163: logent(dcname, "CAN'T OPEN");
164: return dh;
165: }
166: DEBUG(4, "hayes ok\n", CNULL);
167: return dh;
168: }
169:
170: hyscls24(fd, flag)
171: int fd, flag;
172: {
173: char dcname[20];
174: int fff = 1;
175:
176: if (fd > 0) {
177: sprintf(dcname, "/dev/%s", devSel);
178: if (flag)
179: DEBUG(4, "Resetting fd = %d\n", fd);
180: else
181: DEBUG(4, "Hanging up fd = %d\n", fd);
182: /*
183: * Since we have a getty sleeping on this line, when it wakes
184: * up it sends all kinds of garbage to the modem.
185: * Unfortunatly, the modem likes to execute the previous
186: * command when it sees the garbage. The previous command
187: * was to dial the phone, so let's make the last command
188: * reset the modem.
189: */
190: if (!flag)
191: fixline(fd, 2400);
192: write(fd, "\r", 1);
193: sleep(2);
194: write(fd, "+++", 3);
195: sleep(3);
196: write(fd, "\rATH\rATZ\r", 9);
197: sleep(2);
198: ioctl(fd, TIOCFLUSH, &fff);
199:
200: if (!flag) {
201: close(fd);
202: delock(devSel);
203: }
204: }
205: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.