1 #ifndef lint 2 static char sccsid[] = "@(#)va820.c 4.4 (Berkeley) 02/24/88"; 3 #endif 4 5 #include "../condevs.h" 6 7 /* 8 * Racal-Vadic 'RV820' with 831 adaptor. 9 * BUGS: 10 * dialer baud rate is hardcoded 11 */ 12 #define MAXDIG 30 /* set by switches inside adapter */ 13 char c_abort = '\001'; 14 char c_start = '\002'; 15 char c_empty = '\017'; 16 char c_end = '\003'; 17 18 va820opn(ph, flds, dev) 19 char *ph, *flds[]; 20 struct Devices *dev; 21 { 22 register int va, i, child; 23 char c, acu[20], com[20]; 24 char vadbuf[MAXDIG+2]; 25 int nw, lt; 26 unsigned timelim; 27 struct sgttyb sg; 28 29 child = -1; 30 if (strlen(ph) > MAXDIG) { 31 DEBUG(4, "BAD PHONE NUMBER %s\n", ph); 32 logent("rvadopn", "BAD PHONE NUMBER"); 33 i = CF_DIAL; 34 goto ret; 35 } 36 37 if (setjmp(Sjbuf)) { 38 logent("rvadopn", "TIMEOUT"); 39 i = CF_DIAL; 40 goto ret; 41 } 42 DEBUG(4, "ACU %s\n", dev->D_calldev); 43 DEBUG(4, "LINE %s\n", dev->D_line); 44 sprintf(acu, "/dev/%s", dev->D_calldev); 45 getnextfd(); 46 signal(SIGALRM, alarmtr); 47 alarm(10); 48 va = open(acu, 2); 49 alarm(0); 50 next_fd = -1; 51 if (va < 0) { 52 DEBUG(4, "ACU OPEN FAIL %d\n", errno); 53 logent(acu, "CAN'T OPEN"); 54 i = CF_NODEV; 55 goto ret; 56 } 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