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