xref: /original-bsd/usr.bin/uucp/libacu/att2224.c (revision 95a66346)
1 #ifndef lint
2 static char sccsid[] = "@(#)att2224.c	1.3 (Berkeley) 03/02/91";
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 }
155