|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)att2224.c 1.2 (Berkeley) 2/24/88";
3: #endif
4:
5: #include "../condevs.h"
6:
7: attopn(telno, flds, dev)
8: char *telno, *flds[];
9: struct Devices *dev;
10: {
11: char dcname[20], phone[MAXPH+10], c = 0;
12: int dnf, failret = 0, timelim;
13:
14: sprintf(dcname, "/dev/%s", dev->D_line);
15:
16: if (setjmp(Sjbuf)) {
17: delock(dev->D_line);
18: logent("DEVICE", "NO");
19: DEBUG(4, "Open timed out %s", dcname);
20: alarm (0);
21: return CF_NODEV;
22: }
23:
24: signal(SIGALRM, alarmtr);
25: getnextfd();
26: alarm(10);
27:
28: if ((dnf = open(dcname, 2)) <= 0) {
29: delock(dev->D_line);
30: logent("DEVICE", "NO");
31: DEBUG(4, "Can't open %s", dcname);
32: alarm (0);
33: return CF_NODEV;
34: }
35:
36: alarm(0);
37: next_fd = -1;
38: fixline(dnf, dev->D_speed);
39: DEBUG(4, "modem port - %s\n", dcname);
40:
41: if (setjmp(Sjbuf)) {
42: delock(dev->D_line);
43: logent("ACU WRITE", "FAILED");
44: return CF_DIAL;
45: }
46: signal(SIGALRM, alarmtr);
47: alarm(10);
48: do {
49: slowrite(dnf, "\r"); /* wake up modem */
50: } while (expect(":~3", dnf));
51: alarm(0);
52:
53: sprintf (phone, "atzt%s\r", telno);
54: slowrite (dnf, phone); /* type telno string to modem */
55:
56: if ((expect(phone, dnf)) != SUCCESS) {
57: delock(dev->D_line);
58: logent("ACU READ", "FAILED");
59: return CF_DIAL;
60: }
61:
62: if (setjmp(Sjbuf)) {
63: delock(dev->D_line);
64: logent("NO ANSWER", "FAILED");
65: alarm (0);
66: return CF_DIAL;
67: }
68: timelim = strlen(telno) * 4;
69: signal(SIGALRM, alarmtr);
70: alarm(timelim > 30 ? timelim : 30);
71:
72: readchar:
73: if ((read(dnf, &c, 1)) != 1) {
74: delock(dev->D_line);
75: logent("ACU READ", "FAILED");
76: return CF_DIAL;
77: }
78:
79: switch (c) {
80: case 'D': /* no dial tone */
81: logent("NO DIAL TONE", "FAILED");
82: failret++;
83: break;
84: case 'B': /* line busy */
85: logent("LINE BUSY", "FAILED");
86: failret++;
87: break;
88: case 'N': /* no answer */
89: logent("NO ANSWER", "FAILED");
90: failret++;
91: break;
92: case 'H': /* handshake failed */
93: logent("MODEM HANDSHAKE", "FAILED");
94: failret++;
95: break;
96: case '3': /* 2400 baud */
97: DEBUG(4, "Baudrate set to 2400 baud", CNULL);
98: fixline(dnf, 2400);
99: break;
100: case '2': /* 1200 baud */
101: DEBUG(4, "Baudrate set to 1200 baud", CNULL);
102: fixline(dnf, 1200);
103: break;
104: case '1': /* 300 baud */
105: DEBUG(4, "Baudrate set to 300 baud", CNULL);
106: fixline(dnf, 300);
107: break;
108: default: /* Not one of the above, so must be garbage */
109: goto readchar;
110: }
111: if (failret) {
112: alarm (0);
113: delock(dev->D_line);
114: return CF_DIAL;
115: }
116: alarm (0);
117: return dnf;
118: }
119:
120: attcls(fd)
121: int fd;
122: {
123: char dcname[20];
124: #ifdef USG
125: struct termio hup, sav;
126: #else !USG
127: struct sgttyb hup, sav;
128: #endif !USG
129:
130: if (fd > 0) {
131: sprintf(dcname, "/dev/%s", devSel);
132: DEBUG(4, "Hanging up fd = %d\n", fd);
133: /*
134: * code to drop DTR -- change to 0 baud then back to default.
135: */
136: gtty(fd, &hup);
137: gtty(fd, &sav);
138: #ifdef USG
139: hup.c_cflag = B0;
140: #else !USG
141: hup.sg_ispeed = B0;
142: hup.sg_ospeed = B0;
143: #endif !USG
144: stty(fd, &hup);
145: sleep(2);
146: stty(fd, &sav);
147: /*
148: * now raise DTR -- close the device
149: */
150: sleep(2);
151: close(fd);
152: delock(devSel);
153: }
154: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.