xref: /original-bsd/usr.bin/uucp/libacu/att2224.c (revision c3e32dec)
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 
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 
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