1 #ifndef lint 2 static char sccsid[] = "@(#)vmacs.c 4.1 (Berkeley) 01/22/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(45); 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 fixline(va, dialspeed); 86 87 write(va, &c_SOH, 1); /* abort, reset the dialer */ 88 do { 89 if (read (va, &c, 1) != 1) { 90 logent ("MACS initialization", _FAILED); 91 goto failret; 92 } 93 } while ((c&0177) != 'B'); 94 DEBUG(5, "ACU initialized\n", 0); 95 96 write(va, &c_STX, 1); /* start text, access adaptor */ 97 write(va, &dialer, 1); /* send dialer address digit */ 98 write(va, &modem, 1); /* send modem address digit */ 99 write(va, ph, strlen(ph)); /* Send Phone Number */ 100 write(va, &c_SI, 1); /* send buffer empty */ 101 write(va, &c_ETX, 1); /* end of text, initiate call */ 102 103 if (read(va, &c, 1) != 1) { 104 logent("ACU READ", _FAILED); 105 goto failret; 106 } 107 switch(c) { 108 case 'A': 109 /* Fine! */ 110 DEBUG(5, "Call connected\n", 0); 111 break; 112 case 'B': 113 DEBUG(2, "CALL ABORTED\n", 0); 114 goto failret; 115 case 'D': 116 DEBUG(2, "Dialer format error\n", 0); 117 goto failret; 118 case 'E': 119 DEBUG(2, "Dialer parity error\n", 0); 120 goto failret; 121 case 'F': 122 DEBUG(2, "Phone number too long\n", 0); 123 goto failret; 124 case 'G': 125 DEBUG(2, "Busy signal\n", 0); 126 goto failret; 127 default: 128 DEBUG(2, "Unknown MACS return code '%c'\n", i); 129 goto failret; 130 } 131 /* 132 * open line - will return on carrier 133 */ 134 if ((i = open(com, 2)) < 0) { 135 if (errno == EIO) 136 logent("carrier", "LOST"); 137 else 138 logent("dialup open", _FAILED); 139 goto failret; 140 } 141 fixline(i, dev->D_speed); 142 goto ret; 143 failret: 144 i = CF_DIAL; 145 ret: 146 alarm(0); 147 if (child > 1) 148 kill(child, SIGKILL); 149 close(va); 150 return i; 151 } 152 153 vmacscls(fd) 154 register int fd; 155 { 156 char c_SOH = SOH; 157 158 DEBUG(2, "MACS close %d\n", fd); 159 write(fd, &c_SOH, 1); 160 /* ioctl(fd, TIOCCDTR, NULL);*/ 161 close(fd); 162 } 163 #endif VMACS 164