xref: /csrg-svn/usr.bin/uucp/libacu/att2224.c (revision 46875)
126153Sbloom #ifndef lint
2*46875Sbostic static char sccsid[] = "@(#)att2224.c	1.3 (Berkeley) 03/02/91";
326153Sbloom #endif
426153Sbloom 
5*46875Sbostic #include "condevs.h"
626153Sbloom 
726153Sbloom attopn(telno, flds, dev)
826153Sbloom char *telno, *flds[];
926153Sbloom struct Devices *dev;
1026153Sbloom {
1126153Sbloom 	char dcname[20], phone[MAXPH+10], c = 0;
1226153Sbloom 	int dnf, failret = 0, timelim;
1326153Sbloom 
1426153Sbloom 	sprintf(dcname, "/dev/%s", dev->D_line);
1526153Sbloom 
1626153Sbloom 	if (setjmp(Sjbuf)) {
1726153Sbloom 		delock(dev->D_line);
1826153Sbloom 		logent("DEVICE", "NO");
1926153Sbloom 		DEBUG(4, "Open timed out %s", dcname);
2026153Sbloom 		alarm (0);
2126153Sbloom 		return CF_NODEV;
2226153Sbloom 	}
2326153Sbloom 
2426153Sbloom 	signal(SIGALRM, alarmtr);
2526153Sbloom 	getnextfd();
2626153Sbloom 	alarm(10);
2726153Sbloom 
2826153Sbloom 	if ((dnf = open(dcname, 2)) <= 0) {
2926153Sbloom 		delock(dev->D_line);
3026153Sbloom 		logent("DEVICE", "NO");
3126153Sbloom 		DEBUG(4, "Can't open %s", dcname);
3226153Sbloom 		alarm (0);
3326153Sbloom 		return CF_NODEV;
3426153Sbloom 	}
3526153Sbloom 
3626153Sbloom 	alarm(0);
3726153Sbloom 	next_fd = -1;
3826153Sbloom 	fixline(dnf, dev->D_speed);
3926153Sbloom 	DEBUG(4, "modem port - %s\n", dcname);
4026153Sbloom 
4126153Sbloom 	if (setjmp(Sjbuf)) {
4226153Sbloom 		delock(dev->D_line);
4326153Sbloom 		logent("ACU WRITE", "FAILED");
4426153Sbloom 		return CF_DIAL;
4526153Sbloom 	}
4626153Sbloom 	signal(SIGALRM, alarmtr);
4726153Sbloom 	alarm(10);
4826153Sbloom 	do {
4926153Sbloom 		slowrite(dnf, "\r");		/* wake up modem */
5026153Sbloom 	} while (expect(":~3", dnf));
5126153Sbloom 	alarm(0);
5226153Sbloom 
5326153Sbloom 	sprintf (phone, "atzt%s\r", telno);
5426153Sbloom 	slowrite (dnf, phone);		/* type telno string to modem */
5526153Sbloom 
5626153Sbloom 	if ((expect(phone, dnf)) != SUCCESS) {
5726153Sbloom 		delock(dev->D_line);
5826153Sbloom 		logent("ACU READ", "FAILED");
5926153Sbloom 		return CF_DIAL;
6026153Sbloom 	}
6126153Sbloom 
6226153Sbloom 	if (setjmp(Sjbuf)) {
6326153Sbloom 		delock(dev->D_line);
6426153Sbloom 		logent("NO ANSWER", "FAILED");
6526153Sbloom 		alarm (0);
6626153Sbloom 		return CF_DIAL;
6726153Sbloom 	}
6826153Sbloom 	timelim = strlen(telno) * 4;
6926153Sbloom 	signal(SIGALRM, alarmtr);
7026153Sbloom 	alarm(timelim > 30 ? timelim : 30);
7126153Sbloom 
7226153Sbloom readchar:
7326153Sbloom 	if ((read(dnf, &c, 1)) != 1) {
7426153Sbloom 		delock(dev->D_line);
7526153Sbloom 		logent("ACU READ", "FAILED");
7626153Sbloom 		return CF_DIAL;
7726153Sbloom 	}
7826153Sbloom 
7926153Sbloom 	switch (c) {
8026153Sbloom 		case 'D':	/* no dial tone */
8126153Sbloom 			logent("NO DIAL TONE", "FAILED");
8226153Sbloom 			failret++;
8326153Sbloom 			break;
8426153Sbloom 		case 'B': 	/* line busy */
8526153Sbloom 			logent("LINE BUSY", "FAILED");
8626153Sbloom 			failret++;
8726153Sbloom 			break;
8826153Sbloom 		case 'N': 	/* no answer */
8926153Sbloom 			logent("NO ANSWER", "FAILED");
9026153Sbloom 			failret++;
9126153Sbloom 			break;
9226153Sbloom 		case 'H':	/* handshake failed */
9326153Sbloom 			logent("MODEM HANDSHAKE", "FAILED");
9426153Sbloom 			failret++;
9526153Sbloom 			break;
9626153Sbloom 		case '3':	/* 2400 baud */
9726153Sbloom 			DEBUG(4, "Baudrate set to 2400 baud", CNULL);
9826153Sbloom 			fixline(dnf, 2400);
9926153Sbloom 			break;
10026153Sbloom 		case '2':	/* 1200 baud */
10126153Sbloom 			DEBUG(4, "Baudrate set to 1200 baud", CNULL);
10226153Sbloom 			fixline(dnf, 1200);
10326153Sbloom 			break;
10426153Sbloom 		case '1':	/* 300 baud */
10526153Sbloom 			DEBUG(4, "Baudrate set to 300 baud", CNULL);
10626153Sbloom 			fixline(dnf, 300);
10726153Sbloom 			break;
10826153Sbloom 		default:	/* Not one of the above, so must be garbage */
10926153Sbloom 			goto readchar;
11026153Sbloom 		}
11126153Sbloom 	if (failret) {
11226153Sbloom 		alarm (0);
11326153Sbloom 		delock(dev->D_line);
11426153Sbloom 		return CF_DIAL;
11526153Sbloom 	}
11626153Sbloom 	alarm (0);
11726153Sbloom 	return dnf;
11826153Sbloom }
11926153Sbloom 
12026153Sbloom attcls(fd)
12126153Sbloom int fd;
12226153Sbloom {
12326153Sbloom 	char dcname[20];
12426153Sbloom #ifdef USG
12526153Sbloom 	struct termio hup, sav;
12626153Sbloom #else  !USG
12726153Sbloom 	struct sgttyb hup, sav;
12826153Sbloom #endif !USG
12926153Sbloom 
13026153Sbloom 	if (fd > 0) {
13126153Sbloom 		sprintf(dcname, "/dev/%s", devSel);
13226153Sbloom 		DEBUG(4, "Hanging up fd = %d\n", fd);
13326153Sbloom 		/*
13426153Sbloom 		 * code to drop DTR -- change to 0 baud then back to default.
13526153Sbloom 		 */
13626153Sbloom 		gtty(fd, &hup);
13726153Sbloom 		gtty(fd, &sav);
13826153Sbloom #ifdef USG
13926153Sbloom 		hup.c_cflag = B0;
14026153Sbloom #else  !USG
14126153Sbloom 		hup.sg_ispeed = B0;
14226153Sbloom 		hup.sg_ospeed = B0;
14326153Sbloom #endif !USG
14426153Sbloom 		stty(fd, &hup);
14526153Sbloom 		sleep(2);
14626153Sbloom 		stty(fd, &sav);
14726153Sbloom 		/*
14826153Sbloom 		 * now raise DTR -- close the device
14926153Sbloom 		 */
15026153Sbloom 		sleep(2);
15126153Sbloom 		close(fd);
15226153Sbloom 		delock(devSel);
15326153Sbloom 	}
15426153Sbloom }
155