|
|
1.1 root 1: #include <sys/ioctl.h>
2: #include <stdio.h>
3: #include <errno.h>
4: #include <sys/dkio.h>
5:
6: extern int errno;
7: extern int rdk_ld;
8: extern int dkp_ld;
9:
10: static char *cnames[] = {
11: "/dev/dk/dkctl0",
12: "/dev/dk/dkctl2",
13: "/dev/dk/dkctl",
14: 0
15: };
16: static char *names[] = {
17: "/dev/dk/dk0%c%d",
18: "/dev/dk/dk2%c%d",
19: "/dev/dk/dk%c%d",
20: 0
21: };
22:
23: static int namefmt=-1;
24: static char alph[] = "0123456789abcdefghijklmnopqrstuvwxyz";
25:
26: static int high[] = {256, 256};
27: static int low[] = {3, 3 };
28:
29: /*
30: * Open a free dk channel and remember the `type' in namefmt.
31: */
32: int
33: dkchan(traffic, unit)
34: int traffic;
35: int unit;
36: {
37: int missing=0;
38: char outname[64];
39: register i,j;
40: int ai;
41: int fd;
42:
43: switch(unit) {
44: case '0':
45: ai = 0;
46: break;
47: case '2':
48: ai = 2;
49: break;
50: case 'b':
51: ai = traffic;
52: break;
53: default:
54: ai = -1;
55: break;
56: }
57: for (j=0; j<2; j++) {
58: for (i=low[j]; i<high[j]; i+=2) {
59: if (ai>=0) {
60: sprintf(outname, "/dev/dk/dk%d%c%d", ai,
61: alph[i/10], i%10);
62: if ((fd = open(outname, 2)) >= 0) {
63: namefmt = ai ? 1 : 0;
64: break;
65: }
66: } else {
67: sprintf(outname, "/dev/dk/dk%c%d",
68: alph[i/10], i%10);
69: if ((fd = open(outname, 2)) >= 0) {
70: namefmt = 2;
71: break;
72: }
73: }
74: if (errno==ENOENT)
75: if (++missing>5)
76: break;
77: }
78: if (fd>=0)
79: break;
80: }
81: if (fd < 0)
82: return -1;
83: low[0] = high[1] = i+2;
84: return fd;
85: }
86:
87: /*
88: * open common control channel
89: */
90: dkctlchan()
91: {
92: register i ;
93: char dkctlfile[32];
94:
95: sprintf(dkctlfile, cnames[namefmt]);
96: i = open(dkctlfile, 2);
97: if (i < 0) {
98: sprintf(dkctlfile, names[namefmt], alph[0], 1);
99: i = open(dkctlfile, 2);
100: if (i < 0)
101: return -1;
102: }
103: ioctl(i, DIOCNXCL, 0);
104: if (ioctl(i, FIOLOOKLD, 0) != rdk_ld) {
105: if (dkproto(i, dkp_ld) < 0) {
106: fprintf(stderr, "can't push dkp_ld on %s\n", dkctlfile) ;
107: close(i) ;
108: return -1;
109: }
110: if (ioctl(i, FIOPUSHLD, &rdk_ld) < 0) {
111: fprintf(stderr, "can't push rdk_ld on %s\n", dkctlfile) ;
112: close(i) ;
113: return -1;
114: }
115: if (ioctl(i, DIOCLHN, (char *)0) < 0) {
116: fprintf(stderr, "can't be manager on %s\n", dkctlfile) ;
117: close(i);
118: return -1;
119: }
120: }
121: return i;
122: }
123:
124: /*
125: * find the file name corresponding to a given channel.
126: * assumes dkctlchan has been called.
127: * Used for incoming calls.
128: */
129:
130: char *
131: dkfilename(chan)
132: {
133: static char name[64];
134:
135: if (namefmt==-1)
136: return(NULL);
137: sprintf(name, names[namefmt], alph[chan/10], chan%10);
138: return(name);
139: }
140:
141: /*
142: * Make sure that URP protocol is enabled on a datakit file.
143: */
144: int
145: dkproto(file, linedis)
146: {
147: if (ioctl(file, KIOCISURP, (char *)0) < 0)
148: return(ioctl(file, FIOPUSHLD, &linedis));
149: ioctl(file, KIOCINIT, (char *)0);
150: return(0);
151: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.