|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)rvmacs.c 4.4 (Berkeley) 6/7/86"; ! 3: #endif ! 4: ! 5: #include "../condevs.h" ! 6: #ifdef RVMACS ! 7: ! 8: /* ! 9: * Racal-Vadic 'RV820' MACS system with 831 adaptor. ! 10: * A typical 300 baud L-devices entry is ! 11: * ACU tty10 tty11,48 300 rvmacs ! 12: * where tty10 is the communication line (D_Line), ! 13: * tty11 is the dialer line (D_calldev), ! 14: * the '4' is the dialer address + modem type (viz. dialer 0, Bell 103), ! 15: * the '8' is the communication port, ! 16: * We assume the dialer speed is 1200 baud unless MULTISPEED is defined. ! 17: * We extended the semantics of the L-devices entry to allow you ! 18: * to set the speed at which the computer talks to the dialer: ! 19: * ACU cul0 cua0,0<,2400 1200 rvmacs ! 20: * This is interpreted as above, except that the number following the second ! 21: * comma in the third field is taken to be the speed at which the computer ! 22: * must communicate with the dialer. (If omitted, it defaults to the value ! 23: * in the fourth field.) Note -- just after the call completes and you get ! 24: * carrier, the line speed is reset to the speed indicated in the fourth field. ! 25: * To get this ability, define "MULTISPEED", as below. ! 26: * ! 27: */ ! 28: #define MULTISPEED /* for dialers which work at various speeds */ ! 29: ! 30: #define STX 02 /* Access Adaptor */ ! 31: #define ETX 03 /* Transfer to Dialer */ ! 32: #define SI 017 /* Buffer Empty (end of phone number) */ ! 33: #define ABORT 01 /* Abort */ ! 34: ! 35: #define pc(fd, x) (c = x, write(fd, &c, 1)) ! 36: ! 37: rvmacsopn(ph, flds, dev) ! 38: char *ph, *flds[]; ! 39: struct Devices *dev; ! 40: { ! 41: register int va, i, child; ! 42: register char *p; ! 43: char c, acu[20], com[20]; ! 44: int baudrate; ! 45: int timelim; ! 46: int pid, status; ! 47: int zero = 0; ! 48: #ifdef MULTISPEED ! 49: char *pp; ! 50: #else !MULTISPEED ! 51: struct sgttyb sg; ! 52: #endif MULTISPEED ! 53: ! 54: child = -1; ! 55: sprintf(com, "/dev/%s", dev->D_line); ! 56: sprintf(acu, "/dev/%s", dev->D_calldev); ! 57: if ((p = index(acu, ',')) == NULL) { ! 58: DEBUG(2, "No dialer/modem specification\n", 0); ! 59: return CF_DIAL; ! 60: } ! 61: *p++ = '\0'; ! 62: #ifdef MULTISPEED ! 63: baudrate = dev->D_speed; ! 64: if ((pp = index(p, ',')) != NULL){ ! 65: baudrate = atoi(pp+1); ! 66: DEBUG(5, "Using speed %d baud\n", baudrate); ! 67: } ! 68: #endif MULTISPEED ! 69: if (setjmp(Sjbuf)) { ! 70: logent("rvmacsopn", "TIMEOUT"); ! 71: goto failret; ! 72: } ! 73: DEBUG(4, "STARTING CALL\n", 0); ! 74: getnextfd(); ! 75: signal(SIGALRM, alarmtr); ! 76: timelim = 5 * strlen(ph); ! 77: alarm(timelim < 45 ? 45 : timelim); ! 78: ! 79: if ((va = open(acu, 2)) < 0) { ! 80: logent(acu, "CAN'T OPEN"); ! 81: alarm(0); ! 82: return CF_DIAL; ! 83: } ! 84: ! 85: /* rti!trt: avoid passing acu file descriptor to children */ ! 86: next_fd = -1; ! 87: fioclex(va); ! 88: ! 89: if ((child = fork()) == 0) { ! 90: /* create child to do dialing */ ! 91: sleep(2); ! 92: fclose(stdin); ! 93: fclose(stdout); ! 94: #ifdef MULTISPEED ! 95: fixline(va, baudrate); ! 96: #else !MULTISPEED ! 97: sg.sg_flags = RAW|ANYP; ! 98: sg.sg_ispeed = sg.sg_ospeed = B1200; ! 99: ioctl(va, TIOCSETP, &sg); ! 100: #endif MULTISPEED ! 101: pc(va, ABORT); ! 102: sleep(1); ! 103: ioctl(va, TIOCFLUSH, &zero); ! 104: pc(va, STX); /* access adaptor */ ! 105: pc(va, *p++); /* Send Dialer Address Digit */ ! 106: pc(va, *p); /* Send Modem Address Digit */ ! 107: while (*ph && *ph != '<') { ! 108: switch (*ph) { ! 109: case '_': ! 110: case '-': ! 111: case '=': ! 112: pc(va, '='); ! 113: break; ! 114: default: ! 115: if (*ph >= '0' && *ph <= '9') ! 116: pc(va, *ph); ! 117: break; ! 118: } ! 119: ph++; ! 120: } ! 121: pc(va, '<'); /* Transfer Control to Modem (sigh) */ ! 122: pc(va, SI); /* Send Buffer Empty */ ! 123: pc(va, ETX); /* Initiate Call */ ! 124: sleep(1); ! 125: ! 126: if (read(va, &c, 1) != 1) { ! 127: close(va); ! 128: logent("ACU READ", _FAILED); ! 129: exit(1); ! 130: } ! 131: if (c == 'B' || c == 'G') { ! 132: char cc; ! 133: pc(va, ABORT); ! 134: read(va, &cc, 1); ! 135: } ! 136: DEBUG(4, "Dialer returned %c\n", c); ! 137: close(va); ! 138: exit(c != 'A'); ! 139: } ! 140: /* ! 141: * open line - will return on carrier ! 142: */ ! 143: if ((i = open(com, 2)) < 0) { ! 144: if (errno == EIO) ! 145: logent("carrier", "LOST"); ! 146: else ! 147: logent("dialup open", _FAILED); ! 148: goto failret; ! 149: } ! 150: while ((pid = wait(&status)) != child && pid != -1) ! 151: ; ! 152: alarm(0); ! 153: if (status) { ! 154: close(i); ! 155: close(va); /* XXX */ ! 156: return CF_DIAL; ! 157: } ! 158: fixline(i, dev->D_speed); ! 159: return i; ! 160: ! 161: failret: ! 162: alarm(0); ! 163: close(va); ! 164: if (child != -1) ! 165: kill(child, SIGKILL); ! 166: return CF_DIAL; ! 167: } ! 168: ! 169: rvmacscls(fd) ! 170: register int fd; ! 171: { ! 172: if (fd > 0) { ! 173: char c; ! 174: ! 175: pc(fd, ABORT); ! 176: ioctl(fd, TIOCCDTR, STBNULL); ! 177: sleep(1); ! 178: ioctl(fd, TIOCNXCL, STBNULL); ! 179: close(fd); ! 180: delock(devSel); ! 181: } ! 182: } ! 183: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.