xref: /original-bsd/usr.bin/uucp/libacu/nov.c (revision aba77441)
1 #ifndef lint
2 static char sccsid[] = "@(#)nov.c	4.1 (Berkeley) 01/22/85";
3 #endif
4 
5 #include "../condevs.h"
6 #ifdef NOVATION
7 
8 /***
9  *	novopn(telno, flds, dev) connect to novation Smart-Cat
10  *	(similar to hayes smartmodem)
11  *	char *flds[], *dev[];
12  *
13  *	return codes:
14  *		>0  -  file number  -  ok
15  *		CF_DIAL,CF_DEVICE  -  failed
16  */
17 
18 novopn(telno, flds, dev)
19 char *telno;
20 char *flds[];
21 struct Devices *dev;
22 {
23 	int	dh = -1;
24 	extern errno;
25 	char dcname[20];
26 	int pulse = 0;
27 
28 	sprintf(dcname, "/dev/%s", dev->D_line);
29 	DEBUG(4, "dc - %s\n", dcname);
30 	if (strcmp(dev->D_calldev, "pulse") == 0)
31 		pulse = 1;
32 	if (setjmp(Sjbuf)) {
33 		DEBUG(1, "timeout novation open %s\n", dcname);
34 		logent("novation open", "TIMEOUT");
35 		if (dh >= 0)
36 			close(dh);
37 		delock(dev->D_line);
38 		return CF_DIAL;
39 	}
40 	signal(SIGALRM, alarmtr);
41 	getnextfd();
42 	alarm(10);
43 	dh = open(dcname, 2); /* read/write */
44 	alarm(0);
45 
46 	/* modem is open */
47 	next_fd = -1;
48 	if (dh >= 0) {
49 		fixline(dh, dev->D_speed);
50 		/* set guard time small so line is in transparant mode */
51 		slowrite(dh, "\rATS12=1\r");
52 		if (expect("OK", dh) != 0) {
53 			logent("NOV no line", _FAILED);
54 			strcpy(devSel, dev->D_line);
55 			novcls(dh);
56 			return CF_DIAL;
57 		}
58 
59 		if (pulse)
60 			slowrite(dh, "ATDP");
61 		else
62 			slowrite(dh, "ATDT");
63 		slowrite(dh, telno);
64 		slowrite(dh, "\r");
65 
66 		if (expect("CONNECT", dh) != 0) {
67 			logent("NOV no carrier", _FAILED);
68 			strcpy(devSel, dev->D_line);
69 			novcls(dh);
70 			return CF_DIAL;
71 		}
72 
73 	}
74 	if (dh < 0) {
75 		DEBUG(4, "novation failed\n", CNULL);
76 		delock(dev->D_line);
77 	}
78 	DEBUG(4, "novation ok\n", CNULL);
79 	return dh;
80 }
81 
82 novcls(fd)
83 int fd;
84 {
85 	char dcname[20];
86 	struct sgttyb hup, sav;
87 
88 	if (fd > 0) {
89 		sprintf(dcname, "/dev/%s", devSel);
90 		DEBUG(4, "Hanging up fd = %d\n", fd);
91 		/*
92 		 * code to drop DTR -- change to 0 baud then back to default.
93 		 */
94 		gtty(fd, &hup);
95 		gtty(fd, &sav);
96 		hup.sg_ispeed = B0;
97 		hup.sg_ospeed = B0;
98 		stty(fd, &hup);
99 		sleep(2);
100 		stty(fd, &sav);
101 		/*
102 		 * now raise DTR -- close the device & open it again.
103 		 */
104 		sleep(2);
105 		close(fd);
106 		sleep(2);
107 		fd = open(dcname, 2);
108 		/*
109 		 * Since we have a getty sleeping on this line, when it wakes up it sends
110 		 * all kinds of garbage to the modem.  Unfortunatly, the modem likes to
111 		 * execute the previous command when it sees the garbage.  The previous
112 		 * command was to dial the phone, so let's make the last command reset
113 		 * the modem.
114 		 */
115 		sleep(2);
116 		slowrite(fd, "\rATZ\r");
117 		close(fd);
118 		delock(devSel);
119 	}
120 }
121 
122 #endif NOVATION
123