]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - usr.bin/tip/libacu/dn11.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / usr.bin / tip / libacu / dn11.c
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$");
35
36 #ifndef lint
37 #if 0
38 static char sccsid[] = "@(#)dn11.c      8.1 (Berkeley) 6/6/93";
39 static 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
48 static jmp_buf jmpbuf;
49 static pid_t child = -1, dn;
50
51 static void alarmtr(int);
52
53 int
54 dn_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*/
118 static void
119 alarmtr(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  */
129 void
130 dn_disconnect(void)
131 {
132         sleep(2);
133         if (FD > 0)
134                 ioctl(FD, TIOCCDTR, 0);
135         close(FD);
136 }
137
138 void
139 dn_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 }