1161754Sru/* $OpenBSD: v3451.c,v 1.9 2006/03/17 19:17:13 moritz Exp $ */ 288276Smarkm/* $NetBSD: v3451.c,v 1.6 1997/02/11 09:24:20 mrg 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[] = "@(#)v3451.c 8.1 (Berkeley) 6/6/93"; 39161754Srustatic const char rcsid[] = "$OpenBSD: v3451.c,v 1.9 2006/03/17 19:17:13 moritz Exp $"; 4088276Smarkm#endif 417527Sjkh#endif /* not lint */ 427527Sjkh 437527Sjkh/* 447527Sjkh * Routines for calling up on a Vadic 3451 Modem 457527Sjkh */ 467527Sjkh#include "tip.h" 477527Sjkh 487527Sjkhstatic jmp_buf Sjbuf; 497527Sjkh 50161754Srustatic void vawrite(char *, int); 51161754Srustatic int expect(char *); 52161754Srustatic void alarmtr(int); 53161754Srustatic int notin(char *, char *); 54161754Srustatic int prefix(char *, char *); 5588276Smarkm 5688276Smarkmint 57161754Sruv3451_dialer(char *num, char *acu) 587527Sjkh{ 597527Sjkh sig_t func; 607527Sjkh int ok; 6188276Smarkm int slow = number(value(BAUDRATE)) < 1200; 627527Sjkh char phone[50]; 6388276Smarkm struct termios cntrl; 647527Sjkh 657527Sjkh /* 667527Sjkh * Get in synch 677527Sjkh */ 687527Sjkh vawrite("I\r", 1 + slow); 697527Sjkh vawrite("I\r", 1 + slow); 707527Sjkh vawrite("I\r", 1 + slow); 717527Sjkh vawrite("\005\r", 2 + slow); 727527Sjkh if (!expect("READY")) { 737527Sjkh printf("can't synchronize with vadic 3451\n"); 7488276Smarkm#ifdef ACULOG 757527Sjkh logent(value(HOST), num, "vadic", "can't synch up"); 767527Sjkh#endif 777527Sjkh return (0); 787527Sjkh } 7988276Smarkm tcgetattr(FD, &cntrl); 8088276Smarkm term.c_cflag |= HUPCL; 8188276Smarkm tcsetattr(FD, TCSANOW, &cntrl); 827527Sjkh sleep(1); 837527Sjkh vawrite("D\r", 2 + slow); 847527Sjkh if (!expect("NUMBER?")) { 857527Sjkh printf("Vadic will not accept dial command\n"); 8688276Smarkm#ifdef ACULOG 877527Sjkh logent(value(HOST), num, "vadic", "will not accept dial"); 887527Sjkh#endif 897527Sjkh return (0); 907527Sjkh } 9188276Smarkm (void)snprintf(phone, sizeof phone, "%s\r", num); 927527Sjkh vawrite(phone, 1 + slow); 937527Sjkh if (!expect(phone)) { 947527Sjkh printf("Vadic will not accept phone number\n"); 9588276Smarkm#ifdef ACULOG 967527Sjkh logent(value(HOST), num, "vadic", "will not accept number"); 977527Sjkh#endif 987527Sjkh return (0); 997527Sjkh } 1007527Sjkh func = signal(SIGINT,SIG_IGN); 1017527Sjkh /* 1027527Sjkh * You cannot interrupt the Vadic when its dialing; 1037527Sjkh * even dropping DTR does not work (definitely a 1047527Sjkh * brain damaged design). 1057527Sjkh */ 1067527Sjkh vawrite("\r", 1 + slow); 1077527Sjkh vawrite("\r", 1 + slow); 1087527Sjkh if (!expect("DIALING:")) { 1097527Sjkh printf("Vadic failed to dial\n"); 11088276Smarkm#ifdef ACULOG 1117527Sjkh logent(value(HOST), num, "vadic", "failed to dial"); 1127527Sjkh#endif 1137527Sjkh return (0); 1147527Sjkh } 1157527Sjkh if (boolean(value(VERBOSE))) 1167527Sjkh printf("\ndialing..."); 1177527Sjkh ok = expect("ON LINE"); 1187527Sjkh signal(SIGINT, func); 1197527Sjkh if (!ok) { 1207527Sjkh printf("call failed\n"); 12188276Smarkm#ifdef ACULOG 1227527Sjkh logent(value(HOST), num, "vadic", "call failed"); 1237527Sjkh#endif 1247527Sjkh return (0); 1257527Sjkh } 12688276Smarkm tcflush(FD, TCIOFLUSH); 1277527Sjkh return (1); 1287527Sjkh} 1297527Sjkh 13088276Smarkmvoid 131161754Sruv3451_disconnect(void) 1327527Sjkh{ 1337527Sjkh close(FD); 1347527Sjkh} 1357527Sjkh 13688276Smarkmvoid 137161754Sruv3451_abort(void) 1387527Sjkh{ 1397527Sjkh close(FD); 1407527Sjkh} 1417527Sjkh 1427527Sjkhstatic void 143161754Sruvawrite(char *cp, int delay) 1447527Sjkh{ 1457527Sjkh for (; *cp; sleep(delay), cp++) 1467527Sjkh write(FD, cp, 1); 1477527Sjkh} 1487527Sjkh 14988276Smarkmstatic int 150161754Sruexpect(char *cp) 1517527Sjkh{ 1527527Sjkh char buf[300]; 15388276Smarkm char *rp = buf; 1547527Sjkh int timeout = 30, online = 0; 1557527Sjkh 1567527Sjkh if (strcmp(cp, "\"\"") == 0) 1577527Sjkh return (1); 1587527Sjkh *rp = 0; 1597527Sjkh /* 1607527Sjkh * If we are waiting for the Vadic to complete 1617527Sjkh * dialing and get a connection, allow more time 1627527Sjkh * Unfortunately, the Vadic times out 24 seconds after 1637527Sjkh * the last digit is dialed 1647527Sjkh */ 1657527Sjkh online = strcmp(cp, "ON LINE") == 0; 1667527Sjkh if (online) 1677527Sjkh timeout = number(value(DIALTIMEOUT)); 1687527Sjkh signal(SIGALRM, alarmtr); 1697527Sjkh if (setjmp(Sjbuf)) 1707527Sjkh return (0); 1717527Sjkh alarm(timeout); 1727527Sjkh while (notin(cp, buf) && rp < buf + sizeof (buf) - 1) { 1737527Sjkh if (online && notin("FAILED CALL", buf) == 0) 1747527Sjkh return (0); 1757527Sjkh if (read(FD, rp, 1) < 0) { 1767527Sjkh alarm(0); 1777527Sjkh return (0); 1787527Sjkh } 1797527Sjkh if (*rp &= 0177) 1807527Sjkh rp++; 1817527Sjkh *rp = '\0'; 1827527Sjkh } 1837527Sjkh alarm(0); 1847527Sjkh return (1); 1857527Sjkh} 1867527Sjkh 187161754Sru/*ARGSUSED*/ 1887527Sjkhstatic void 189161754Srualarmtr(int signo) 1907527Sjkh{ 1917527Sjkh longjmp(Sjbuf, 1); 1927527Sjkh} 1937527Sjkh 1947527Sjkhstatic int 195161754Srunotin(char *sh, char *lg) 1967527Sjkh{ 1977527Sjkh for (; *lg; lg++) 1987527Sjkh if (prefix(sh, lg)) 1997527Sjkh return (0); 2007527Sjkh return (1); 2017527Sjkh} 2027527Sjkh 20388276Smarkmstatic int 204161754Sruprefix(char *s1, char *s2) 2057527Sjkh{ 20688276Smarkm char c; 2077527Sjkh 2087527Sjkh while ((c = *s1++) == *s2++) 2097527Sjkh if (c == '\0') 2107527Sjkh return (1); 2117527Sjkh return (c == '\0'); 2127527Sjkh} 213