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