1 #ifndef lint 2 static char sccsid[] = "@(#)va820.c 4.2 (Berkeley) 06/23/85"; 3 #endif 4 5 #include "../condevs.h" 6 #ifdef VA820 7 8 /* 9 * Racal-Vadic 'RV820' with 831 adaptor. 10 * BUGS: 11 * dialer baud rate is hardcoded 12 */ 13 #define MAXDIG 30 /* set by switches inside adapter */ 14 char c_abort = '\001'; 15 char c_start = '\002'; 16 char c_empty = '\017'; 17 char c_end = '\003'; 18 19 va820opn(ph, flds, dev) 20 char *ph, *flds[]; 21 struct Devices *dev; 22 { 23 register int va, i, child; 24 char c, acu[20], com[20]; 25 char vadbuf[MAXDIG+2]; 26 int nw, lt; 27 unsigned timelim; 28 struct sgttyb sg; 29 30 child = -1; 31 if (strlen(ph) > MAXDIG) { 32 DEBUG(4, "BAD PHONE NUMBER %s\n", ph); 33 logent("rvadopn", "BAD PHONE NUMBER"); 34 i = CF_DIAL; 35 goto ret; 36 } 37 38 if (setjmp(Sjbuf)) { 39 logent("rvadopn", "TIMEOUT"); 40 i = CF_DIAL; 41 goto ret; 42 } 43 DEBUG(4, "ACU %s\n", dev->D_calldev); 44 DEBUG(4, "LINE %s\n", dev->D_line); 45 sprintf(acu, "/dev/%s", dev->D_calldev); 46 getnextfd(); 47 signal(SIGALRM, alarmtr); 48 alarm(10); 49 if ((va = open(acu, 2)) < 0) { 50 DEBUG(4, "ACU OPEN FAIL %d\n", errno); 51 logent(acu, "CAN'T OPEN"); 52 i = CF_NODEV; 53 goto ret; 54 } 55 alarm(0); 56 next_fd = -1; 57 /* 58 * Set speed and modes on dialer and clear any 59 * previous requests 60 */ 61 DEBUG(4, "SETTING UP VA831 (%d)\n", va); 62 ioctl(va, TIOCGETP, &sg); 63 sg.sg_ispeed = sg.sg_ospeed = B1200; 64 sg.sg_flags |= RAW; 65 sg.sg_flags &= ~ECHO; 66 ioctl(va, TIOCSETP, &sg); 67 DEBUG(4, "CLEARING VA831\n", 0); 68 if ( write(va, &c_abort, 1) != 1) { 69 DEBUG(4,"BAD VA831 WRITE %d\n", errno); 70 logent(acu, "CAN'T CLEAR"); 71 i = CF_DIAL; 72 goto ret; 73 } 74 sleep(1); /* XXX */ 75 read(va, &c, 1); 76 if (c != 'B') { 77 DEBUG(4,"BAD VA831 RESPONSE %c\n", c); 78 logent(acu, "CAN'T CLEAR"); 79 i = CF_DIAL; 80 goto ret; 81 } 82 /* 83 * Build the dialing sequence for the adapter 84 */ 85 DEBUG(4, "DIALING %s\n", ph); 86 sprintf(vadbuf, "%c%s<%c%c", c_start, ph, c_empty, c_end); 87 timelim = 5 * strlen(ph); 88 alarm(timelim < 30 ? 30 : timelim); 89 nw = write(va, vadbuf, strlen(vadbuf)); /* Send Phone Number */ 90 if (nw != strlen(vadbuf)) { 91 DEBUG(4,"BAD VA831 WRITE %d\n", nw); 92 logent(acu, "BAD WRITE"); 93 goto failret; 94 } 95 96 sprintf(com, "/dev/%s", dev->D_line); 97 98 /* create child to open comm line */ 99 if ((child = fork()) == 0) { 100 signal(SIGINT, SIG_DFL); 101 open(com, 0); 102 sleep(5); 103 _exit(1); 104 } 105 106 DEBUG(4, "WAITING FOR ANSWER\n", 0); 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 break; 115 case 'B': 116 DEBUG(2, "Line Busy / No Answer\n", 0); 117 goto failret; 118 case 'D': 119 DEBUG(2, "Dialer format error\n", 0); 120 goto failret; 121 case 'E': 122 DEBUG(2, "Dialer parity error\n", 0); 123 goto failret; 124 case 'F': 125 DEBUG(2, "Phone number too long\n", 0); 126 goto failret; 127 case 'G': 128 DEBUG(2, "Modem Busy\n", 0); 129 goto failret; 130 default: 131 DEBUG(2, "Unknown MACS return code '%c'\n", c&0177); 132 goto failret; 133 } 134 /* 135 * open line - will return on carrier 136 */ 137 if ((i = open(com, 2)) < 0) { 138 if (errno == EIO) 139 logent("carrier", "LOST"); 140 else 141 logent("dialup open", _FAILED); 142 goto failret; 143 } 144 DEBUG(2, "RVADIC opened %d\n", i); 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 while ((nw = wait(<)) != child && nw != -1) 155 ; 156 return i; 157 } 158 159 va820cls(fd) 160 register int fd; 161 { 162 163 DEBUG(2, "RVADIC close %d\n", fd); 164 close(fd); 165 } 166 #endif VA820 167