1 #ifndef lint 2 static char sccsid[] = "@(#)v831.c 4.5 (Berkeley) 06/25/83"; 3 #endif 4 5 /* 6 * Routines for dialing up on Vadic 831 7 */ 8 #include <sys/time.h> 9 10 #include "tip.h" 11 12 int v831_abort(); 13 static int alarmtr(); 14 extern errno; 15 16 static jmp_buf jmpbuf; 17 static int child = -1; 18 19 v831_dialer(num, acu) 20 char *num, *acu; 21 { 22 int status, pid, connected = 1; 23 register int timelim; 24 25 if (boolean(value(VERBOSE))) 26 printf("\nstarting call..."); 27 #ifdef DEBUG 28 printf ("(acu=%s)\n", acu); 29 #endif 30 if ((AC = open(acu, O_RDWR)) < 0) { 31 if (errno == EBUSY) 32 printf("line busy..."); 33 else 34 printf("acu open error..."); 35 return (0); 36 } 37 if (setjmp(jmpbuf)) { 38 kill(child, SIGKILL); 39 close(AC); 40 return (0); 41 } 42 signal(SIGALRM, alarmtr); 43 timelim = 5 * strlen(num); 44 alarm(timelim < 30 ? 30 : timelim); 45 if ((child = fork()) == 0) { 46 /* 47 * ignore this stuff for aborts 48 */ 49 signal(SIGALRM, SIG_IGN); 50 signal(SIGINT, SIG_IGN); 51 signal(SIGQUIT, SIG_IGN); 52 sleep(2); 53 exit(dialit(num, acu) != 'A'); 54 } 55 /* 56 * open line - will return on carrier 57 */ 58 if ((FD = open(DV, O_RDWR)) < 0) { 59 #ifdef DEBUG 60 printf("(after open, errno=%d)\n", errno); 61 #endif 62 if (errno == EIO) 63 printf("lost carrier..."); 64 else 65 printf("dialup line open failed..."); 66 alarm(0); 67 kill(child, SIGKILL); 68 close(AC); 69 return (0); 70 } 71 alarm(0); 72 #ifdef notdef 73 ioctl(AC, TIOCHPCL, 0); 74 #endif 75 signal(SIGALRM, SIG_DFL); 76 while ((pid = wait(&status)) != child && pid != -1) 77 ; 78 if (status) { 79 close(AC); 80 return (0); 81 } 82 return (1); 83 } 84 85 static 86 alarmtr() 87 { 88 89 alarm(0); 90 longjmp(jmpbuf, 1); 91 } 92 93 /* 94 * Insurance, for some reason we don't seem to be 95 * hanging up... 96 */ 97 v831_disconnect() 98 { 99 struct sgttyb cntrl; 100 101 sleep(2); 102 #ifdef DEBUG 103 printf("[disconnect: FD=%d]\n", FD); 104 #endif 105 if (FD > 0) { 106 ioctl(FD, TIOCCDTR, 0); 107 ioctl(FD, TIOCGETP, &cntrl); 108 cntrl.sg_ispeed = cntrl.sg_ospeed = 0; 109 ioctl(FD, TIOCSETP, &cntrl); 110 ioctl(FD, TIOCNXCL, (struct sgttyb *)NULL); 111 } 112 close(FD); 113 } 114 115 v831_abort() 116 { 117 118 #ifdef DEBUG 119 printf("[abort: AC=%d]\n", AC); 120 #endif 121 sleep(2); 122 if (child > 0) 123 kill(child, SIGKILL); 124 if (AC > 0) 125 ioctl(FD, TIOCNXCL, (struct sgttyb *)NULL); 126 close(AC); 127 if (FD > 0) 128 ioctl(FD, TIOCCDTR, 0); 129 close(FD); 130 } 131 132 /* 133 * Sigh, this probably must be changed at each site. 134 */ 135 struct vaconfig { 136 char *vc_name; 137 char vc_rack; 138 char vc_modem; 139 } vaconfig[] = { 140 { "/dev/cua0",'4','0' }, 141 { "/dev/cua1",'4','1' }, 142 { 0 } 143 }; 144 145 #define pc(x) (c = x, write(AC,&c,1)) 146 #define ABORT 01 147 #define SI 017 148 #define STX 02 149 #define ETX 03 150 151 static 152 dialit(phonenum, acu) 153 register char *phonenum; 154 char *acu; 155 { 156 register struct vaconfig *vp; 157 struct sgttyb cntrl; 158 char c, *sanitize(); 159 int i, two = 2; 160 161 phonenum = sanitize(phonenum); 162 #ifdef DEBUG 163 printf ("(dial phonenum=%s)\n", phonenum); 164 #endif 165 if (*phonenum == '<' && phonenum[1] == 0) 166 return ('Z'); 167 for (vp = vaconfig; vp->vc_name; vp++) 168 if (strcmp(vp->vc_name, acu) == 0) 169 break; 170 if (vp->vc_name == 0) { 171 printf("Unable to locate dialer (%s)\n", acu); 172 return ('K'); 173 } 174 ioctl(AC, TIOCGETP, &cntrl); 175 cntrl.sg_ispeed = cntrl.sg_ospeed = B2400; 176 cntrl.sg_flags = RAW | EVENP | ODDP; 177 ioctl(AC, TIOCSETP, &cntrl); 178 ioctl(AC, TIOCFLUSH, &two); 179 pc(STX); 180 pc(vp->vc_rack); 181 pc(vp->vc_modem); 182 while (*phonenum && *phonenum != '<') 183 pc(*phonenum++); 184 pc(SI); 185 pc(ETX); 186 sleep(1); 187 i = read(AC, &c, 1); 188 #ifdef DEBUG 189 printf("read %d chars, char=%c, errno %d\n", i, c, errno); 190 #endif 191 if (i != 1) 192 c = 'M'; 193 if (c == 'B' || c == 'G') { 194 char cc, oc = c; 195 196 pc(ABORT); 197 read(AC, &cc, 1); 198 #ifdef DEBUG 199 printf("abort response=%c\n", cc); 200 #endif 201 c = oc; 202 v831_disconnect(); 203 } 204 close(AC); 205 #ifdef DEBUG 206 printf("dialit: returns %c\n", c); 207 #endif 208 return (c); 209 } 210 211 static char * 212 sanitize(s) 213 register char *s; 214 { 215 static char buf[128]; 216 register char *cp; 217 218 for (cp = buf; *s; s++) { 219 if (!isdigit(*s) && *s == '<' && *s != '_') 220 continue; 221 if (*s == '_') 222 *s = '='; 223 *cp++ = *s; 224 } 225 *cp++ = 0; 226 return (buf); 227 } 228