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