1 /* 2 * Copyright (c) 1983 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34 #ifndef lint 35 static char sccsid[] = "@(#)v831.c 5.5 (Berkeley) 3/2/91"; 36 #endif /* not lint */ 37 38 /* 39 * Routines for dialing up on Vadic 831 40 */ 41 #include "tip.h" 42 43 int v831_abort(); 44 static void alarmtr(); 45 extern int errno; 46 47 static jmp_buf jmpbuf; 48 static int child = -1; 49 50 v831_dialer(num, acu) 51 char *num, *acu; 52 { 53 int status, pid, connected = 1; 54 register int timelim; 55 static int dialit(); 56 57 if (boolean(value(VERBOSE))) 58 printf("\nstarting call..."); 59 #ifdef DEBUG 60 printf ("(acu=%s)\n", acu); 61 #endif 62 if ((AC = open(acu, O_RDWR)) < 0) { 63 if (errno == EBUSY) 64 printf("line busy..."); 65 else 66 printf("acu open error..."); 67 return (0); 68 } 69 if (setjmp(jmpbuf)) { 70 kill(child, SIGKILL); 71 close(AC); 72 return (0); 73 } 74 signal(SIGALRM, alarmtr); 75 timelim = 5 * strlen(num); 76 alarm(timelim < 30 ? 30 : timelim); 77 if ((child = fork()) == 0) { 78 /* 79 * ignore this stuff for aborts 80 */ 81 signal(SIGALRM, SIG_IGN); 82 signal(SIGINT, SIG_IGN); 83 signal(SIGQUIT, SIG_IGN); 84 sleep(2); 85 exit(dialit(num, acu) != 'A'); 86 } 87 /* 88 * open line - will return on carrier 89 */ 90 if ((FD = open(DV, O_RDWR)) < 0) { 91 #ifdef DEBUG 92 printf("(after open, errno=%d)\n", errno); 93 #endif 94 if (errno == EIO) 95 printf("lost carrier..."); 96 else 97 printf("dialup line open failed..."); 98 alarm(0); 99 kill(child, SIGKILL); 100 close(AC); 101 return (0); 102 } 103 alarm(0); 104 #ifdef notdef 105 ioctl(AC, TIOCHPCL, 0); 106 #endif 107 signal(SIGALRM, SIG_DFL); 108 while ((pid = wait(&status)) != child && pid != -1) 109 ; 110 if (status) { 111 close(AC); 112 return (0); 113 } 114 return (1); 115 } 116 117 static void 118 alarmtr() 119 { 120 alarm(0); 121 longjmp(jmpbuf, 1); 122 } 123 124 /* 125 * Insurance, for some reason we don't seem to be 126 * hanging up... 127 */ 128 v831_disconnect() 129 { 130 struct sgttyb cntrl; 131 132 sleep(2); 133 #ifdef DEBUG 134 printf("[disconnect: FD=%d]\n", FD); 135 #endif 136 if (FD > 0) { 137 ioctl(FD, TIOCCDTR, 0); 138 ioctl(FD, TIOCGETP, &cntrl); 139 cntrl.sg_ispeed = cntrl.sg_ospeed = 0; 140 ioctl(FD, TIOCSETP, &cntrl); 141 ioctl(FD, TIOCNXCL, (struct sgttyb *)NULL); 142 } 143 close(FD); 144 } 145 146 v831_abort() 147 { 148 149 #ifdef DEBUG 150 printf("[abort: AC=%d]\n", AC); 151 #endif 152 sleep(2); 153 if (child > 0) 154 kill(child, SIGKILL); 155 if (AC > 0) 156 ioctl(FD, TIOCNXCL, (struct sgttyb *)NULL); 157 close(AC); 158 if (FD > 0) 159 ioctl(FD, TIOCCDTR, 0); 160 close(FD); 161 } 162 163 /* 164 * Sigh, this probably must be changed at each site. 165 */ 166 struct vaconfig { 167 char *vc_name; 168 char vc_rack; 169 char vc_modem; 170 } vaconfig[] = { 171 { "/dev/cua0",'4','0' }, 172 { "/dev/cua1",'4','1' }, 173 { 0 } 174 }; 175 176 #define pc(x) (c = x, write(AC,&c,1)) 177 #define ABORT 01 178 #define SI 017 179 #define STX 02 180 #define ETX 03 181 182 static int 183 dialit(phonenum, acu) 184 register char *phonenum; 185 char *acu; 186 { 187 register struct vaconfig *vp; 188 struct sgttyb cntrl; 189 char c; 190 int i, two = 2; 191 static char *sanitize(); 192 193 phonenum = sanitize(phonenum); 194 #ifdef DEBUG 195 printf ("(dial phonenum=%s)\n", phonenum); 196 #endif 197 if (*phonenum == '<' && phonenum[1] == 0) 198 return ('Z'); 199 for (vp = vaconfig; vp->vc_name; vp++) 200 if (strcmp(vp->vc_name, acu) == 0) 201 break; 202 if (vp->vc_name == 0) { 203 printf("Unable to locate dialer (%s)\n", acu); 204 return ('K'); 205 } 206 ioctl(AC, TIOCGETP, &cntrl); 207 cntrl.sg_ispeed = cntrl.sg_ospeed = B2400; 208 cntrl.sg_flags = RAW | EVENP | ODDP; 209 ioctl(AC, TIOCSETP, &cntrl); 210 ioctl(AC, TIOCFLUSH, &two); 211 pc(STX); 212 pc(vp->vc_rack); 213 pc(vp->vc_modem); 214 while (*phonenum && *phonenum != '<') 215 pc(*phonenum++); 216 pc(SI); 217 pc(ETX); 218 sleep(1); 219 i = read(AC, &c, 1); 220 #ifdef DEBUG 221 printf("read %d chars, char=%c, errno %d\n", i, c, errno); 222 #endif 223 if (i != 1) 224 c = 'M'; 225 if (c == 'B' || c == 'G') { 226 char cc, oc = c; 227 228 pc(ABORT); 229 read(AC, &cc, 1); 230 #ifdef DEBUG 231 printf("abort response=%c\n", cc); 232 #endif 233 c = oc; 234 v831_disconnect(); 235 } 236 close(AC); 237 #ifdef DEBUG 238 printf("dialit: returns %c\n", c); 239 #endif 240 return (c); 241 } 242 243 static char * 244 sanitize(s) 245 register char *s; 246 { 247 static char buf[128]; 248 register char *cp; 249 250 for (cp = buf; *s; s++) { 251 if (!isdigit(*s) && *s == '<' && *s != '_') 252 continue; 253 if (*s == '_') 254 *s = '='; 255 *cp++ = *s; 256 } 257 *cp++ = 0; 258 return (buf); 259 } 260