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