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