17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
37c478bd9Sstevel@tonic-gate * Use is subject to license terms.
47c478bd9Sstevel@tonic-gate */
5*8d489c7aSmuffin
67c478bd9Sstevel@tonic-gate /*
77c478bd9Sstevel@tonic-gate * Copyright (c) 1983 Regents of the University of California.
87c478bd9Sstevel@tonic-gate * All rights reserved. The Berkeley software License Agreement
97c478bd9Sstevel@tonic-gate * specifies the terms and conditions for redistribution.
107c478bd9Sstevel@tonic-gate */
11*8d489c7aSmuffin
12*8d489c7aSmuffin #pragma ident "%Z%%M% %I% %E% SMI"
137c478bd9Sstevel@tonic-gate
147c478bd9Sstevel@tonic-gate /*
157c478bd9Sstevel@tonic-gate * Dial the DF02-AC or DF03-AC
167c478bd9Sstevel@tonic-gate */
177c478bd9Sstevel@tonic-gate
187c478bd9Sstevel@tonic-gate #include "tip.h"
197c478bd9Sstevel@tonic-gate
207c478bd9Sstevel@tonic-gate static sigjmp_buf Sjbuf;
21*8d489c7aSmuffin static void timeout(void);
227c478bd9Sstevel@tonic-gate
23*8d489c7aSmuffin void df_disconnect(void);
24*8d489c7aSmuffin int df_dialer(char *, char *, int);
25*8d489c7aSmuffin
26*8d489c7aSmuffin int
df02_dialer(char * num,char * acu)27*8d489c7aSmuffin df02_dialer(char *num, char *acu)
287c478bd9Sstevel@tonic-gate {
297c478bd9Sstevel@tonic-gate
307c478bd9Sstevel@tonic-gate return (df_dialer(num, acu, 0));
317c478bd9Sstevel@tonic-gate }
327c478bd9Sstevel@tonic-gate
33*8d489c7aSmuffin int
df03_dialer(char * num,char * acu)34*8d489c7aSmuffin df03_dialer(char *num, char *acu)
357c478bd9Sstevel@tonic-gate {
367c478bd9Sstevel@tonic-gate
377c478bd9Sstevel@tonic-gate return (df_dialer(num, acu, 1));
387c478bd9Sstevel@tonic-gate }
397c478bd9Sstevel@tonic-gate
40*8d489c7aSmuffin /* ARGSUSED */
41*8d489c7aSmuffin int
df_dialer(char * num,char * acu,int df03)42*8d489c7aSmuffin df_dialer(char *num, char *acu, int df03)
437c478bd9Sstevel@tonic-gate {
44*8d489c7aSmuffin int f = FD;
457c478bd9Sstevel@tonic-gate struct termios buf;
467c478bd9Sstevel@tonic-gate int speed = 0;
477c478bd9Sstevel@tonic-gate char c = '\0';
487c478bd9Sstevel@tonic-gate
49*8d489c7aSmuffin (void) ioctl(f, TCGETS, &buf);
507c478bd9Sstevel@tonic-gate buf.c_cflag |= HUPCL;
51*8d489c7aSmuffin (void) ioctl(f, TCSETS, &buf);
527c478bd9Sstevel@tonic-gate if (sigsetjmp(Sjbuf, 1)) {
53*8d489c7aSmuffin (void) printf("connection timed out\r\n");
547c478bd9Sstevel@tonic-gate df_disconnect();
557c478bd9Sstevel@tonic-gate return (0);
567c478bd9Sstevel@tonic-gate }
577c478bd9Sstevel@tonic-gate if (boolean(value(VERBOSE)))
58*8d489c7aSmuffin (void) printf("\ndialing...");
59*8d489c7aSmuffin (void) fflush(stdout);
607c478bd9Sstevel@tonic-gate #ifdef TIOCMSET
617c478bd9Sstevel@tonic-gate if (df03) {
627c478bd9Sstevel@tonic-gate int st = TIOCM_ST; /* secondary Transmit flag */
637c478bd9Sstevel@tonic-gate
64*8d489c7aSmuffin (void) ioctl(f, TCGETS, &buf);
657c478bd9Sstevel@tonic-gate if (cfgetospeed(&buf) != B1200) { /* must dial at 1200 baud */
667c478bd9Sstevel@tonic-gate speed = cfgetospeed(&buf);
67*8d489c7aSmuffin (void) cfsetospeed(&buf, B0);
68*8d489c7aSmuffin (void) cfsetispeed(&buf, B0);
69*8d489c7aSmuffin (void) cfsetospeed(&buf, B1200);
70*8d489c7aSmuffin (void) ioctl(f, TCSETSW, &buf);
71*8d489c7aSmuffin /* clear ST for 300 baud */
72*8d489c7aSmuffin (void) ioctl(f, TIOCMBIC, &st);
737c478bd9Sstevel@tonic-gate } else
74*8d489c7aSmuffin /* set ST for 1200 baud */
75*8d489c7aSmuffin (void) ioctl(f, TIOCMBIS, &st);
767c478bd9Sstevel@tonic-gate }
777c478bd9Sstevel@tonic-gate #endif
78*8d489c7aSmuffin (void) signal(SIGALRM, (sig_handler_t)timeout);
79*8d489c7aSmuffin (void) alarm(5 * strlen(num) + 10);
80*8d489c7aSmuffin (void) ioctl(f, TCFLSH, TCOFLUSH);
81*8d489c7aSmuffin (void) write(f, "\001", 1);
82*8d489c7aSmuffin (void) sleep(1);
83*8d489c7aSmuffin (void) write(f, "\002", 1);
84*8d489c7aSmuffin (void) write(f, num, strlen(num));
85*8d489c7aSmuffin (void) read(f, &c, 1);
867c478bd9Sstevel@tonic-gate #ifdef TIOCMSET
877c478bd9Sstevel@tonic-gate if (df03 && speed) {
88*8d489c7aSmuffin (void) cfsetospeed(&buf, B0);
89*8d489c7aSmuffin (void) cfsetispeed(&buf, B0);
90*8d489c7aSmuffin (void) cfsetospeed(&buf, speed);
91*8d489c7aSmuffin (void) ioctl(f, TCSETSW, &buf);
927c478bd9Sstevel@tonic-gate }
937c478bd9Sstevel@tonic-gate #endif
947c478bd9Sstevel@tonic-gate return (c == 'A');
957c478bd9Sstevel@tonic-gate }
967c478bd9Sstevel@tonic-gate
97*8d489c7aSmuffin void
df_disconnect(void)98*8d489c7aSmuffin df_disconnect(void)
997c478bd9Sstevel@tonic-gate {
1007c478bd9Sstevel@tonic-gate
101*8d489c7aSmuffin (void) write(FD, "\001", 1);
102*8d489c7aSmuffin (void) sleep(1);
103*8d489c7aSmuffin (void) ioctl(FD, TCFLSH, TCOFLUSH);
1047c478bd9Sstevel@tonic-gate }
1057c478bd9Sstevel@tonic-gate
106*8d489c7aSmuffin void
df_abort(void)107*8d489c7aSmuffin df_abort(void)
1087c478bd9Sstevel@tonic-gate {
1097c478bd9Sstevel@tonic-gate
1107c478bd9Sstevel@tonic-gate df_disconnect();
1117c478bd9Sstevel@tonic-gate }
1127c478bd9Sstevel@tonic-gate
1137c478bd9Sstevel@tonic-gate
1147c478bd9Sstevel@tonic-gate static void
timeout(void)115*8d489c7aSmuffin timeout(void)
1167c478bd9Sstevel@tonic-gate {
1177c478bd9Sstevel@tonic-gate
1187c478bd9Sstevel@tonic-gate siglongjmp(Sjbuf, 1);
1197c478bd9Sstevel@tonic-gate }
120