|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)rvmacs.c 4.5 (Berkeley) 2/24/88";
3: #endif
4:
5: #include "../condevs.h"
6:
7: /*
8: * Racal-Vadic 'RV820' MACS system with 831 adaptor.
9: * A typical 300 baud L-devices entry is
10: * ACU tty10 tty11,48 300 rvmacs
11: * where tty10 is the communication line (D_Line),
12: * tty11 is the dialer line (D_calldev),
13: * the '4' is the dialer address + modem type (viz. dialer 0, Bell 103),
14: * the '8' is the communication port,
15: * We assume the dialer speed is 1200 baud unless MULTISPEED is defined.
16: * We extended the semantics of the L-devices entry to allow you
17: * to set the speed at which the computer talks to the dialer:
18: * ACU cul0 cua0,0<,2400 1200 rvmacs
19: * This is interpreted as above, except that the number following the second
20: * comma in the third field is taken to be the speed at which the computer
21: * must communicate with the dialer. (If omitted, it defaults to the value
22: * in the fourth field.) Note -- just after the call completes and you get
23: * carrier, the line speed is reset to the speed indicated in the fourth field.
24: * To get this ability, define "MULTISPEED", as below.
25: *
26: */
27: #define MULTISPEED /* for dialers which work at various speeds */
28:
29: #define STX 02 /* Access Adaptor */
30: #define ETX 03 /* Transfer to Dialer */
31: #define SI 017 /* Buffer Empty (end of phone number) */
32: #define ABORT 01 /* Abort */
33:
34: #define pc(fd, x) (c = x, write(fd, &c, 1))
35:
36: rvmacsopn(ph, flds, dev)
37: char *ph, *flds[];
38: struct Devices *dev;
39: {
40: register int va, i, child;
41: register char *p;
42: char c, acu[20], com[20];
43: int baudrate;
44: int timelim;
45: int pid, status;
46: int zero = 0;
47: #ifdef MULTISPEED
48: char *pp;
49: #else !MULTISPEED
50: struct sgttyb sg;
51: #endif MULTISPEED
52:
53: child = -1;
54: sprintf(com, "/dev/%s", dev->D_line);
55: sprintf(acu, "/dev/%s", dev->D_calldev);
56: if ((p = index(acu, ',')) == NULL) {
57: DEBUG(2, "No dialer/modem specification\n", 0);
58: return CF_DIAL;
59: }
60: *p++ = '\0';
61: #ifdef MULTISPEED
62: baudrate = dev->D_speed;
63: if ((pp = index(p, ',')) != NULL){
64: baudrate = atoi(pp+1);
65: DEBUG(5, "Using speed %d baud\n", baudrate);
66: }
67: #endif MULTISPEED
68: if (setjmp(Sjbuf)) {
69: logent("rvmacsopn", "TIMEOUT");
70: goto failret;
71: }
72: DEBUG(4, "STARTING CALL\n", 0);
73: getnextfd();
74: signal(SIGALRM, alarmtr);
75: timelim = 5 * strlen(ph);
76: alarm(timelim < 45 ? 45 : timelim);
77:
78: if ((va = open(acu, 2)) < 0) {
79: logent(acu, "CAN'T OPEN");
80: alarm(0);
81: return CF_DIAL;
82: }
83:
84: /* rti!trt: avoid passing acu file descriptor to children */
85: next_fd = -1;
86: fioclex(va);
87:
88: if ((child = fork()) == 0) {
89: /* create child to do dialing */
90: sleep(2);
91: fclose(stdin);
92: fclose(stdout);
93: #ifdef MULTISPEED
94: fixline(va, baudrate);
95: #else !MULTISPEED
96: sg.sg_flags = RAW|ANYP;
97: sg.sg_ispeed = sg.sg_ospeed = B1200;
98: ioctl(va, TIOCSETP, &sg);
99: #endif MULTISPEED
100: pc(va, ABORT);
101: sleep(1);
102: ioctl(va, TIOCFLUSH, &zero);
103: pc(va, STX); /* access adaptor */
104: pc(va, *p++); /* Send Dialer Address Digit */
105: pc(va, *p); /* Send Modem Address Digit */
106: while (*ph && *ph != '<') {
107: switch (*ph) {
108: case '_':
109: case '-':
110: case '=':
111: pc(va, '=');
112: break;
113: default:
114: if (*ph >= '0' && *ph <= '9')
115: pc(va, *ph);
116: break;
117: }
118: ph++;
119: }
120: pc(va, '<'); /* Transfer Control to Modem (sigh) */
121: pc(va, SI); /* Send Buffer Empty */
122: pc(va, ETX); /* Initiate Call */
123: sleep(1);
124:
125: if (read(va, &c, 1) != 1) {
126: close(va);
127: logent("ACU READ", _FAILED);
128: exit(1);
129: }
130: if (c == 'B' || c == 'G') {
131: char cc;
132: pc(va, ABORT);
133: read(va, &cc, 1);
134: }
135: DEBUG(4, "Dialer returned %c\n", c);
136: close(va);
137: exit(c != 'A');
138: }
139: /*
140: * open line - will return on carrier
141: */
142: if ((i = open(com, 2)) < 0) {
143: if (errno == EIO)
144: logent("carrier", "LOST");
145: else
146: logent("dialup open", _FAILED);
147: goto failret;
148: }
149: while ((pid = wait(&status)) != child && pid != -1)
150: ;
151: alarm(0);
152: if (status) {
153: close(i);
154: close(va); /* XXX */
155: return CF_DIAL;
156: }
157: fixline(i, dev->D_speed);
158: return i;
159:
160: failret:
161: alarm(0);
162: close(va);
163: if (child != -1)
164: kill(child, SIGKILL);
165: return CF_DIAL;
166: }
167:
168: rvmacscls(fd)
169: register int fd;
170: {
171: if (fd > 0) {
172: char c;
173:
174: pc(fd, ABORT);
175: ioctl(fd, TIOCCDTR, STBNULL);
176: sleep(1);
177: ioctl(fd, TIOCNXCL, STBNULL);
178: close(fd);
179: delock(devSel);
180: }
181: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.