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