xref: /freebsd/usr.bin/tip/libacu/v831.c (revision 18cc36fb1529054315fcf332ccbec997f43fc507)
118cc36fbSJordan K. Hubbard /*
218cc36fbSJordan K. Hubbard  * Copyright (c) 1983, 1993
318cc36fbSJordan K. Hubbard  *	The Regents of the University of California.  All rights reserved.
418cc36fbSJordan K. Hubbard  *
518cc36fbSJordan K. Hubbard  * Redistribution and use in source and binary forms, with or without
618cc36fbSJordan K. Hubbard  * modification, are permitted provided that the following conditions
718cc36fbSJordan K. Hubbard  * are met:
818cc36fbSJordan K. Hubbard  * 1. Redistributions of source code must retain the above copyright
918cc36fbSJordan K. Hubbard  *    notice, this list of conditions and the following disclaimer.
1018cc36fbSJordan K. Hubbard  * 2. Redistributions in binary form must reproduce the above copyright
1118cc36fbSJordan K. Hubbard  *    notice, this list of conditions and the following disclaimer in the
1218cc36fbSJordan K. Hubbard  *    documentation and/or other materials provided with the distribution.
1318cc36fbSJordan K. Hubbard  * 3. All advertising materials mentioning features or use of this software
1418cc36fbSJordan K. Hubbard  *    must display the following acknowledgement:
1518cc36fbSJordan K. Hubbard  *	This product includes software developed by the University of
1618cc36fbSJordan K. Hubbard  *	California, Berkeley and its contributors.
1718cc36fbSJordan K. Hubbard  * 4. Neither the name of the University nor the names of its contributors
1818cc36fbSJordan K. Hubbard  *    may be used to endorse or promote products derived from this software
1918cc36fbSJordan K. Hubbard  *    without specific prior written permission.
2018cc36fbSJordan K. Hubbard  *
2118cc36fbSJordan K. Hubbard  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2218cc36fbSJordan K. Hubbard  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2318cc36fbSJordan K. Hubbard  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2418cc36fbSJordan K. Hubbard  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2518cc36fbSJordan K. Hubbard  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2618cc36fbSJordan K. Hubbard  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2718cc36fbSJordan K. Hubbard  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2818cc36fbSJordan K. Hubbard  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2918cc36fbSJordan K. Hubbard  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3018cc36fbSJordan K. Hubbard  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3118cc36fbSJordan K. Hubbard  * SUCH DAMAGE.
3218cc36fbSJordan K. Hubbard  */
3318cc36fbSJordan K. Hubbard 
3418cc36fbSJordan K. Hubbard #ifndef lint
3518cc36fbSJordan K. Hubbard static char sccsid[] = "@(#)v831.c	8.1 (Berkeley) 6/6/93";
3618cc36fbSJordan K. Hubbard #endif /* not lint */
3718cc36fbSJordan K. Hubbard 
3818cc36fbSJordan K. Hubbard /*
3918cc36fbSJordan K. Hubbard  * Routines for dialing up on Vadic 831
4018cc36fbSJordan K. Hubbard  */
4118cc36fbSJordan K. Hubbard #include "tipconf.h"
4218cc36fbSJordan K. Hubbard #include "tip.h"
4318cc36fbSJordan K. Hubbard 
4418cc36fbSJordan K. Hubbard int	v831_abort();
4518cc36fbSJordan K. Hubbard static	void alarmtr();
4618cc36fbSJordan K. Hubbard extern	int errno;
4718cc36fbSJordan K. Hubbard 
4818cc36fbSJordan K. Hubbard static jmp_buf jmpbuf;
4918cc36fbSJordan K. Hubbard static int child = -1;
5018cc36fbSJordan K. Hubbard 
5118cc36fbSJordan K. Hubbard v831_dialer(num, acu)
5218cc36fbSJordan K. Hubbard         char *num, *acu;
5318cc36fbSJordan K. Hubbard {
5418cc36fbSJordan K. Hubbard         int status, pid, connected = 1;
5518cc36fbSJordan K. Hubbard         register int timelim;
5618cc36fbSJordan K. Hubbard 	static int dialit();
5718cc36fbSJordan K. Hubbard 
5818cc36fbSJordan K. Hubbard         if (boolean(value(VERBOSE)))
5918cc36fbSJordan K. Hubbard                 printf("\nstarting call...");
6018cc36fbSJordan K. Hubbard #ifdef DEBUG
6118cc36fbSJordan K. Hubbard         printf ("(acu=%s)\n", acu);
6218cc36fbSJordan K. Hubbard #endif
6318cc36fbSJordan K. Hubbard         if ((AC = open(acu, O_RDWR)) < 0) {
6418cc36fbSJordan K. Hubbard                 if (errno == EBUSY)
6518cc36fbSJordan K. Hubbard                         printf("line busy...");
6618cc36fbSJordan K. Hubbard                 else
6718cc36fbSJordan K. Hubbard                         printf("acu open error...");
6818cc36fbSJordan K. Hubbard                 return (0);
6918cc36fbSJordan K. Hubbard         }
7018cc36fbSJordan K. Hubbard         if (setjmp(jmpbuf)) {
7118cc36fbSJordan K. Hubbard                 kill(child, SIGKILL);
7218cc36fbSJordan K. Hubbard                 close(AC);
7318cc36fbSJordan K. Hubbard                 return (0);
7418cc36fbSJordan K. Hubbard         }
7518cc36fbSJordan K. Hubbard         signal(SIGALRM, alarmtr);
7618cc36fbSJordan K. Hubbard         timelim = 5 * strlen(num);
7718cc36fbSJordan K. Hubbard         alarm(timelim < 30 ? 30 : timelim);
7818cc36fbSJordan K. Hubbard         if ((child = fork()) == 0) {
7918cc36fbSJordan K. Hubbard                 /*
8018cc36fbSJordan K. Hubbard                  * ignore this stuff for aborts
8118cc36fbSJordan K. Hubbard                  */
8218cc36fbSJordan K. Hubbard                 signal(SIGALRM, SIG_IGN);
8318cc36fbSJordan K. Hubbard 		signal(SIGINT, SIG_IGN);
8418cc36fbSJordan K. Hubbard                 signal(SIGQUIT, SIG_IGN);
8518cc36fbSJordan K. Hubbard                 sleep(2);
8618cc36fbSJordan K. Hubbard                 exit(dialit(num, acu) != 'A');
8718cc36fbSJordan K. Hubbard         }
8818cc36fbSJordan K. Hubbard         /*
8918cc36fbSJordan K. Hubbard          * open line - will return on carrier
9018cc36fbSJordan K. Hubbard          */
9118cc36fbSJordan K. Hubbard         if ((FD = open(DV, O_RDWR)) < 0) {
9218cc36fbSJordan K. Hubbard #ifdef DEBUG
9318cc36fbSJordan K. Hubbard                 printf("(after open, errno=%d)\n", errno);
9418cc36fbSJordan K. Hubbard #endif
9518cc36fbSJordan K. Hubbard                 if (errno == EIO)
9618cc36fbSJordan K. Hubbard                         printf("lost carrier...");
9718cc36fbSJordan K. Hubbard                 else
9818cc36fbSJordan K. Hubbard                         printf("dialup line open failed...");
9918cc36fbSJordan K. Hubbard                 alarm(0);
10018cc36fbSJordan K. Hubbard                 kill(child, SIGKILL);
10118cc36fbSJordan K. Hubbard                 close(AC);
10218cc36fbSJordan K. Hubbard                 return (0);
10318cc36fbSJordan K. Hubbard         }
10418cc36fbSJordan K. Hubbard         alarm(0);
10518cc36fbSJordan K. Hubbard #ifdef notdef
10618cc36fbSJordan K. Hubbard         ioctl(AC, TIOCHPCL, 0);
10718cc36fbSJordan K. Hubbard #endif
10818cc36fbSJordan K. Hubbard         signal(SIGALRM, SIG_DFL);
10918cc36fbSJordan K. Hubbard         while ((pid = wait(&status)) != child && pid != -1)
11018cc36fbSJordan K. Hubbard                 ;
11118cc36fbSJordan K. Hubbard         if (status) {
11218cc36fbSJordan K. Hubbard                 close(AC);
11318cc36fbSJordan K. Hubbard                 return (0);
11418cc36fbSJordan K. Hubbard         }
11518cc36fbSJordan K. Hubbard         return (1);
11618cc36fbSJordan K. Hubbard }
11718cc36fbSJordan K. Hubbard 
11818cc36fbSJordan K. Hubbard static void
11918cc36fbSJordan K. Hubbard alarmtr()
12018cc36fbSJordan K. Hubbard {
12118cc36fbSJordan K. Hubbard         alarm(0);
12218cc36fbSJordan K. Hubbard         longjmp(jmpbuf, 1);
12318cc36fbSJordan K. Hubbard }
12418cc36fbSJordan K. Hubbard 
12518cc36fbSJordan K. Hubbard /*
12618cc36fbSJordan K. Hubbard  * Insurance, for some reason we don't seem to be
12718cc36fbSJordan K. Hubbard  *  hanging up...
12818cc36fbSJordan K. Hubbard  */
12918cc36fbSJordan K. Hubbard v831_disconnect()
13018cc36fbSJordan K. Hubbard {
13118cc36fbSJordan K. Hubbard         sleep(2);
13218cc36fbSJordan K. Hubbard #ifdef DEBUG
13318cc36fbSJordan K. Hubbard         printf("[disconnect: FD=%d]\n", FD);
13418cc36fbSJordan K. Hubbard #endif
13518cc36fbSJordan K. Hubbard         if (FD > 0) {
13618cc36fbSJordan K. Hubbard                 ioctl(FD, TIOCCDTR, 0);
13718cc36fbSJordan K. Hubbard 								acu_setspeec (0);
13818cc36fbSJordan K. Hubbard                 ioctl(FD, TIOCNXCL, 0);
13918cc36fbSJordan K. Hubbard         }
14018cc36fbSJordan K. Hubbard         close(FD);
14118cc36fbSJordan K. Hubbard }
14218cc36fbSJordan K. Hubbard 
14318cc36fbSJordan K. Hubbard v831_abort()
14418cc36fbSJordan K. Hubbard {
14518cc36fbSJordan K. Hubbard 
14618cc36fbSJordan K. Hubbard #ifdef DEBUG
14718cc36fbSJordan K. Hubbard         printf("[abort: AC=%d]\n", AC);
14818cc36fbSJordan K. Hubbard #endif
14918cc36fbSJordan K. Hubbard         sleep(2);
15018cc36fbSJordan K. Hubbard         if (child > 0)
15118cc36fbSJordan K. Hubbard                 kill(child, SIGKILL);
15218cc36fbSJordan K. Hubbard         if (AC > 0)
15318cc36fbSJordan K. Hubbard                 ioctl(FD, TIOCNXCL, 0);
15418cc36fbSJordan K. Hubbard                 close(AC);
15518cc36fbSJordan K. Hubbard         if (FD > 0)
15618cc36fbSJordan K. Hubbard                 ioctl(FD, TIOCCDTR, 0);
15718cc36fbSJordan K. Hubbard         close(FD);
15818cc36fbSJordan K. Hubbard }
15918cc36fbSJordan K. Hubbard 
16018cc36fbSJordan K. Hubbard /*
16118cc36fbSJordan K. Hubbard  * Sigh, this probably must be changed at each site.
16218cc36fbSJordan K. Hubbard  */
16318cc36fbSJordan K. Hubbard struct vaconfig {
16418cc36fbSJordan K. Hubbard 	char	*vc_name;
16518cc36fbSJordan K. Hubbard 	char	vc_rack;
16618cc36fbSJordan K. Hubbard 	char	vc_modem;
16718cc36fbSJordan K. Hubbard } vaconfig[] = {
16818cc36fbSJordan K. Hubbard 	{ "/dev/cua0",'4','0' },
16918cc36fbSJordan K. Hubbard 	{ "/dev/cua1",'4','1' },
17018cc36fbSJordan K. Hubbard 	{ 0 }
17118cc36fbSJordan K. Hubbard };
17218cc36fbSJordan K. Hubbard 
17318cc36fbSJordan K. Hubbard #define pc(x)	(c = x, write(AC,&c,1))
17418cc36fbSJordan K. Hubbard #define ABORT	01
17518cc36fbSJordan K. Hubbard #define SI	017
17618cc36fbSJordan K. Hubbard #define STX	02
17718cc36fbSJordan K. Hubbard #define ETX	03
17818cc36fbSJordan K. Hubbard 
17918cc36fbSJordan K. Hubbard static int
18018cc36fbSJordan K. Hubbard dialit(phonenum, acu)
18118cc36fbSJordan K. Hubbard 	register char *phonenum;
18218cc36fbSJordan K. Hubbard 	char *acu;
18318cc36fbSJordan K. Hubbard {
18418cc36fbSJordan K. Hubbard         register struct vaconfig *vp;
18518cc36fbSJordan K. Hubbard         char c;
18618cc36fbSJordan K. Hubbard         int i, two = 2;
18718cc36fbSJordan K. Hubbard 	static char *sanitize();
18818cc36fbSJordan K. Hubbard 
18918cc36fbSJordan K. Hubbard         phonenum = sanitize(phonenum);
19018cc36fbSJordan K. Hubbard #ifdef DEBUG
19118cc36fbSJordan K. Hubbard         printf ("(dial phonenum=%s)\n", phonenum);
19218cc36fbSJordan K. Hubbard #endif
19318cc36fbSJordan K. Hubbard         if (*phonenum == '<' && phonenum[1] == 0)
19418cc36fbSJordan K. Hubbard                 return ('Z');
19518cc36fbSJordan K. Hubbard 	for (vp = vaconfig; vp->vc_name; vp++)
19618cc36fbSJordan K. Hubbard 		if (strcmp(vp->vc_name, acu) == 0)
19718cc36fbSJordan K. Hubbard 			break;
19818cc36fbSJordan K. Hubbard 	if (vp->vc_name == 0) {
19918cc36fbSJordan K. Hubbard 		printf("Unable to locate dialer (%s)\n", acu);
20018cc36fbSJordan K. Hubbard 		return ('K');
20118cc36fbSJordan K. Hubbard 	}
20218cc36fbSJordan K. Hubbard 	{
20318cc36fbSJordan K. Hubbard #if HAVE_TERMIOS
20418cc36fbSJordan K. Hubbard 				struct termios termios;
20518cc36fbSJordan K. Hubbard 				tcgetattr (AC, &termios);
20618cc36fbSJordan K. Hubbard 				termios.c_iflag = 0;
20718cc36fbSJordan K. Hubbard #ifndef _POSIX_SOURCE
20818cc36fbSJordan K. Hubbard 				termios.c_lflag = (PENDIN|ECHOKE|ECHOE);
20918cc36fbSJordan K. Hubbard #else
21018cc36fbSJordan K. Hubbard 				termios.c_lflag = (PENDIN|ECHOE);
21118cc36fbSJordan K. Hubbard #endif
21218cc36fbSJordan K. Hubbard 				termios.c_cflag = (CLOCAL|HUPCL|CREAD|CS8);
21318cc36fbSJordan K. Hubbard 				termios.c_ispeed = termios.c_ospeed = B2400;
21418cc36fbSJordan K. Hubbard 				tcsetattr (AC, TCSANOW, &termios);
21518cc36fbSJordan K. Hubbard #else /* HAVE_TERMIOS */
21618cc36fbSJordan K. Hubbard 				struct sgttyb cntrl;
21718cc36fbSJordan K. Hubbard         ioctl(AC, TIOCGETP, &cntrl);
21818cc36fbSJordan K. Hubbard         cntrl.sg_ispeed = cntrl.sg_ospeed = B2400;
21918cc36fbSJordan K. Hubbard         cntrl.sg_flags = RAW | EVENP | ODDP;
22018cc36fbSJordan K. Hubbard         ioctl(AC, TIOCSETP, &cntrl);
22118cc36fbSJordan K. Hubbard  #endif
22218cc36fbSJordan K. Hubbard 	}
22318cc36fbSJordan K. Hubbard 	ioctl(AC, TIOCFLUSH, &two);
22418cc36fbSJordan K. Hubbard         pc(STX);
22518cc36fbSJordan K. Hubbard 	pc(vp->vc_rack);
22618cc36fbSJordan K. Hubbard 	pc(vp->vc_modem);
22718cc36fbSJordan K. Hubbard 	while (*phonenum && *phonenum != '<')
22818cc36fbSJordan K. Hubbard 		pc(*phonenum++);
22918cc36fbSJordan K. Hubbard         pc(SI);
23018cc36fbSJordan K. Hubbard 	pc(ETX);
23118cc36fbSJordan K. Hubbard         sleep(1);
23218cc36fbSJordan K. Hubbard         i = read(AC, &c, 1);
23318cc36fbSJordan K. Hubbard #ifdef DEBUG
23418cc36fbSJordan K. Hubbard         printf("read %d chars, char=%c, errno %d\n", i, c, errno);
23518cc36fbSJordan K. Hubbard #endif
23618cc36fbSJordan K. Hubbard         if (i != 1)
23718cc36fbSJordan K. Hubbard 		c = 'M';
23818cc36fbSJordan K. Hubbard         if (c == 'B' || c == 'G') {
23918cc36fbSJordan K. Hubbard                 char cc, oc = c;
24018cc36fbSJordan K. Hubbard 
24118cc36fbSJordan K. Hubbard                 pc(ABORT);
24218cc36fbSJordan K. Hubbard                 read(AC, &cc, 1);
24318cc36fbSJordan K. Hubbard #ifdef DEBUG
24418cc36fbSJordan K. Hubbard                 printf("abort response=%c\n", cc);
24518cc36fbSJordan K. Hubbard #endif
24618cc36fbSJordan K. Hubbard                 c = oc;
24718cc36fbSJordan K. Hubbard                 v831_disconnect();
24818cc36fbSJordan K. Hubbard         }
24918cc36fbSJordan K. Hubbard         close(AC);
25018cc36fbSJordan K. Hubbard #ifdef DEBUG
25118cc36fbSJordan K. Hubbard         printf("dialit: returns %c\n", c);
25218cc36fbSJordan K. Hubbard #endif
25318cc36fbSJordan K. Hubbard         return (c);
25418cc36fbSJordan K. Hubbard }
25518cc36fbSJordan K. Hubbard 
25618cc36fbSJordan K. Hubbard static char *
25718cc36fbSJordan K. Hubbard sanitize(s)
25818cc36fbSJordan K. Hubbard 	register char *s;
25918cc36fbSJordan K. Hubbard {
26018cc36fbSJordan K. Hubbard         static char buf[128];
26118cc36fbSJordan K. Hubbard         register char *cp;
26218cc36fbSJordan K. Hubbard 
26318cc36fbSJordan K. Hubbard         for (cp = buf; *s; s++) {
26418cc36fbSJordan K. Hubbard 		if (!isdigit(*s) && *s == '<' && *s != '_')
26518cc36fbSJordan K. Hubbard 			continue;
26618cc36fbSJordan K. Hubbard 		if (*s == '_')
26718cc36fbSJordan K. Hubbard 			*s = '=';
26818cc36fbSJordan K. Hubbard 		*cp++ = *s;
26918cc36fbSJordan K. Hubbard 	}
27018cc36fbSJordan K. Hubbard         *cp++ = 0;
27118cc36fbSJordan K. Hubbard         return (buf);
27218cc36fbSJordan K. Hubbard }
273