1 /*- 2 * Copyright (c) 1985, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * %sccs.include.proprietary.c% 6 */ 7 8 #ifndef lint 9 static char sccsid[] = "@(#)va811.c 8.1 (Berkeley) 06/06/93"; 10 #endif /* not lint */ 11 12 #include "condevs.h" 13 14 /* 15 * Racal-Vadic VA811 dialer with 831 adaptor. 16 * A typical 300 baud L-devices entry is 17 * ACU /dev/tty10 unused 300 va811s 18 * where tty10 is the communication line (D_Line), 19 * and 300 is the line speed. 20 * This is almost identical to RVMACS except that we don't need to 21 * send addresses and modem types, and don't need the fork. 22 * Joe Kelsey, fluke!joe, vax4.1526, Apr 11 1984. 23 */ 24 25 #define STX 02 /* Access Adaptor */ 26 #define ETX 03 /* Transfer to Dialer */ 27 #define SI 017 /* Buffer Empty (end of phone number) */ 28 #define SOH 01 /* Abort */ 29 30 va811opn(ph, flds, dev) 31 char *ph, *flds[]; 32 struct Devices *dev; 33 { 34 int va; 35 register int i, tries; 36 char c, dcname[20]; 37 char vabuf[35]; /* STX, 31 phone digits, SI, ETX, NUL */ 38 39 va = 0; 40 sprintf(dcname, "/dev/%s", dev->D_line); 41 if (setjmp(Sjbuf)) { 42 DEBUG(1, "timeout va811 open\n", 0); 43 logent("va811opn", "TIMEOUT"); 44 if (va >= 0) 45 close(va); 46 delock(dev->D_line); 47 return CF_NODEV; 48 } 49 DEBUG(4, "va811: STARTING CALL\n", 0); 50 getnextfd(); 51 signal(SIGALRM, alarmtr); 52 alarm(10); 53 va = open(dcname, 2); 54 alarm(0); 55 56 /* line is open */ 57 next_fd = -1; 58 if (va < 0) { 59 DEBUG(4, errno == 4 ? "%s: no carrier\n" : "%s: can't open\n", 60 dcname); 61 delock(dev->D_line); 62 logent(dcname, "CAN'T OPEN"); 63 return(errno == 4 ? CF_DIAL : CF_NODEV); 64 } 65 fixline(va, dev->D_speed); 66 67 /* first, reset everything */ 68 sendthem("\\01\\c", va); 69 DEBUG(4, "wanted %c ", 'B'); 70 i = expect("B", va); 71 DEBUG(4, "got %s\n", i ? "?" : "that"); 72 if (i != 0) { 73 DEBUG(4, "va811: NO RESPONSE\n", 0); 74 logent("va811 reset", "TIMEOUT"); 75 close(va); 76 delock(dev->D_line); 77 return CF_DIAL; 78 } 79 80 sprintf(vabuf, "%c%.31s%c%c\\c", STX, ph, SI, SOH); 81 sendthem(vabuf, va); 82 DEBUG(4, "wanted %c ", 'B'); 83 i = expect("B", va); 84 DEBUG(4, "got %s\n", i ? "?" : "that"); 85 86 if (i != 0) { 87 DEBUG(4, "va811: STORE NUMBER\n", 0); 88 logent("va811 STORE", _FAILED); 89 close(va); 90 delock(dev->D_line); 91 return CF_DIAL; 92 } 93 94 for (tries = 0; tries < TRYCALLS; tries++) { 95 sprintf(vabuf, "%c%c\\c", STX, ETX); 96 sendthem(vabuf, va); 97 DEBUG(4, "DIALING...", CNULL); 98 i = expect("A", va); 99 DEBUG(4, " %s\n", i ? _FAILED : "SUCCEEDED"); 100 if (i != 0) { 101 DEBUG(4, "va811: RESETTING\n", CNULL); 102 logent("va811 DIAL", _FAILED); 103 sendthem("\\01\\c", va); 104 expect("B", va); 105 } 106 else 107 break; 108 } 109 110 if (tries >= TRYCALLS) { 111 close(va); 112 delock(dev->D_line); 113 return CF_DIAL; 114 } 115 116 DEBUG(4, "va811 ok\n", CNULL); 117 return va; 118 } 119 120 va811cls(fd) 121 register int fd; 122 { 123 DEBUG(2, "va811 close %d\n", fd); 124 p_chwrite(fd, SOH); 125 /* ioctl(fd, TIOCCDTR, NULL);*/ 126 close(fd); 127 delock(devSel); 128 } 129