dn11.c revision 331722
1/*	$OpenBSD: dn11.c,v 1.9 2006/03/17 19:17:13 moritz Exp $	*/
2/*	$NetBSD: dn11.c,v 1.4 1995/10/29 00:49:53 pk Exp $	*/
3
4/*
5 * Copyright (c) 1983, 1993
6 *	The Regents of the University of California.  All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 *    may be used to endorse or promote products derived from this software
18 *    without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#include <sys/cdefs.h>
34__FBSDID("$FreeBSD: stable/11/usr.bin/tip/libacu/dn11.c 331722 2018-03-29 02:50:57Z eadler $");
35
36#ifndef lint
37#if 0
38static char sccsid[] = "@(#)dn11.c	8.1 (Berkeley) 6/6/93";
39static const char rcsid[] = "$OpenBSD: dn11.c,v 1.9 2006/03/17 19:17:13 moritz Exp $";
40#endif
41#endif /* not lint */
42
43/*
44 * Routines for dialing up on DN-11
45 */
46#include "tip.h"
47
48static jmp_buf jmpbuf;
49static pid_t child = -1, dn;
50
51static void alarmtr(int);
52
53int
54dn_dialer(char *num, char *acu)
55{
56	int lt, nw;
57	int timelim;
58	struct termios cntrl;
59
60	if (boolean(value(VERBOSE)))
61		printf("\nstarting call...");
62	if ((dn = open(acu, 1)) < 0) {
63		if (errno == EBUSY)
64			printf("line busy...");
65		else
66			printf("acu open error...");
67		return (0);
68	}
69	if (setjmp(jmpbuf)) {
70		kill(child, SIGKILL);
71		close(dn);
72		return (0);
73	}
74	signal(SIGALRM, alarmtr);
75	timelim = 5 * strlen(num);
76	alarm(timelim < 30 ? 30 : timelim);
77	if ((child = fork()) == 0) {
78		/*
79		 * ignore this stuff for aborts
80		 */
81		signal(SIGALRM, SIG_IGN);
82		signal(SIGINT, SIG_IGN);
83		signal(SIGQUIT, SIG_IGN);
84		sleep(2);
85		nw = write(dn, num, lt = strlen(num));
86		exit(nw != lt);
87	}
88	/*
89	 * open line - will return on carrier
90	 */
91	if ((FD = open(DV, 2)) < 0) {
92		if (errno == EIO)
93			printf("lost carrier...");
94		else
95			printf("dialup line open failed...");
96		alarm(0);
97		kill(child, SIGKILL);
98		close(dn);
99		return (0);
100	}
101	alarm(0);
102	tcgetattr(dn, &cntrl);
103	cntrl.c_cflag |= HUPCL;
104	tcsetattr(dn, TCSANOW, &cntrl);
105	signal(SIGALRM, SIG_DFL);
106	while ((nw = wait(&lt)) != child && nw != -1)
107		;
108	fflush(stdout);
109	close(dn);
110	if (lt != 0) {
111		close(FD);
112		return (0);
113	}
114	return (1);
115}
116
117/*ARGSUSED*/
118static void
119alarmtr(int signo)
120{
121	alarm(0);
122	longjmp(jmpbuf, 1);
123}
124
125/*
126 * Insurance, for some reason we don't seem to be
127 *  hanging up...
128 */
129void
130dn_disconnect(void)
131{
132	sleep(2);
133	if (FD > 0)
134		ioctl(FD, TIOCCDTR, 0);
135	close(FD);
136}
137
138void
139dn_abort(void)
140{
141	sleep(2);
142	if (child > 0)
143		kill(child, SIGKILL);
144	if (dn > 0)
145		close(dn);
146	if (FD > 0)
147		ioctl(FD, TIOCCDTR, 0);
148	close(FD);
149}
150