xref: /csrg-svn/usr.bin/uucp/libacu/pen.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 
818564Sralph #ifndef lint
9*62384Sbostic static char sccsid[] = "@(#)pen.c	8.1 (Berkeley) 06/06/93";
1048651Sbostic #endif /* not lint */
1118564Sralph 
1218564Sralph /*
1318564Sralph  *	Speaker's quick and dirty penril hack.  STA 4/1/85.
1418564Sralph  */
1546875Sbostic #include "condevs.h"
1618564Sralph 
penopn(telno,flds,dev)1718564Sralph penopn(telno, flds, dev)
1818564Sralph char *flds[], *telno;
1918564Sralph struct Devices *dev;
2018564Sralph {
2118564Sralph 	int	dh;
2218564Sralph 	int	i, ok = -1;
2318564Sralph 	char dcname[20];
2418564Sralph 
2518564Sralph 	sprintf(dcname, "/dev/%s", dev->D_line);
2618564Sralph 	if (setjmp(Sjbuf)) {
2718564Sralph 		DEBUG(1, "timeout penril open\n", "");
2818564Sralph 		logent("penril open", "TIMEOUT");
2918564Sralph 		if (dh >= 0)
3018564Sralph 			close(dh);
3118564Sralph 		delock(dev->D_line);
3218564Sralph 		return CF_NODEV;
3318564Sralph 	}
3418564Sralph 	signal(SIGALRM, alarmtr);
3518564Sralph 	getnextfd();
3618564Sralph 	alarm(10);
3718564Sralph 	dh = open(dcname, 2);
3825155Sbloom 	alarm(0);
3918564Sralph 	next_fd = -1;
4018564Sralph 	if (dh < 0) {
4118564Sralph 		DEBUG(4,"%s\n", errno == 4 ? "no carrier" : "can't open modem");
4218564Sralph 		delock(dev->D_line);
4318564Sralph 		return errno == 4 ? CF_DIAL : CF_NODEV;
4418564Sralph 	}
4518564Sralph 
4618564Sralph 	/* modem is open */
4718564Sralph 	fixline(dh, dev->D_speed);
4818564Sralph 
4918564Sralph 	/* translate - to P and = to W for Penril */
5018564Sralph 	DEBUG(4, "calling %s -> ", telno);
5118564Sralph 	for (i = 0; i < strlen(telno); ++i) {
5218564Sralph 		switch(telno[i]) {
5318564Sralph 		case '-':	/* delay */
5418564Sralph 			telno[i] = 'P';
5518564Sralph 			break;
5618564Sralph 		case '=':	/* await dial tone */
5718564Sralph 			telno[i] = 'W';
5818564Sralph 			break;
5918564Sralph 		case '<':
6018564Sralph 			telno[i] = 'P';
6118564Sralph 			break;
6218564Sralph 		}
6318564Sralph 	}
6418564Sralph 	DEBUG(4, "%s\n", telno);
6518564Sralph 	sleep(1);
6618564Sralph 	for(i = 0; i < 5; ++i) {	/* make up to 5 tries */
6718564Sralph 		slowrite(dh, "\r");/* awake, thou lowly Penril! */
6818564Sralph 
6918564Sralph 		DEBUG(4, "wanted %s ", ">");
7018564Sralph 		ok = expect(">", dh);
7118564Sralph 		DEBUG(4, "got %s\n", ok ? "?" : "that");
7218564Sralph 		if (ok != 0)
7318564Sralph 			continue;
7418564Sralph 		slowrite(dh, "K");	/* "K" (enter number) command */
7518564Sralph 		DEBUG(4, "wanted %s ", "NO.: ");
7618564Sralph 		ok = expect("NO.: ", dh);
7718564Sralph 		DEBUG(4, "got %s\n", ok ? "?" : "that");
7818564Sralph 		if (ok == 0)
7918564Sralph 			break;
8018564Sralph 	}
8118564Sralph 
8218564Sralph 	if (ok == 0) {
8318564Sralph 		slowrite(dh, telno); /* send telno, send \r */
8418564Sralph 		slowrite(dh, "\r");
8518564Sralph 		DEBUG(4, "wanted %s ", "OK");
8618564Sralph 		ok = expect("OK", dh);
8718564Sralph 		DEBUG(4, "got %s\n", ok ? "?" : "that");
8818564Sralph 	}
8918564Sralph 	if (ok != 0) {
9018564Sralph 		if (dh > 2)
9118564Sralph 			close(dh);
9218564Sralph 		DEBUG(4, "penDial failed\n", "");
9318564Sralph 		return CF_DIAL;
9418564Sralph 	}
9518564Sralph 	else
9618564Sralph 		DEBUG(4, "penDial ok\n", "");
9718564Sralph 	return dh;
9818564Sralph }
9918564Sralph 
pencls(fd)10018564Sralph pencls(fd)
10118564Sralph int fd;
10218564Sralph {
10318564Sralph 	if (fd > 0) {
10418564Sralph 		close(fd);
10518564Sralph 		sleep(5);
10618564Sralph 		delock(devSel);
10718564Sralph 	}
10818564Sralph }
109