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