xref: /csrg-svn/usr.bin/tip/aculib/biz22.c (revision 5130)
1*5130Ssam /*	biz22.c	4.1	81/11/29	*/
2*5130Ssam #include "tip.h"
3*5130Ssam 
4*5130Ssam #if BIZ1022
5*5130Ssam #define DISCONNECT	"\20\04"	/* disconnection string */
6*5130Ssam 
7*5130Ssam static int sigALRM();
8*5130Ssam static int timeout = 0;
9*5130Ssam 
10*5130Ssam /*
11*5130Ssam  * Dial up on a BIZCOMP Model 1022 with either
12*5130Ssam  * 	tone dialing (mod = "V")
13*5130Ssam  *	pulse dialing (mod = "W")
14*5130Ssam  */
15*5130Ssam static int
16*5130Ssam biz_dialer(num, mod)
17*5130Ssam 	char *num, *mod;
18*5130Ssam {
19*5130Ssam 	register int connected = 0;
20*5130Ssam 	char cbuf[40];
21*5130Ssam 
22*5130Ssam 	if (boolean(value(VERBOSE)))
23*5130Ssam 		printf("\nstarting call...");
24*5130Ssam 	/*
25*5130Ssam 	 * Disable auto-answer and configure for tone/pulse
26*5130Ssam 	 *  dialing
27*5130Ssam 	 */
28*5130Ssam 	if (cmd("\02K\r")) {
29*5130Ssam 		printf("can't initialize bizcomp...");
30*5130Ssam 		return (0);
31*5130Ssam 	}
32*5130Ssam 	strcpy(cbuf, "\02.\r");
33*5130Ssam 	cbuf[1] = *mod;
34*5130Ssam 	if (cmd(cbuf)) {
35*5130Ssam 		printf("can't set dialing mode...");
36*5130Ssam 		return (0);
37*5130Ssam 	}
38*5130Ssam 	strcpy(cbuf, "\02D");
39*5130Ssam 	strcat(cbuf, num);
40*5130Ssam 	strcat(cbuf, "\r");
41*5130Ssam 	write(FD, cbuf, strlen(cbuf));
42*5130Ssam 	if (!detect("7\r")) {
43*5130Ssam 		printf("can't get dial tone...");
44*5130Ssam 		return (0);
45*5130Ssam 	}
46*5130Ssam 	if (boolean(value(VERBOSE)))
47*5130Ssam 		printf("ringing...");
48*5130Ssam 	/*
49*5130Ssam 	 * The reply from the BIZCOMP should be:
50*5130Ssam 	 *	2 \r or 7 \r	failure
51*5130Ssam 	 *	1 \r		success
52*5130Ssam 	 */
53*5130Ssam 	connected = detect("1\r");
54*5130Ssam #ifdef ACULOG
55*5130Ssam 	if (timeout) {
56*5130Ssam 		char line[80];
57*5130Ssam 
58*5130Ssam 		sprintf(line, "%d second dial timeout",
59*5130Ssam 			number(value(DIALTIMEOUT)));
60*5130Ssam 		logent(value(HOST), num, "biz1022", line);
61*5130Ssam 	}
62*5130Ssam #endif
63*5130Ssam 	if (timeout)
64*5130Ssam 		biz22_disconnect();	/* insurance */
65*5130Ssam 	return (connected);
66*5130Ssam }
67*5130Ssam 
68*5130Ssam biz22w_dialer(num, acu)
69*5130Ssam 	char *num, *acu;
70*5130Ssam {
71*5130Ssam 	return (biz_dialer(num, "W"));
72*5130Ssam }
73*5130Ssam 
74*5130Ssam biz22f_dialer(num, acu)
75*5130Ssam 	char *num, *acu;
76*5130Ssam {
77*5130Ssam 	return (biz_dialer(num, "V"));
78*5130Ssam }
79*5130Ssam 
80*5130Ssam biz22_disconnect()
81*5130Ssam {
82*5130Ssam 	write(FD, DISCONNECT, 4);
83*5130Ssam 	sleep(2);
84*5130Ssam 	ioctl(FD, TIOCFLUSH);
85*5130Ssam }
86*5130Ssam 
87*5130Ssam biz22_abort()
88*5130Ssam {
89*5130Ssam 	write(FD, "\02", 1);
90*5130Ssam 	timeout = 1;
91*5130Ssam }
92*5130Ssam 
93*5130Ssam static int
94*5130Ssam sigALRM()
95*5130Ssam {
96*5130Ssam 	signal(SIGALRM, SIG_IGN);
97*5130Ssam 	printf("\07timeout waiting for reply\n");
98*5130Ssam 	timeout = 1;
99*5130Ssam }
100*5130Ssam 
101*5130Ssam static int
102*5130Ssam cmd(s)
103*5130Ssam 	register char *s;
104*5130Ssam {
105*5130Ssam 	char c;
106*5130Ssam 
107*5130Ssam 	write(FD, s, strlen(s));
108*5130Ssam 	timeout = 0;
109*5130Ssam 	signal(SIGALRM, biz22_abort);
110*5130Ssam 	alarm(number(value(DIALTIMEOUT)));
111*5130Ssam 	read(FD, &c, 1);
112*5130Ssam 	alarm(0);
113*5130Ssam 	signal(SIGALRM, SIG_DFL);
114*5130Ssam 	if (timeout)
115*5130Ssam 		return (1);
116*5130Ssam 	c &= 0177;
117*5130Ssam 	return (c != '\r');
118*5130Ssam }
119*5130Ssam 
120*5130Ssam static int
121*5130Ssam detect(s)
122*5130Ssam 	register char *s;
123*5130Ssam {
124*5130Ssam 	char c;
125*5130Ssam 
126*5130Ssam 	signal(SIGALRM, biz22_abort);
127*5130Ssam 	timeout = 0;
128*5130Ssam 	while (*s) {
129*5130Ssam 		alarm(number(value(DIALTIMEOUT)));
130*5130Ssam 		read(FD, &c, 1);
131*5130Ssam 		alarm(0);
132*5130Ssam 		if (timeout)
133*5130Ssam 			return (0);
134*5130Ssam 		c &= 0177;
135*5130Ssam 		if (c != *s++)
136*5130Ssam 			return (0);
137*5130Ssam 	}
138*5130Ssam 	signal(SIGALRM, SIG_DFL);
139*5130Ssam 	return (1);
140*5130Ssam }
141