xref: /original-bsd/usr.bin/tip/aculib/dn11.c (revision 2301fdfb)
1 /*
2  * Copyright (c) 1983 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that the above copyright notice and this paragraph are
7  * duplicated in all such forms and that any documentation,
8  * advertising materials, and other materials related to such
9  * distribution and use acknowledge that the software was developed
10  * by the University of California, Berkeley.  The name of the
11  * University may not be used to endorse or promote products derived
12  * from this software without specific prior written permission.
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16  */
17 
18 #ifndef lint
19 static char sccsid[] = "@(#)dn11.c	5.2 (Berkeley) 09/13/88";
20 #endif /* not lint */
21 
22 /*
23  * Routines for dialing up on DN-11
24  */
25 #include "tip.h"
26 
27 int dn_abort(), alarmtr();
28 static jmp_buf jmpbuf;
29 static int child = -1, dn;
30 
31 dn_dialer(num, acu)
32 	char *num, *acu;
33 {
34 	extern errno;
35 	char *p, *q, phone[40];
36 	int lt, nw, connected = 1;
37 	register int timelim;
38 
39 	if (boolean(value(VERBOSE)))
40 		printf("\nstarting call...");
41 	if ((dn = open(acu, 1)) < 0) {
42 		if (errno == EBUSY)
43 			printf("line busy...");
44 		else
45 			printf("acu open error...");
46 		return (0);
47 	}
48 	if (setjmp(jmpbuf)) {
49 		kill(child, SIGKILL);
50 		close(dn);
51 		return (0);
52 	}
53 	signal(SIGALRM, alarmtr);
54 	timelim = 5 * strlen(num);
55 	alarm(timelim < 30 ? 30 : timelim);
56 	if ((child = fork()) == 0) {
57 		/*
58 		 * ignore this stuff for aborts
59 		 */
60 		signal(SIGALRM, SIG_IGN);
61 		signal(SIGINT, SIG_IGN);
62 		signal(SIGQUIT, SIG_IGN);
63 		sleep(2);
64 		nw = write(dn, num, lt = strlen(num));
65 		exit(nw != lt);
66 	}
67 	/*
68 	 * open line - will return on carrier
69 	 */
70 	if ((FD = open(DV, 2)) < 0) {
71 		if (errno == EIO)
72 			printf("lost carrier...");
73 		else
74 			printf("dialup line open failed...");
75 		alarm(0);
76 		kill(child, SIGKILL);
77 		close(dn);
78 		return (0);
79 	}
80 	alarm(0);
81 	ioctl(dn, TIOCHPCL, 0);
82 	signal(SIGALRM, SIG_DFL);
83 	while ((nw = wait(&lt)) != child && nw != -1)
84 		;
85 	fflush(stdout);
86 	close(dn);
87 	if (lt != 0) {
88 		close(FD);
89 		return (0);
90 	}
91 	return (1);
92 }
93 
94 alarmtr()
95 {
96 
97 	alarm(0);
98 	longjmp(jmpbuf, 1);
99 }
100 
101 /*
102  * Insurance, for some reason we don't seem to be
103  *  hanging up...
104  */
105 dn_disconnect()
106 {
107 
108 	sleep(2);
109 	if (FD > 0)
110 		ioctl(FD, TIOCCDTR, 0);
111 	close(FD);
112 }
113 
114 dn_abort()
115 {
116 
117 	sleep(2);
118 	if (child > 0)
119 		kill(child, SIGKILL);
120 	if (dn > 0)
121 		close(dn);
122 	if (FD > 0)
123 		ioctl(FD, TIOCCDTR, 0);
124 	close(FD);
125 }
126