xref: /csrg-svn/usr.bin/tip/aculib/dn11.c (revision 13285)
1 #ifndef lint
2 static char sccsid[] = "@(#)dn11.c	4.14 (Berkeley) 06/25/83";
3 #endif
4 
5 /*
6  * Routines for dialing up on DN-11
7  */
8 #include "tip.h"
9 
10 int dn_abort(), alarmtr();
11 static jmp_buf jmpbuf;
12 static int child = -1, dn;
13 
14 dn_dialer(num, acu)
15 	char *num, *acu;
16 {
17 	extern errno;
18 	char *p, *q, phone[40];
19 	int lt, nw, connected = 1;
20 	register int timelim;
21 
22 	if (boolean(value(VERBOSE)))
23 		printf("\nstarting call...");
24 	if ((dn = open(acu, 1)) < 0) {
25 		if (errno == EBUSY)
26 			printf("line busy...");
27 		else
28 			printf("acu open error...");
29 		return (0);
30 	}
31 	if (setjmp(jmpbuf)) {
32 		kill(child, SIGKILL);
33 		close(dn);
34 		return (0);
35 	}
36 	signal(SIGALRM, alarmtr);
37 	timelim = 5 * strlen(num);
38 	alarm(timelim < 30 ? 30 : timelim);
39 	if ((child = fork()) == 0) {
40 		/*
41 		 * ignore this stuff for aborts
42 		 */
43 		signal(SIGALRM, SIG_IGN);
44 		signal(SIGINT, SIG_IGN);
45 		signal(SIGQUIT, SIG_IGN);
46 		sleep(2);
47 		nw = write(dn, num, lt = strlen(num));
48 		exit(nw != lt);
49 	}
50 	/*
51 	 * open line - will return on carrier
52 	 */
53 	if ((FD = open(DV, 2)) < 0) {
54 		if (errno == EIO)
55 			printf("lost carrier...");
56 		else
57 			printf("dialup line open failed...");
58 		alarm(0);
59 		kill(child, SIGKILL);
60 		close(dn);
61 		return (0);
62 	}
63 	alarm(0);
64 	ioctl(dn, TIOCHPCL, 0);
65 	signal(SIGALRM, SIG_DFL);
66 	while ((nw = wait(&lt)) != child && nw != -1)
67 		;
68 	fflush(stdout);
69 	close(dn);
70 	if (lt != 0) {
71 		close(FD);
72 		return (0);
73 	}
74 	return (1);
75 }
76 
77 alarmtr()
78 {
79 
80 	alarm(0);
81 	longjmp(jmpbuf, 1);
82 }
83 
84 /*
85  * Insurance, for some reason we don't seem to be
86  *  hanging up...
87  */
88 dn_disconnect()
89 {
90 
91 	sleep(2);
92 	if (FD > 0)
93 		ioctl(FD, TIOCCDTR, 0);
94 	close(FD);
95 }
96 
97 dn_abort()
98 {
99 
100 	sleep(2);
101 	if (child > 0)
102 		kill(child, SIGKILL);
103 	if (dn > 0)
104 		close(dn);
105 	if (FD > 0)
106 		ioctl(FD, TIOCCDTR, 0);
107 	close(FD);
108 }
109