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
20static sigjmp_buf	Sjbuf;
21static void	timeout(void);
22
23void	df_disconnect(void);
24int	df_dialer(char *, char *, int);
25
26int
27df02_dialer(char *num, char *acu)
28{
29
30	return (df_dialer(num, acu, 0));
31}
32
33int
34df03_dialer(char *num, char *acu)
35{
36
37	return (df_dialer(num, acu, 1));
38}
39
40/* ARGSUSED */
41int
42df_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
97void
98df_disconnect(void)
99{
100
101	(void) write(FD, "\001", 1);
102	(void) sleep(1);
103	(void) ioctl(FD, TCFLSH, TCOFLUSH);
104}
105
106void
107df_abort(void)
108{
109
110	df_disconnect();
111}
112
113
114static void
115timeout(void)
116{
117
118	siglongjmp(Sjbuf, 1);
119}
120