|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)va820.c 4.4 (Berkeley) 2/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.