1 /* $OpenBSD: df.c,v 1.9 2006/03/17 19:17:13 moritz Exp $ */
2 /* $NetBSD: df.c,v 1.4 1995/10/29 00:49:51 pk Exp $ */
3
4 /*-
5 * SPDX-License-Identifier: BSD-3-Clause
6 *
7 * Copyright (c) 1983, 1993
8 * The Regents of the University of California. All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of the University nor the names of its contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35 /*
36 * Dial the DF02-AC or DF03-AC
37 */
38
39 #include "tip.h"
40
41 static jmp_buf Sjbuf;
42
43 static int df_dialer(char *, char *, int);
44 static void alrm_timeout(int);
45
46 int
df02_dialer(char * num,char * acu)47 df02_dialer(char *num, char *acu)
48 {
49 return (df_dialer(num, acu, 0));
50 }
51
52 int
df03_dialer(char * num,char * acu)53 df03_dialer(char *num, char *acu)
54 {
55 return (df_dialer(num, acu, 1));
56 }
57
58 static int
df_dialer(char * num,char * acu,int df03)59 df_dialer(char *num, char *acu, int df03)
60 {
61 int f = FD;
62 struct termios cntrl;
63 int speed = 0;
64 char c = '\0';
65
66 tcgetattr(f, &cntrl);
67 cntrl.c_cflag |= HUPCL;
68 tcsetattr(f, TCSANOW, &cntrl);
69 if (setjmp(Sjbuf)) {
70 printf("connection timed out\r\n");
71 df_disconnect();
72 return (0);
73 }
74 if (boolean(value(VERBOSE)))
75 printf("\ndialing...");
76 fflush(stdout);
77 #ifdef TIOCMSET
78 if (df03) {
79 int st = TIOCM_ST; /* secondary Transmit flag */
80
81 tcgetattr(f, &cntrl);
82 speed = cfgetospeed(&cntrl);
83 if (speed != B1200) { /* must dial at 1200 baud */
84 cfsetospeed(&cntrl, B1200);
85 cfsetispeed(&cntrl, B1200);
86 tcsetattr(f, TCSAFLUSH, &cntrl);
87 ioctl(f, TIOCMBIC, &st); /* clear ST for 300 baud */
88 } else
89 ioctl(f, TIOCMBIS, &st); /* set ST for 1200 baud */
90 }
91 #endif
92 signal(SIGALRM, alrm_timeout);
93 alarm(5 * strlen(num) + 10);
94 tcflush(f, TCIOFLUSH);
95 write(f, "\001", 1);
96 sleep(1);
97 write(f, "\002", 1);
98 write(f, num, strlen(num));
99 read(f, &c, 1);
100 #ifdef TIOCMSET
101 if (df03 && speed != B1200) {
102 cfsetospeed(&cntrl, speed);
103 cfsetispeed(&cntrl, speed);
104 tcsetattr(f, TCSAFLUSH, &cntrl);
105 }
106 #endif
107 return (c == 'A');
108 }
109
110 void
df_disconnect(void)111 df_disconnect(void)
112 {
113 write(FD, "\001", 1);
114 sleep(1);
115 tcflush(FD, TCIOFLUSH);
116 }
117
118 void
df_abort(void)119 df_abort(void)
120 {
121 df_disconnect();
122 }
123
124 /*ARGSUSED*/
125 static void
alrm_timeout(int signo)126 alrm_timeout(int signo)
127 {
128 longjmp(Sjbuf, 1);
129 }
130