xref: /freebsd/usr.bin/tip/libacu/v831.c (revision 5e3934b15a2741b2de6b217e77dc9d798d740804)
1fa92e883SRuslan Ermilov /*	$OpenBSD: v831.c,v 1.11 2006/03/17 19:17:13 moritz Exp $	*/
20f3bdf5dSMark Murray /*	$NetBSD: v831.c,v 1.5 1996/12/29 10:42:01 cgd Exp $	*/
30f3bdf5dSMark Murray 
4*8a16b7a1SPedro F. Giffuni /*-
5*8a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
6*8a16b7a1SPedro F. Giffuni  *
718cc36fbSJordan K. Hubbard  * Copyright (c) 1983, 1993
818cc36fbSJordan K. Hubbard  *	The Regents of the University of California.  All rights reserved.
918cc36fbSJordan K. Hubbard  *
1018cc36fbSJordan K. Hubbard  * Redistribution and use in source and binary forms, with or without
1118cc36fbSJordan K. Hubbard  * modification, are permitted provided that the following conditions
1218cc36fbSJordan K. Hubbard  * are met:
1318cc36fbSJordan K. Hubbard  * 1. Redistributions of source code must retain the above copyright
1418cc36fbSJordan K. Hubbard  *    notice, this list of conditions and the following disclaimer.
1518cc36fbSJordan K. Hubbard  * 2. Redistributions in binary form must reproduce the above copyright
1618cc36fbSJordan K. Hubbard  *    notice, this list of conditions and the following disclaimer in the
1718cc36fbSJordan K. Hubbard  *    documentation and/or other materials provided with the distribution.
18fa92e883SRuslan Ermilov  * 3. Neither the name of the University nor the names of its contributors
1918cc36fbSJordan K. Hubbard  *    may be used to endorse or promote products derived from this software
2018cc36fbSJordan K. Hubbard  *    without specific prior written permission.
2118cc36fbSJordan K. Hubbard  *
2218cc36fbSJordan K. Hubbard  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2318cc36fbSJordan K. Hubbard  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2418cc36fbSJordan K. Hubbard  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2518cc36fbSJordan K. Hubbard  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2618cc36fbSJordan K. Hubbard  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2718cc36fbSJordan K. Hubbard  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2818cc36fbSJordan K. Hubbard  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2918cc36fbSJordan K. Hubbard  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3018cc36fbSJordan K. Hubbard  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3118cc36fbSJordan K. Hubbard  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3218cc36fbSJordan K. Hubbard  * SUCH DAMAGE.
3318cc36fbSJordan K. Hubbard  */
3418cc36fbSJordan K. Hubbard 
3518cc36fbSJordan K. Hubbard /*
3618cc36fbSJordan K. Hubbard  * Routines for dialing up on Vadic 831
3718cc36fbSJordan K. Hubbard  */
3818cc36fbSJordan K. Hubbard #include "tip.h"
390f3bdf5dSMark Murray #include <termios.h>
4018cc36fbSJordan K. Hubbard 
4118cc36fbSJordan K. Hubbard static jmp_buf jmpbuf;
42fa92e883SRuslan Ermilov static pid_t child = -1;
43fa92e883SRuslan Ermilov 
44fa92e883SRuslan Ermilov static void	alarmtr(int);
45fa92e883SRuslan Ermilov static int	dialit(char *, char *);
46fa92e883SRuslan Ermilov static char *	sanitize(char *);
4718cc36fbSJordan K. Hubbard 
480f3bdf5dSMark Murray int
v831_dialer(char * num,char * acu)49fa92e883SRuslan Ermilov v831_dialer(char *num, char *acu)
5018cc36fbSJordan K. Hubbard {
51fa92e883SRuslan Ermilov         int status;
520f3bdf5dSMark Murray         int timelim;
53fa92e883SRuslan Ermilov 	pid_t pid;
5418cc36fbSJordan K. Hubbard 
5518cc36fbSJordan K. Hubbard         if (boolean(value(VERBOSE)))
5618cc36fbSJordan K. Hubbard                 printf("\nstarting call...");
5718cc36fbSJordan K. Hubbard #ifdef DEBUG
5818cc36fbSJordan K. Hubbard         printf ("(acu=%s)\n", acu);
5918cc36fbSJordan K. Hubbard #endif
6018cc36fbSJordan K. Hubbard         if ((AC = open(acu, O_RDWR)) < 0) {
6118cc36fbSJordan K. Hubbard                 if (errno == EBUSY)
6218cc36fbSJordan K. Hubbard                         printf("line busy...");
6318cc36fbSJordan K. Hubbard                 else
6418cc36fbSJordan K. Hubbard                         printf("acu open error...");
6518cc36fbSJordan K. Hubbard                 return (0);
6618cc36fbSJordan K. Hubbard         }
6718cc36fbSJordan K. Hubbard         if (setjmp(jmpbuf)) {
6818cc36fbSJordan K. Hubbard                 kill(child, SIGKILL);
6918cc36fbSJordan K. Hubbard                 close(AC);
7018cc36fbSJordan K. Hubbard                 return (0);
7118cc36fbSJordan K. Hubbard         }
7218cc36fbSJordan K. Hubbard         signal(SIGALRM, alarmtr);
7318cc36fbSJordan K. Hubbard         timelim = 5 * strlen(num);
7418cc36fbSJordan K. Hubbard         alarm(timelim < 30 ? 30 : timelim);
7518cc36fbSJordan K. Hubbard         if ((child = fork()) == 0) {
7618cc36fbSJordan K. Hubbard                 /*
7718cc36fbSJordan K. Hubbard                  * ignore this stuff for aborts
7818cc36fbSJordan K. Hubbard                  */
7918cc36fbSJordan K. Hubbard                 signal(SIGALRM, SIG_IGN);
8018cc36fbSJordan K. Hubbard 		signal(SIGINT, SIG_IGN);
8118cc36fbSJordan K. Hubbard                 signal(SIGQUIT, SIG_IGN);
8218cc36fbSJordan K. Hubbard                 sleep(2);
8318cc36fbSJordan K. Hubbard                 exit(dialit(num, acu) != 'A');
8418cc36fbSJordan K. Hubbard         }
8518cc36fbSJordan K. Hubbard         /*
8618cc36fbSJordan K. Hubbard          * open line - will return on carrier
8718cc36fbSJordan K. Hubbard          */
8818cc36fbSJordan K. Hubbard         if ((FD = open(DV, O_RDWR)) < 0) {
8918cc36fbSJordan K. Hubbard #ifdef DEBUG
9018cc36fbSJordan K. Hubbard                 printf("(after open, errno=%d)\n", errno);
9118cc36fbSJordan K. Hubbard #endif
9218cc36fbSJordan K. Hubbard                 if (errno == EIO)
9318cc36fbSJordan K. Hubbard                         printf("lost carrier...");
9418cc36fbSJordan K. Hubbard                 else
9518cc36fbSJordan K. Hubbard                         printf("dialup line open failed...");
9618cc36fbSJordan K. Hubbard                 alarm(0);
9718cc36fbSJordan K. Hubbard                 kill(child, SIGKILL);
9818cc36fbSJordan K. Hubbard                 close(AC);
9918cc36fbSJordan K. Hubbard                 return (0);
10018cc36fbSJordan K. Hubbard         }
10118cc36fbSJordan K. Hubbard         alarm(0);
10218cc36fbSJordan K. Hubbard         signal(SIGALRM, SIG_DFL);
10318cc36fbSJordan K. Hubbard         while ((pid = wait(&status)) != child && pid != -1)
10418cc36fbSJordan K. Hubbard                 ;
10518cc36fbSJordan K. Hubbard         if (status) {
10618cc36fbSJordan K. Hubbard                 close(AC);
10718cc36fbSJordan K. Hubbard                 return (0);
10818cc36fbSJordan K. Hubbard         }
10918cc36fbSJordan K. Hubbard         return (1);
11018cc36fbSJordan K. Hubbard }
11118cc36fbSJordan K. Hubbard 
112fa92e883SRuslan Ermilov /*ARGSUSED*/
11318cc36fbSJordan K. Hubbard static void
alarmtr(int signo)114fa92e883SRuslan Ermilov alarmtr(int signo)
11518cc36fbSJordan K. Hubbard {
11618cc36fbSJordan K. Hubbard         alarm(0);
11718cc36fbSJordan K. Hubbard         longjmp(jmpbuf, 1);
11818cc36fbSJordan K. Hubbard }
11918cc36fbSJordan K. Hubbard 
12018cc36fbSJordan K. Hubbard /*
12118cc36fbSJordan K. Hubbard  * Insurance, for some reason we don't seem to be
12218cc36fbSJordan K. Hubbard  *  hanging up...
12318cc36fbSJordan K. Hubbard  */
1240f3bdf5dSMark Murray void
v831_disconnect(void)125fa92e883SRuslan Ermilov v831_disconnect(void)
12618cc36fbSJordan K. Hubbard {
1270f3bdf5dSMark Murray 	struct termios	cntrl;
1280f3bdf5dSMark Murray 
12918cc36fbSJordan K. Hubbard         sleep(2);
13018cc36fbSJordan K. Hubbard #ifdef DEBUG
13118cc36fbSJordan K. Hubbard         printf("[disconnect: FD=%d]\n", FD);
13218cc36fbSJordan K. Hubbard #endif
13318cc36fbSJordan K. Hubbard         if (FD > 0) {
13418cc36fbSJordan K. Hubbard                 ioctl(FD, TIOCCDTR, 0);
1350f3bdf5dSMark Murray 		tcgetattr(FD, &cntrl);
1360f3bdf5dSMark Murray 		cfsetospeed(&cntrl, 0);
1370f3bdf5dSMark Murray 		cfsetispeed(&cntrl, 0);
1380f3bdf5dSMark Murray 		tcsetattr(FD, TCSAFLUSH, &cntrl);
1390f3bdf5dSMark Murray                 ioctl(FD, TIOCNXCL, NULL);
14018cc36fbSJordan K. Hubbard         }
14118cc36fbSJordan K. Hubbard         close(FD);
14218cc36fbSJordan K. Hubbard }
14318cc36fbSJordan K. Hubbard 
1440f3bdf5dSMark Murray void
v831_abort(void)145fa92e883SRuslan Ermilov v831_abort(void)
14618cc36fbSJordan K. Hubbard {
14718cc36fbSJordan K. Hubbard #ifdef DEBUG
14818cc36fbSJordan K. Hubbard         printf("[abort: AC=%d]\n", AC);
14918cc36fbSJordan K. Hubbard #endif
15018cc36fbSJordan K. Hubbard         sleep(2);
15118cc36fbSJordan K. Hubbard         if (child > 0)
15218cc36fbSJordan K. Hubbard                 kill(child, SIGKILL);
153fa92e883SRuslan Ermilov         if (FD > 0)
1540f3bdf5dSMark Murray                 ioctl(FD, TIOCNXCL, NULL);
15518cc36fbSJordan K. Hubbard         close(AC);
15618cc36fbSJordan K. Hubbard         if (FD > 0)
15718cc36fbSJordan K. Hubbard                 ioctl(FD, TIOCCDTR, 0);
15818cc36fbSJordan K. Hubbard         close(FD);
15918cc36fbSJordan K. Hubbard }
16018cc36fbSJordan K. Hubbard 
16118cc36fbSJordan K. Hubbard /*
16218cc36fbSJordan K. Hubbard  * Sigh, this probably must be changed at each site.
16318cc36fbSJordan K. Hubbard  */
16418cc36fbSJordan K. Hubbard struct vaconfig {
16518cc36fbSJordan K. Hubbard 	char	*vc_name;
16618cc36fbSJordan K. Hubbard 	char	vc_rack;
16718cc36fbSJordan K. Hubbard 	char	vc_modem;
16818cc36fbSJordan K. Hubbard } vaconfig[] = {
16918cc36fbSJordan K. Hubbard 	{ "/dev/cua0",'4','0' },
17018cc36fbSJordan K. Hubbard 	{ "/dev/cua1",'4','1' },
17107bb01e3SRuslan Ermilov 	{ NULL, '\0', '\0' }
17218cc36fbSJordan K. Hubbard };
17318cc36fbSJordan K. Hubbard 
17418cc36fbSJordan K. Hubbard #define pc(x)	(c = x, write(AC,&c,1))
17518cc36fbSJordan K. Hubbard #define ABORT	01
17618cc36fbSJordan K. Hubbard #define SI	017
17718cc36fbSJordan K. Hubbard #define STX	02
17818cc36fbSJordan K. Hubbard #define ETX	03
17918cc36fbSJordan K. Hubbard 
18018cc36fbSJordan K. Hubbard static int
dialit(char * phonenum,char * acu)181fa92e883SRuslan Ermilov dialit(char *phonenum, char *acu)
18218cc36fbSJordan K. Hubbard {
1830f3bdf5dSMark Murray         struct vaconfig *vp;
1840f3bdf5dSMark Murray 	struct termios cntrl;
18518cc36fbSJordan K. Hubbard         char c;
1860f3bdf5dSMark Murray         int i;
18718cc36fbSJordan K. Hubbard 
18818cc36fbSJordan K. Hubbard         phonenum = sanitize(phonenum);
18918cc36fbSJordan K. Hubbard #ifdef DEBUG
19018cc36fbSJordan K. Hubbard         printf ("(dial phonenum=%s)\n", phonenum);
19118cc36fbSJordan K. Hubbard #endif
19218cc36fbSJordan K. Hubbard         if (*phonenum == '<' && phonenum[1] == 0)
19318cc36fbSJordan K. Hubbard                 return ('Z');
19418cc36fbSJordan K. Hubbard 	for (vp = vaconfig; vp->vc_name; vp++)
19518cc36fbSJordan K. Hubbard 		if (strcmp(vp->vc_name, acu) == 0)
19618cc36fbSJordan K. Hubbard 			break;
19718cc36fbSJordan K. Hubbard 	if (vp->vc_name == 0) {
19818cc36fbSJordan K. Hubbard 		printf("Unable to locate dialer (%s)\n", acu);
19918cc36fbSJordan K. Hubbard 		return ('K');
20018cc36fbSJordan K. Hubbard 	}
2010f3bdf5dSMark Murray 	tcgetattr(AC, &cntrl);
2020f3bdf5dSMark Murray 	cfsetospeed(&cntrl, B2400);
2030f3bdf5dSMark Murray 	cfsetispeed(&cntrl, B2400);
2040f3bdf5dSMark Murray 	cntrl.c_cflag |= PARODD | PARENB;
2050f3bdf5dSMark Murray 	cntrl.c_lflag &= ~(ISIG | ICANON);
2060f3bdf5dSMark Murray 	tcsetattr(AC, TCSANOW, &cntrl);
2070f3bdf5dSMark Murray 	tcflush(AC, TCIOFLUSH);
20818cc36fbSJordan K. Hubbard         pc(STX);
20918cc36fbSJordan K. Hubbard 	pc(vp->vc_rack);
21018cc36fbSJordan K. Hubbard 	pc(vp->vc_modem);
21118cc36fbSJordan K. Hubbard 	while (*phonenum && *phonenum != '<')
21218cc36fbSJordan K. Hubbard 		pc(*phonenum++);
21318cc36fbSJordan K. Hubbard         pc(SI);
21418cc36fbSJordan K. Hubbard 	pc(ETX);
21518cc36fbSJordan K. Hubbard         sleep(1);
21618cc36fbSJordan K. Hubbard         i = read(AC, &c, 1);
21718cc36fbSJordan K. Hubbard #ifdef DEBUG
21818cc36fbSJordan K. Hubbard         printf("read %d chars, char=%c, errno %d\n", i, c, errno);
21918cc36fbSJordan K. Hubbard #endif
22018cc36fbSJordan K. Hubbard         if (i != 1)
22118cc36fbSJordan K. Hubbard 		c = 'M';
22218cc36fbSJordan K. Hubbard         if (c == 'B' || c == 'G') {
22318cc36fbSJordan K. Hubbard                 char cc, oc = c;
22418cc36fbSJordan K. Hubbard 
22518cc36fbSJordan K. Hubbard                 pc(ABORT);
22618cc36fbSJordan K. Hubbard                 read(AC, &cc, 1);
22718cc36fbSJordan K. Hubbard #ifdef DEBUG
22818cc36fbSJordan K. Hubbard                 printf("abort response=%c\n", cc);
22918cc36fbSJordan K. Hubbard #endif
23018cc36fbSJordan K. Hubbard                 c = oc;
23118cc36fbSJordan K. Hubbard                 v831_disconnect();
23218cc36fbSJordan K. Hubbard         }
23318cc36fbSJordan K. Hubbard         close(AC);
23418cc36fbSJordan K. Hubbard #ifdef DEBUG
23518cc36fbSJordan K. Hubbard         printf("dialit: returns %c\n", c);
23618cc36fbSJordan K. Hubbard #endif
23718cc36fbSJordan K. Hubbard         return (c);
23818cc36fbSJordan K. Hubbard }
23918cc36fbSJordan K. Hubbard 
24018cc36fbSJordan K. Hubbard static char *
sanitize(char * s)241fa92e883SRuslan Ermilov sanitize(char *s)
24218cc36fbSJordan K. Hubbard {
24318cc36fbSJordan K. Hubbard         static char buf[128];
2440f3bdf5dSMark Murray         char *cp;
24518cc36fbSJordan K. Hubbard 
24618cc36fbSJordan K. Hubbard         for (cp = buf; *s; s++) {
24718cc36fbSJordan K. Hubbard 		if (!isdigit(*s) && *s == '<' && *s != '_')
24818cc36fbSJordan K. Hubbard 			continue;
24918cc36fbSJordan K. Hubbard 		if (*s == '_')
25018cc36fbSJordan K. Hubbard 			*s = '=';
25118cc36fbSJordan K. Hubbard 		*cp++ = *s;
25218cc36fbSJordan K. Hubbard 	}
25318cc36fbSJordan K. Hubbard         *cp++ = 0;
25418cc36fbSJordan K. Hubbard         return (buf);
25518cc36fbSJordan K. Hubbard }
256