|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)vmacs.c 4.3 (Berkeley) 10/10/85"; ! 3: #endif ! 4: ! 5: #include "../condevs.h" ! 6: #ifdef VMACS ! 7: /* ! 8: * Racal-Vadic 'RV811' MACS system with 831 adaptor. ! 9: * ! 10: * A typical 300 baud L-devices entry is ! 11: * ACU /dev/tty10 /dev/tty11,48,1200 300 vmacs ! 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: * and the '8' is the communication port ! 16: * (Note: Based on RVMACS version for 820 dialer. This version ! 17: * developed by Doug Kingston @ BRL, 13 December 83.) ! 18: */ ! 19: ! 20: #define SOH 01 /* Abort */ ! 21: #define STX 02 /* Access Adaptor */ ! 22: #define ETX 03 /* Transfer to Dialer */ ! 23: #define SI 017 /* Buffer Empty (end of phone number) */ ! 24: ! 25: vmacsopn(ph, flds, dev) ! 26: char *ph, *flds[]; ! 27: struct Devices *dev; ! 28: { ! 29: register int va, i, child; ! 30: register char *p; ! 31: char c, acu[20], com[20]; ! 32: char modem, dialer; ! 33: int dialspeed; ! 34: char c_STX = STX; ! 35: char c_ETX = ETX; ! 36: char c_SI = SI; ! 37: char c_SOH = SOH; ! 38: ! 39: /* create child to open comm line */ ! 40: child = -1; ! 41: sprintf(com, "/dev/%s", dev->D_line); ! 42: if ((child = fork()) == 0) { ! 43: signal(SIGINT, SIG_DFL); ! 44: open(com, 0); ! 45: DEBUG(5, "%s Opened.", com); ! 46: sleep(5); ! 47: exit(1); ! 48: } ! 49: ! 50: if ((p = index(dev->D_calldev, ',')) == NULL) { ! 51: DEBUG(2, "No dialer/modem specification\n", 0); ! 52: goto failret; ! 53: } ! 54: *p++ = '\0'; ! 55: if (*p < '0' || *p > '7') { ! 56: logent(p, "Bad dialer address/modem type"); ! 57: goto failret; ! 58: } ! 59: dialer = *p++; ! 60: if (*p < '0' || *p > '>') { ! 61: logent(p, "Bad modem address"); ! 62: goto failret; ! 63: } ! 64: modem = *p++; ! 65: if (*p++ == ',') ! 66: dialspeed = atoi (p); ! 67: else ! 68: dialspeed = dev->D_speed; ! 69: if (setjmp(Sjbuf)) { ! 70: logent("vmacsopn", "TIMEOUT"); ! 71: i = CF_DIAL; ! 72: goto ret; ! 73: } ! 74: DEBUG(4, "STARTING CALL\n", 0); ! 75: sprintf(acu, "/dev/%s", dev->D_calldev); ! 76: getnextfd(); ! 77: signal(SIGALRM, alarmtr); ! 78: alarm(60); ! 79: if ((va = open(acu, 2)) < 0) { ! 80: logent(acu, "CAN'T OPEN"); ! 81: i = CF_NODEV; ! 82: goto ret; ! 83: } ! 84: DEBUG(5, "ACU %s opened.\n", acu); ! 85: next_fd = -1; ! 86: fixline(va, dialspeed); ! 87: ! 88: write(va, &c_SOH, 1); /* abort, reset the dialer */ ! 89: do { ! 90: if (read (va, &c, 1) != 1) { ! 91: logent ("MACS initialization", _FAILED); ! 92: goto failret; ! 93: } ! 94: } while ((c&0177) != 'B'); ! 95: DEBUG(5, "ACU initialized\n", 0); ! 96: ! 97: write(va, &c_STX, 1); /* start text, access adaptor */ ! 98: write(va, &dialer, 1); /* send dialer address digit */ ! 99: write(va, &modem, 1); /* send modem address digit */ ! 100: for (p=ph; *p; p++) { ! 101: if (*p == '=' || (*p >= '0' && *p <= '9')) ! 102: write(va, p, 1); ! 103: } ! 104: write(va, &c_SI, 1); /* send buffer empty */ ! 105: write(va, &c_ETX, 1); /* end of text, initiate call */ ! 106: ! 107: if (read(va, &c, 1) != 1) { ! 108: logent("ACU READ", _FAILED); ! 109: goto failret; ! 110: } ! 111: switch(c) { ! 112: case 'A': ! 113: /* Fine! */ ! 114: DEBUG(5, "Call connected\n", 0); ! 115: break; ! 116: case 'B': ! 117: DEBUG(2, "Dialer Timeout or Abort\n", 0); ! 118: goto failret; ! 119: case 'D': ! 120: DEBUG(2, "Dialer format error\n", 0); ! 121: goto failret; ! 122: case 'E': ! 123: DEBUG(2, "Dialer parity error\n", 0); ! 124: goto failret; ! 125: case 'F': ! 126: DEBUG(2, "Phone number too long\n", 0); ! 127: goto failret; ! 128: case 'G': ! 129: DEBUG(2, "Busy signal\n", 0); ! 130: goto failret; ! 131: default: ! 132: DEBUG(2, "Unknown MACS return code '%c'\n", i); ! 133: goto failret; ! 134: } ! 135: /* ! 136: * open line - will return on carrier ! 137: */ ! 138: if ((i = open(com, 2)) < 0) { ! 139: if (errno == EIO) ! 140: logent("carrier", "LOST"); ! 141: else ! 142: logent("dialup open", _FAILED); ! 143: goto failret; ! 144: } ! 145: fixline(i, dev->D_speed); ! 146: goto ret; ! 147: failret: ! 148: i = CF_DIAL; ! 149: ret: ! 150: alarm(0); ! 151: if (child > 1) ! 152: kill(child, SIGKILL); ! 153: close(va); ! 154: sleep(2); ! 155: return i; ! 156: } ! 157: ! 158: vmacscls(fd) ! 159: register int fd; ! 160: { ! 161: char c_SOH = SOH; ! 162: ! 163: DEBUG(2, "MACS close %d\n", fd); ! 164: write(fd, &c_SOH, 1); ! 165: /* ioctl(fd, TIOCCDTR, NULL);*/ ! 166: close(fd); ! 167: } ! 168: #endif VMACS
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.