xref: /illumos-gate/usr/src/cmd/tip/aculib/df.c (revision 8d489c7a)
1 /*
2  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 /*
7  * Copyright (c) 1983 Regents of the University of California.
8  * All rights reserved. The Berkeley software License Agreement
9  * specifies the terms and conditions for redistribution.
10  */
11 
12 #pragma ident	"%Z%%M%	%I%	%E% SMI"
13 
14 /*
15  * Dial the DF02-AC or DF03-AC
16  */
17 
18 #include "tip.h"
19 
20 static sigjmp_buf	Sjbuf;
21 static void	timeout(void);
22 
23 void	df_disconnect(void);
24 int	df_dialer(char *, char *, int);
25 
26 int
df02_dialer(char * num,char * acu)27 df02_dialer(char *num, char *acu)
28 {
29 
30 	return (df_dialer(num, acu, 0));
31 }
32 
33 int
df03_dialer(char * num,char * acu)34 df03_dialer(char *num, char *acu)
35 {
36 
37 	return (df_dialer(num, acu, 1));
38 }
39 
40 /* ARGSUSED */
41 int
df_dialer(char * num,char * acu,int df03)42 df_dialer(char *num, char *acu, int df03)
43 {
44 	int f = FD;
45 	struct termios buf;
46 	int speed = 0;
47 	char c = '\0';
48 
49 	(void) ioctl(f, TCGETS, &buf);
50 	buf.c_cflag |= HUPCL;
51 	(void) ioctl(f, TCSETS, &buf);
52 	if (sigsetjmp(Sjbuf, 1)) {
53 		(void) printf("connection timed out\r\n");
54 		df_disconnect();
55 		return (0);
56 	}
57 	if (boolean(value(VERBOSE)))
58 		(void) printf("\ndialing...");
59 	(void) fflush(stdout);
60 #ifdef TIOCMSET
61 	if (df03) {
62 		int st = TIOCM_ST;	/* secondary Transmit flag */
63 
64 		(void) ioctl(f, TCGETS, &buf);
65 		if (cfgetospeed(&buf) != B1200) { /* must dial at 1200 baud */
66 			speed = cfgetospeed(&buf);
67 			(void) cfsetospeed(&buf, B0);
68 			(void) cfsetispeed(&buf, B0);
69 			(void) cfsetospeed(&buf, B1200);
70 			(void) ioctl(f, TCSETSW, &buf);
71 			/* clear ST for 300 baud */
72 			(void) ioctl(f, TIOCMBIC, &st);
73 		} else
74 			/* set ST for 1200 baud */
75 			(void) ioctl(f, TIOCMBIS, &st);
76 	}
77 #endif
78 	(void) signal(SIGALRM, (sig_handler_t)timeout);
79 	(void) alarm(5 * strlen(num) + 10);
80 	(void) ioctl(f, TCFLSH, TCOFLUSH);
81 	(void) write(f, "\001", 1);
82 	(void) sleep(1);
83 	(void) write(f, "\002", 1);
84 	(void) write(f, num, strlen(num));
85 	(void) read(f, &c, 1);
86 #ifdef TIOCMSET
87 	if (df03 && speed) {
88 		(void) cfsetospeed(&buf, B0);
89 		(void) cfsetispeed(&buf, B0);
90 		(void) cfsetospeed(&buf, speed);
91 		(void) ioctl(f, TCSETSW, &buf);
92 	}
93 #endif
94 	return (c == 'A');
95 }
96 
97 void
df_disconnect(void)98 df_disconnect(void)
99 {
100 
101 	(void) write(FD, "\001", 1);
102 	(void) sleep(1);
103 	(void) ioctl(FD, TCFLSH, TCOFLUSH);
104 }
105 
106 void
df_abort(void)107 df_abort(void)
108 {
109 
110 	df_disconnect();
111 }
112 
113 
114 static void
timeout(void)115 timeout(void)
116 {
117 
118 	siglongjmp(Sjbuf, 1);
119 }
120