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