xref: /csrg-svn/usr.bin/uucp/libacu/cds224.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 
825883Sbloom #ifndef lint
9*62384Sbostic static char sccsid[] = "@(#)cds224.c	8.1 (Berkeley) 06/06/93";
1048651Sbostic #endif /* not lint */
1125883Sbloom 
1246875Sbostic #include "condevs.h"
1325883Sbloom 
1425883Sbloom /*
1525883Sbloom  *	conopn: establish dial-out connection through a Concord CDS 224.
1625883Sbloom  *	Returns descriptor open to tty for reading and writing.
1725883Sbloom  *	Negative values (-1...-7) denote errors in connmsg.
1825883Sbloom  *	Be sure to disconnect tty when done, via HUPCL or stty 0.
1925883Sbloom  */
2025883Sbloom #define TRYS 5	/* number of trys */
2125883Sbloom 
cdsopn224(telno,flds,dev)2225883Sbloom cdsopn224(telno, flds, dev)
2325883Sbloom char *telno;
2425883Sbloom char *flds[];
2525883Sbloom struct Devices *dev;
2625883Sbloom {
2725883Sbloom 	int	dh = -1;
2825883Sbloom 	int	i, ok, er = 0, delay;
2925883Sbloom 	extern errno;
3025883Sbloom 	char dcname[20];
3146875Sbostic 	char tempbuf[20];
3225883Sbloom 
3325883Sbloom 	sprintf(dcname, "/dev/%s", dev->D_line);
3425883Sbloom 	if (setjmp(Sjbuf)) {
3525883Sbloom 		DEBUG(1, "timeout concord open\n", "");
3625883Sbloom 		logent("concord open", "TIMEOUT");
3725883Sbloom 		if (dh >= 0)
3825883Sbloom 			cdscls224(dh);
3925883Sbloom 		delock(dev->D_line);
4025883Sbloom 		return CF_NODEV;
4125883Sbloom 	}
4225883Sbloom 	signal(SIGALRM, alarmtr);
4325883Sbloom 	getnextfd();
4425883Sbloom 	alarm(10);
4525883Sbloom 	dh = open(dcname, 2);
4625883Sbloom 	alarm(0);
4725883Sbloom 
4825883Sbloom 	/* modem is open */
4925883Sbloom 	next_fd = -1;
5025883Sbloom 	if (dh < 0) {
5125883Sbloom 		delock(dev->D_line);
5225883Sbloom 		return CF_NODEV;
5325883Sbloom 	}
5425883Sbloom 	fixline(dh, dev->D_speed);
5525883Sbloom 
5625883Sbloom 	DEBUG(4, "calling %s -> ", telno);
5725883Sbloom 	if (dochat(dev, flds, dh)) {
5825883Sbloom 		logent(dcname, "CHAT FAILED");
5925883Sbloom 		cdscls224(dh);
6025883Sbloom 		return CF_DIAL;
6125883Sbloom 	}
6225883Sbloom 	for(i = 0; i < TRYS; ++i) {
6325883Sbloom 		/* wake up Concord */
6425883Sbloom 		write(dh, "\r\r", 2);
6525883Sbloom 		DEBUG(4, "wanted CDS >", CNULL);
6625883Sbloom 		ok = expect("CDS >", dh);
6725883Sbloom 		DEBUG(4, "got %s\n", ok ? "?" : "that");
6825883Sbloom 		if (ok != 0)
6925883Sbloom 			continue;
7025883Sbloom 
7125883Sbloom 		write(dh, "\r", 2);
7225883Sbloom 		DEBUG(4, "wanted CDS >", CNULL);
7325883Sbloom 		ok = expect("CDS >", dh);
7425883Sbloom 		DEBUG(4, "got %s\n", ok ? "?" : "that");
7525883Sbloom 		if (ok != 0)
7625883Sbloom 			continue;
7725883Sbloom 
7825883Sbloom 		/* send telno \r */
7925883Sbloom 		sprintf(tempbuf,"D%s\r",telno);
8025883Sbloom 		write(dh, tempbuf, strlen(tempbuf));
8125883Sbloom 
8225883Sbloom 		DEBUG(4, "wanted DIALING ", CNULL);
8325883Sbloom 		ok = expect("DIALING ", dh);
8425883Sbloom 		DEBUG(4, "got %s\n", ok ? "?" : "that");
8525883Sbloom 		if (ok == 0)
8625883Sbloom 			break;
8725883Sbloom 	}
8825883Sbloom 
8925883Sbloom 	if (ok == 0) {
9025883Sbloom 		sleep(10);	/* give concord some time */
9125883Sbloom 		DEBUG(4, "wanted INITIATING " , CNULL);
9225883Sbloom 		ok = expect("INITIATING", dh);
9325883Sbloom 		DEBUG(4, "got %s\n", ok ? "?" : "that");
9425883Sbloom 	}
9525883Sbloom 
9625883Sbloom 	if (ok != 0) {
9725883Sbloom 		if (dh > 2)
9825883Sbloom 			close(dh);
9925883Sbloom 		DEBUG(4, "conDial failed\n", CNULL);
10025883Sbloom 		delock(dev->D_line);
10125883Sbloom 		return CF_DIAL;
10225883Sbloom 	}
10325883Sbloom 	DEBUG(4, "concord ok\n", CNULL);
10425883Sbloom 	return dh;
10525883Sbloom }
10625883Sbloom 
cdscls224(fd)10725883Sbloom cdscls224(fd)
10825883Sbloom {
10925883Sbloom 
11025883Sbloom 	if (fd > 0) {
11125883Sbloom 		close(fd);
11225883Sbloom 		sleep(5);
11325883Sbloom 		delock(devSel);
11425883Sbloom 	}
11525883Sbloom }
116