1161754Sru/* $OpenBSD: biz22.c,v 1.13 2006/03/17 19:17:13 moritz Exp $ */ 288276Smarkm/* $NetBSD: biz22.c,v 1.6 1997/02/11 09:24:11 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[] = "@(#)biz22.c 8.1 (Berkeley) 6/6/93"; 39161754Srustatic const char rcsid[] = "$OpenBSD: biz22.c,v 1.13 2006/03/17 19:17:13 moritz Exp $"; 4088276Smarkm#endif 417527Sjkh#endif /* not lint */ 427527Sjkh 437527Sjkh#include "tip.h" 447527Sjkh 457527Sjkh#define DISCONNECT_CMD "\20\04" /* disconnection string */ 467527Sjkh 47161754Srustatic int dialtimeout = 0; 487527Sjkhstatic jmp_buf timeoutbuf; 497527Sjkh 50161754Srustatic int biz_dialer(char *, char *); 51161754Srustatic void sigALRM(int); 52161754Srustatic int cmd(char *); 53161754Srustatic int detect(char *); 5488276Smarkm 557527Sjkh/* 567527Sjkh * Dial up on a BIZCOMP Model 1022 with either 577527Sjkh * tone dialing (mod = "V") 587527Sjkh * pulse dialing (mod = "W") 597527Sjkh */ 607527Sjkhstatic int 61161754Srubiz_dialer(char *num, char *mod) 627527Sjkh{ 6388276Smarkm int connected = 0; 647527Sjkh char cbuf[40]; 657527Sjkh 667527Sjkh if (boolean(value(VERBOSE))) 677527Sjkh printf("\nstarting call..."); 687527Sjkh /* 697527Sjkh * Disable auto-answer and configure for tone/pulse 707527Sjkh * dialing 717527Sjkh */ 727527Sjkh if (cmd("\02K\r")) { 737527Sjkh printf("can't initialize bizcomp..."); 747527Sjkh return (0); 757527Sjkh } 76161754Sru (void)strlcpy(cbuf, "\02.\r", sizeof cbuf); 777527Sjkh cbuf[1] = *mod; 787527Sjkh if (cmd(cbuf)) { 797527Sjkh printf("can't set dialing mode..."); 807527Sjkh return (0); 817527Sjkh } 8288276Smarkm (void)snprintf(cbuf, sizeof(cbuf), "\02D%s\r", num); 837527Sjkh write(FD, cbuf, strlen(cbuf)); 847527Sjkh if (!detect("7\r")) { 857527Sjkh printf("can't get dial tone..."); 867527Sjkh return (0); 877527Sjkh } 887527Sjkh if (boolean(value(VERBOSE))) 897527Sjkh printf("ringing..."); 907527Sjkh /* 917527Sjkh * The reply from the BIZCOMP should be: 927527Sjkh * 2 \r or 7 \r failure 937527Sjkh * 1 \r success 947527Sjkh */ 957527Sjkh connected = detect("1\r"); 9688276Smarkm#ifdef ACULOG 97161754Sru if (dialtimeout) { 987527Sjkh char line[80]; 997527Sjkh 100161754Sru (void)snprintf(line, sizeof line, "%ld second dial timeout", 1017527Sjkh number(value(DIALTIMEOUT))); 1027527Sjkh logent(value(HOST), num, "biz1022", line); 1037527Sjkh } 1047527Sjkh#endif 105161754Sru if (dialtimeout) 1067527Sjkh biz22_disconnect(); /* insurance */ 1077527Sjkh return (connected); 1087527Sjkh} 1097527Sjkh 11088276Smarkmint 111161754Srubiz22w_dialer(char *num, char *acu) 1127527Sjkh{ 1137527Sjkh return (biz_dialer(num, "W")); 1147527Sjkh} 1157527Sjkh 11688276Smarkmint 117161754Srubiz22f_dialer(char *num, char *acu) 1187527Sjkh{ 1197527Sjkh return (biz_dialer(num, "V")); 1207527Sjkh} 1217527Sjkh 12288276Smarkmvoid 123161754Srubiz22_disconnect(void) 1247527Sjkh{ 125161754Sru write(FD, DISCONNECT_CMD, sizeof(DISCONNECT_CMD)-1); 1267527Sjkh sleep(2); 12788276Smarkm tcflush(FD, TCIOFLUSH); 1287527Sjkh} 1297527Sjkh 13088276Smarkmvoid 131161754Srubiz22_abort(void) 1327527Sjkh{ 1337527Sjkh write(FD, "\02", 1); 1347527Sjkh} 1357527Sjkh 136161754Sru/*ARGSUSED*/ 1377527Sjkhstatic void 138161754SrusigALRM(int signo) 1397527Sjkh{ 140161754Sru dialtimeout = 1; 1417527Sjkh longjmp(timeoutbuf, 1); 1427527Sjkh} 1437527Sjkh 1447527Sjkhstatic int 145161754Srucmd(char *s) 1467527Sjkh{ 1477527Sjkh sig_t f; 1487527Sjkh char c; 1497527Sjkh 1507527Sjkh write(FD, s, strlen(s)); 1517527Sjkh f = signal(SIGALRM, sigALRM); 1527527Sjkh if (setjmp(timeoutbuf)) { 1537527Sjkh biz22_abort(); 1547527Sjkh signal(SIGALRM, f); 1557527Sjkh return (1); 1567527Sjkh } 1577527Sjkh alarm(number(value(DIALTIMEOUT))); 1587527Sjkh read(FD, &c, 1); 1597527Sjkh alarm(0); 1607527Sjkh signal(SIGALRM, f); 1617527Sjkh c &= 0177; 1627527Sjkh return (c != '\r'); 1637527Sjkh} 1647527Sjkh 1657527Sjkhstatic int 166161754Srudetect(char *s) 1677527Sjkh{ 1687527Sjkh sig_t f; 1697527Sjkh char c; 1707527Sjkh 1717527Sjkh f = signal(SIGALRM, sigALRM); 172161754Sru dialtimeout = 0; 1737527Sjkh while (*s) { 1747527Sjkh if (setjmp(timeoutbuf)) { 1757527Sjkh biz22_abort(); 1767527Sjkh break; 1777527Sjkh } 1787527Sjkh alarm(number(value(DIALTIMEOUT))); 1797527Sjkh read(FD, &c, 1); 1807527Sjkh alarm(0); 1817527Sjkh c &= 0177; 1827527Sjkh if (c != *s++) 1837527Sjkh return (0); 1847527Sjkh } 1857527Sjkh signal(SIGALRM, f); 186161754Sru return (dialtimeout == 0); 1877527Sjkh} 188