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