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