1161754Sru/* $OpenBSD: df.c,v 1.9 2006/03/17 19:17:13 moritz Exp $ */ 288276Smarkm/* $NetBSD: df.c,v 1.4 1995/10/29 00:49:51 pk Exp $ */ 388276Smarkm 47527Sjkh/* 57527Sjkh * Copyright (c) 1983, 1993 67527Sjkh * The Regents of the University of California. All rights reserved. 77527Sjkh * 87527Sjkh * Redistribution and use in source and binary forms, with or without 97527Sjkh * modification, are permitted provided that the following conditions 107527Sjkh * are met: 117527Sjkh * 1. Redistributions of source code must retain the above copyright 127527Sjkh * notice, this list of conditions and the following disclaimer. 137527Sjkh * 2. Redistributions in binary form must reproduce the above copyright 147527Sjkh * notice, this list of conditions and the following disclaimer in the 157527Sjkh * documentation and/or other materials provided with the distribution. 16161754Sru * 3. Neither the name of the University nor the names of its contributors 177527Sjkh * may be used to endorse or promote products derived from this software 187527Sjkh * without specific prior written permission. 197527Sjkh * 207527Sjkh * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 217527Sjkh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 227527Sjkh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 237527Sjkh * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 247527Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 257527Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 267527Sjkh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 277527Sjkh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 287527Sjkh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 297527Sjkh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 307527Sjkh * SUCH DAMAGE. 317527Sjkh */ 327527Sjkh 3388276Smarkm#include <sys/cdefs.h> 3488276Smarkm__FBSDID("$FreeBSD$"); 3588276Smarkm 367527Sjkh#ifndef lint 3788276Smarkm#if 0 387527Sjkhstatic char sccsid[] = "@(#)df.c 8.1 (Berkeley) 6/6/93"; 39161754Srustatic const char rcsid[] = "$OpenBSD: df.c,v 1.9 2006/03/17 19:17:13 moritz Exp $"; 4088276Smarkm#endif 417527Sjkh#endif /* not lint */ 427527Sjkh 437527Sjkh/* 447527Sjkh * Dial the DF02-AC or DF03-AC 457527Sjkh */ 467527Sjkh 477527Sjkh#include "tip.h" 487527Sjkh 497527Sjkhstatic jmp_buf Sjbuf; 507527Sjkh 51161754Srustatic int df_dialer(char *, char *, int); 52161754Srustatic void alrm_timeout(int); 53161754Sru 5488276Smarkmint 55161754Srudf02_dialer(char *num, char *acu) 567527Sjkh{ 577527Sjkh return (df_dialer(num, acu, 0)); 587527Sjkh} 597527Sjkh 6088276Smarkmint 61161754Srudf03_dialer(char *num, char *acu) 627527Sjkh{ 637527Sjkh return (df_dialer(num, acu, 1)); 647527Sjkh} 657527Sjkh 66161754Srustatic int 67161754Srudf_dialer(char *num, char *acu, int df03) 687527Sjkh{ 6988276Smarkm int f = FD; 7088276Smarkm struct termios cntrl; 7188276Smarkm int speed = 0; 727527Sjkh char c = '\0'; 737527Sjkh 7488276Smarkm tcgetattr(f, &cntrl); 7588276Smarkm cntrl.c_cflag |= HUPCL; 7688276Smarkm tcsetattr(f, TCSANOW, &cntrl); 777527Sjkh if (setjmp(Sjbuf)) { 787527Sjkh printf("connection timed out\r\n"); 797527Sjkh df_disconnect(); 807527Sjkh return (0); 817527Sjkh } 827527Sjkh if (boolean(value(VERBOSE))) 837527Sjkh printf("\ndialing..."); 847527Sjkh fflush(stdout); 857527Sjkh#ifdef TIOCMSET 867527Sjkh if (df03) { 877527Sjkh int st = TIOCM_ST; /* secondary Transmit flag */ 887527Sjkh 8988276Smarkm tcgetattr(f, &cntrl); 9088276Smarkm speed = cfgetospeed(&cntrl); 9188276Smarkm if (speed != B1200) { /* must dial at 1200 baud */ 9288276Smarkm cfsetospeed(&cntrl, B1200); 9388276Smarkm cfsetispeed(&cntrl, B1200); 9488276Smarkm tcsetattr(f, TCSAFLUSH, &cntrl); 957527Sjkh ioctl(f, TIOCMBIC, &st); /* clear ST for 300 baud */ 967527Sjkh } else 977527Sjkh ioctl(f, TIOCMBIS, &st); /* set ST for 1200 baud */ 987527Sjkh } 997527Sjkh#endif 100161754Sru signal(SIGALRM, alrm_timeout); 1017527Sjkh alarm(5 * strlen(num) + 10); 10288276Smarkm tcflush(f, TCIOFLUSH); 1037527Sjkh write(f, "\001", 1); 1047527Sjkh sleep(1); 1057527Sjkh write(f, "\002", 1); 1067527Sjkh write(f, num, strlen(num)); 1077527Sjkh read(f, &c, 1); 1087527Sjkh#ifdef TIOCMSET 10988276Smarkm if (df03 && speed != B1200) { 11088276Smarkm cfsetospeed(&cntrl, speed); 11188276Smarkm cfsetispeed(&cntrl, speed); 11288276Smarkm tcsetattr(f, TCSAFLUSH, &cntrl); 1137527Sjkh } 1147527Sjkh#endif 1157527Sjkh return (c == 'A'); 1167527Sjkh} 1177527Sjkh 118161754Sruvoid 119113163Simpdf_disconnect(void) 1207527Sjkh{ 1217527Sjkh write(FD, "\001", 1); 1227527Sjkh sleep(1); 12388276Smarkm tcflush(FD, TCIOFLUSH); 1247527Sjkh} 1257527Sjkh 12688276Smarkmvoid 127161754Srudf_abort(void) 1287527Sjkh{ 1297527Sjkh df_disconnect(); 1307527Sjkh} 1317527Sjkh 132161754Sru/*ARGSUSED*/ 1337527Sjkhstatic void 134161754Srualrm_timeout(int signo) 1357527Sjkh{ 1367527Sjkh longjmp(Sjbuf, 1); 1377527Sjkh} 138