xref: /csrg-svn/usr.bin/tip/aculib/dn11.c (revision 3691)
1*3691Sroot /*	dn11.c	4.1	81/05/09	*/
2*3691Sroot /*
3*3691Sroot  * Routines for dialing up on DN-11
4*3691Sroot  */
5*3691Sroot #include "tip.h"
6*3691Sroot 
7*3691Sroot int dn_abort();
8*3691Sroot 
9*3691Sroot #if DN11
10*3691Sroot dn_dialer(num, acu)
11*3691Sroot char *num, *acu;
12*3691Sroot {
13*3691Sroot 	extern errno;
14*3691Sroot 	char *p, *q, b[30];
15*3691Sroot 	int child = -1, dn, t, connected = 1;
16*3691Sroot 
17*3691Sroot 	if ((dn = open(acu, 1)) < 0) {
18*3691Sroot 		if (errno == 6)
19*3691Sroot 			printf("line busy\n");
20*3691Sroot 		return(0);
21*3691Sroot 	}
22*3691Sroot 	if ((child = fork()) == -1) {
23*3691Sroot 		printf("can't fork\n");
24*3691Sroot 		return(0);
25*3691Sroot 	}
26*3691Sroot 	if (child == 0) {
27*3691Sroot 		signal(SIGALRM, SIG_IGN);
28*3691Sroot 		pause();
29*3691Sroot 	}
30*3691Sroot 	sleep(2);
31*3691Sroot 	/*
32*3691Sroot 	 * copy phone #, assure EON
33*3691Sroot 	 */
34*3691Sroot 	for (p = b, q = num; *p = *q; p++, q++)
35*3691Sroot 		;
36*3691Sroot 	if (*(p-1) != '<') {
37*3691Sroot 		if (*(p-1) != '-')
38*3691Sroot 			*p++ = '-';
39*3691Sroot 		*p++ = '<';
40*3691Sroot 	}
41*3691Sroot 	close(FD);
42*3691Sroot 	t = p-b;
43*3691Sroot 	signal(SIGALRM, dn_abort);
44*3691Sroot 	alarm(5*t);
45*3691Sroot 	t = write(dn, b, t);
46*3691Sroot 	alarm(0);
47*3691Sroot 	if (t < 0) {
48*3691Sroot 		printf("dn11 write error\n");
49*3691Sroot 		connected = 0;
50*3691Sroot 		goto error;
51*3691Sroot 	}
52*3691Sroot 	alarm(40);		/* was 5; sometimes missed carrier */
53*3691Sroot 	FD = open(DV, 2);
54*3691Sroot 	alarm(0);
55*3691Sroot 	if (FD < 0) {
56*3691Sroot 		if (errno == 4)
57*3691Sroot 			printf("lost carrier\n");
58*3691Sroot 		connected = 0;
59*3691Sroot 		goto error;
60*3691Sroot 	}
61*3691Sroot 	ioctl(FD, TIOCEXCL, 0);
62*3691Sroot 	ioctl(FD, TIOCHPCL, 0);
63*3691Sroot error:
64*3691Sroot 	kill(child, SIGKILL);
65*3691Sroot 	alarm(10);
66*3691Sroot 	while ((t = wait((int *)NULL)) != -1 && t != child)
67*3691Sroot 		;
68*3691Sroot 	alarm(0);
69*3691Sroot 	signal(SIGALRM, SIG_DFL);
70*3691Sroot 	return(connected);
71*3691Sroot }
72*3691Sroot 
73*3691Sroot dn_disconnect() { }
74*3691Sroot 
75*3691Sroot dn_abort() { }
76*3691Sroot #endif
77