1 1.9 christos /* $NetBSD: df.c,v 1.10 2006/12/14 17:09:43 christos Exp $ */ 2 1.3 jtc 3 1.1 cgd /* 4 1.3 jtc * Copyright (c) 1983, 1993 5 1.3 jtc * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.6 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd */ 31 1.1 cgd 32 1.5 lukem #include <sys/cdefs.h> 33 1.1 cgd #ifndef lint 34 1.3 jtc #if 0 35 1.3 jtc static char sccsid[] = "@(#)df.c 8.1 (Berkeley) 6/6/93"; 36 1.3 jtc #endif 37 1.9 christos __RCSID("$NetBSD: df.c,v 1.10 2006/12/14 17:09:43 christos Exp $"); 38 1.1 cgd #endif /* not lint */ 39 1.1 cgd 40 1.1 cgd /* 41 1.1 cgd * Dial the DF02-AC or DF03-AC 42 1.1 cgd */ 43 1.1 cgd 44 1.1 cgd #include "tip.h" 45 1.1 cgd 46 1.1 cgd static jmp_buf Sjbuf; 47 1.1 cgd 48 1.8 perry static int df_dialer(char *, char *, int); 49 1.8 perry static void timeout(int); 50 1.5 lukem 51 1.5 lukem int 52 1.8 perry df02_dialer(char *num, char *acu) 53 1.1 cgd { 54 1.1 cgd 55 1.1 cgd return (df_dialer(num, acu, 0)); 56 1.1 cgd } 57 1.1 cgd 58 1.5 lukem int 59 1.8 perry df03_dialer(char *num, char *acu) 60 1.1 cgd { 61 1.1 cgd 62 1.1 cgd return (df_dialer(num, acu, 1)); 63 1.1 cgd } 64 1.1 cgd 65 1.5 lukem static int 66 1.10 christos /*ARGSUSED*/ 67 1.10 christos df_dialer(char *num, char *acu __unused, int df03) 68 1.1 cgd { 69 1.5 lukem int f = FD; 70 1.4 pk struct termios cntrl; 71 1.10 christos speed_t volatile spd; 72 1.9 christos char c; 73 1.5 lukem 74 1.9 christos spd = 0; 75 1.9 christos c = '\0'; 76 1.10 christos (void)tcgetattr(f, &cntrl); 77 1.4 pk cntrl.c_cflag |= HUPCL; 78 1.10 christos (void)tcsetattr(f, TCSANOW, &cntrl); 79 1.1 cgd if (setjmp(Sjbuf)) { 80 1.10 christos (void)printf("connection timed out\r\n"); 81 1.1 cgd df_disconnect(); 82 1.1 cgd return (0); 83 1.1 cgd } 84 1.1 cgd if (boolean(value(VERBOSE))) 85 1.10 christos (void)printf("\ndialing..."); 86 1.10 christos (void)fflush(stdout); 87 1.1 cgd #ifdef TIOCMSET 88 1.1 cgd if (df03) { 89 1.1 cgd int st = TIOCM_ST; /* secondary Transmit flag */ 90 1.1 cgd 91 1.10 christos (void)tcgetattr(f, &cntrl); 92 1.7 christos spd = cfgetospeed(&cntrl); 93 1.7 christos if (spd != B1200) { /* must dial at 1200 baud */ 94 1.10 christos (void)cfsetospeed(&cntrl, B1200); 95 1.10 christos (void)cfsetispeed(&cntrl, B1200); 96 1.10 christos (void)tcsetattr(f, TCSAFLUSH, &cntrl); 97 1.10 christos (void)ioctl(f, TIOCMBIC, &st); /* clear ST for 300 baud */ 98 1.1 cgd } else 99 1.10 christos (void)ioctl(f, TIOCMBIS, &st); /* set ST for 1200 baud */ 100 1.1 cgd } 101 1.1 cgd #endif 102 1.10 christos (void)signal(SIGALRM, timeout); 103 1.10 christos (void)alarm(5 * strlen(num) + 10); 104 1.10 christos (void)tcflush(f, TCIOFLUSH); 105 1.10 christos (void)write(f, "\001", 1); 106 1.10 christos (void)sleep(1); 107 1.10 christos (void)write(f, "\002", 1); 108 1.10 christos (void)write(f, num, strlen(num)); 109 1.10 christos (void)read(f, &c, 1); 110 1.1 cgd #ifdef TIOCMSET 111 1.7 christos if (df03 && spd != B1200) { 112 1.10 christos (void)cfsetospeed(&cntrl, spd); 113 1.10 christos (void)cfsetispeed(&cntrl, spd); 114 1.10 christos (void)tcsetattr(f, TCSAFLUSH, &cntrl); 115 1.1 cgd } 116 1.1 cgd #endif 117 1.1 cgd return (c == 'A'); 118 1.1 cgd } 119 1.1 cgd 120 1.5 lukem void 121 1.8 perry df_disconnect(void) 122 1.1 cgd { 123 1.1 cgd 124 1.10 christos (void)write(FD, "\001", 1); 125 1.10 christos (void)sleep(1); 126 1.10 christos (void)tcflush(FD, TCIOFLUSH); 127 1.1 cgd } 128 1.1 cgd 129 1.1 cgd 130 1.5 lukem void 131 1.8 perry df_abort(void) 132 1.1 cgd { 133 1.1 cgd 134 1.1 cgd df_disconnect(); 135 1.1 cgd } 136 1.1 cgd 137 1.1 cgd 138 1.1 cgd static void 139 1.10 christos /*ARGSUSED*/ 140 1.10 christos timeout(int dummy __unused) 141 1.1 cgd { 142 1.1 cgd 143 1.1 cgd longjmp(Sjbuf, 1); 144 1.1 cgd } 145