|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)va820.c 4.3 (Berkeley) 10/10/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: va = open(acu, 2); ! 50: alarm(0); ! 51: next_fd = -1; ! 52: if (va < 0) { ! 53: DEBUG(4, "ACU OPEN FAIL %d\n", errno); ! 54: logent(acu, "CAN'T OPEN"); ! 55: i = CF_NODEV; ! 56: goto ret; ! 57: } ! 58: /* ! 59: * Set speed and modes on dialer and clear any ! 60: * previous requests ! 61: */ ! 62: DEBUG(4, "SETTING UP VA831 (%d)\n", va); ! 63: ioctl(va, TIOCGETP, &sg); ! 64: sg.sg_ispeed = sg.sg_ospeed = B1200; ! 65: sg.sg_flags |= RAW; ! 66: sg.sg_flags &= ~ECHO; ! 67: ioctl(va, TIOCSETP, &sg); ! 68: DEBUG(4, "CLEARING VA831\n", 0); ! 69: if ( write(va, &c_abort, 1) != 1) { ! 70: DEBUG(4,"BAD VA831 WRITE %d\n", errno); ! 71: logent(acu, "CAN'T CLEAR"); ! 72: i = CF_DIAL; ! 73: goto ret; ! 74: } ! 75: sleep(1); /* XXX */ ! 76: read(va, &c, 1); ! 77: if (c != 'B') { ! 78: DEBUG(4,"BAD VA831 RESPONSE %c\n", c); ! 79: logent(acu, "CAN'T CLEAR"); ! 80: i = CF_DIAL; ! 81: goto ret; ! 82: } ! 83: /* ! 84: * Build the dialing sequence for the adapter ! 85: */ ! 86: DEBUG(4, "DIALING %s\n", ph); ! 87: sprintf(vadbuf, "%c%s<%c%c", c_start, ph, c_empty, c_end); ! 88: timelim = 5 * strlen(ph); ! 89: alarm(timelim < 30 ? 30 : timelim); ! 90: nw = write(va, vadbuf, strlen(vadbuf)); /* Send Phone Number */ ! 91: if (nw != strlen(vadbuf)) { ! 92: DEBUG(4,"BAD VA831 WRITE %d\n", nw); ! 93: logent(acu, "BAD WRITE"); ! 94: goto failret; ! 95: } ! 96: ! 97: sprintf(com, "/dev/%s", dev->D_line); ! 98: ! 99: /* create child to open comm line */ ! 100: if ((child = fork()) == 0) { ! 101: signal(SIGINT, SIG_DFL); ! 102: open(com, 0); ! 103: sleep(5); ! 104: _exit(1); ! 105: } ! 106: ! 107: DEBUG(4, "WAITING FOR ANSWER\n", 0); ! 108: if (read(va, &c, 1) != 1) { ! 109: logent("ACU READ", _FAILED); ! 110: goto failret; ! 111: } ! 112: switch(c) { ! 113: case 'A': ! 114: /* Fine! */ ! 115: break; ! 116: case 'B': ! 117: DEBUG(2, "Line Busy / No Answer\n", 0); ! 118: goto failret; ! 119: case 'D': ! 120: DEBUG(2, "Dialer format error\n", 0); ! 121: goto failret; ! 122: case 'E': ! 123: DEBUG(2, "Dialer parity error\n", 0); ! 124: goto failret; ! 125: case 'F': ! 126: DEBUG(2, "Phone number too long\n", 0); ! 127: goto failret; ! 128: case 'G': ! 129: DEBUG(2, "Modem Busy\n", 0); ! 130: goto failret; ! 131: default: ! 132: DEBUG(2, "Unknown MACS return code '%c'\n", c&0177); ! 133: goto failret; ! 134: } ! 135: /* ! 136: * open line - will return on carrier ! 137: */ ! 138: if ((i = open(com, 2)) < 0) { ! 139: if (errno == EIO) ! 140: logent("carrier", "LOST"); ! 141: else ! 142: logent("dialup open", _FAILED); ! 143: goto failret; ! 144: } ! 145: DEBUG(2, "RVADIC opened %d\n", i); ! 146: fixline(i, dev->D_speed); ! 147: goto ret; ! 148: failret: ! 149: i = CF_DIAL; ! 150: ret: ! 151: alarm(0); ! 152: if (child != -1) ! 153: kill(child, SIGKILL); ! 154: close(va); ! 155: while ((nw = wait(<)) != child && nw != -1) ! 156: ; ! 157: return i; ! 158: } ! 159: ! 160: va820cls(fd) ! 161: register int fd; ! 162: { ! 163: ! 164: DEBUG(2, "RVADIC close %d\n", fd); ! 165: close(fd); ! 166: } ! 167: #endif VA820
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.