|
|
1.1 root 1: #include <u.h>
2: #include <libc.h>
3: #include <auth.h>
4: #include <../boot/boot.h>
5:
6: void
7: configbri(Method *mp)
8: {
9: char trbuf[TICKREQLEN];
10: int devno = 0;
11: int fd, n, chan, i;
12: int pfd[2];
13: char dbuf[8], sbuf[8], rbuf[8];
14: char *argv[16];
15: char buf[128], file[3*NAMELEN];
16: char dialstr[32];
17: char *p;
18: char *dbg, *dkptr;
19:
20: if(p = strchr(mp->arg, ';')){ /* assign = */
21: dbg = mp->arg;
22: *p++ = 0;
23: dkptr = p;
24: }else{
25: dbg = 0;
26: dkptr = mp->arg;
27: }
28: fd = connectlocal();
29: if(fd < 0)
30: fatal("no local file system");
31: if(fsession(fd, trbuf) < 0)
32: fatal("fsession failed on #s/kfs");
33: if(mount(fd, "/", MAFTER|MCREATE, "") < 0)
34: fatal("can't mount kfs");
35: close(fd);
36:
37: if(pipe(pfd)<0)
38: fatal("pipe");
39: switch(fork()){
40: case -1:
41: fatal("fork");
42: case 0:
43: i = 0;
44: argv[i++] = "briserver";
45: if(dbg){
46: argv[i++] = "-D";
47: argv[i++] = dbg;
48: }
49: argv[i++] = "-d";
50: argv[i++] = dbuf;
51: sprint(dbuf, "%d", devno);
52: argv[i++] = "-s";
53: argv[i++] = sbuf;
54: sprint(sbuf, "%d", pfd[0]);
55: argv[i++] = rbuf;
56: sprint(rbuf, "%d", pfd[1]);
57: argv[i] = 0;
58: exec("/68020/bin/isdn/briserver", argv);
59: fatal("can't exec briserver");
60: default:
61: break;
62: }
63: close(pfd[1]);
64: if(fsession(pfd[0], trbuf) < 0)
65: fatal("fsession failed on /dev/bri0");
66: if(mount(pfd[0], "/dev", MAFTER, "") < 0)
67: fatal("can't mount /dev/bri0");
68: close(pfd[0]);
69:
70: sprint(file, "/dev/bri%d/dial", devno);
71: do{
72: fd = open(file, ORDWR);
73: if(fd < 0)
74: fatal(file);
75: memset(dialstr, 0, sizeof(dialstr));
76: outin(0, "Number please ", dialstr, sizeof(dialstr));
77: fprint(fd, "c/0 %s\n", dialstr);
78: n = read(fd, buf, sizeof buf-1);
79: close(fd);
80: if(n <= 0)
81: fatal("EOF from dialer");
82: buf[n] = 0;
83: write(1, buf, n);
84: }while(strncmp(buf, "connected", 9) != 0);
85: p = strchr(buf, '/');
86: if(p == 0)
87: fatal("bad reply from bri server");
88: else
89: p++;
90: chan = strtoul(p, 0, 0);
91: if(chan < 1 || chan > 2)
92: fatal("bad channel from bri server");
93: sprint(file, "#J%d/b1xb2", devno);
94: fd = open(file, OWRITE);
95: if(fd < 0)
96: fatal(file);
97: sendmsg(fd, (chan==2) ? "0" : "1");
98: close(fd);
99: chan = 2;
100:
101: switch(fork()){
102: case -1:
103: fatal("fork");
104: case 0:
105: execl("/68020/bin/isdn/dkbrimon", "dkbrimon", dialstr, 0);
106: fatal("can't exec dkbrimon");
107: default:
108: break;
109: }
110: sprint(file, "#H%d/ctl", 2*devno+chan-1);
111: fd = open(file, ORDWR);
112: if(fd < 0)
113: fatal(file);
114: sendmsg(fd, "hdlc on");
115: sendmsg(fd, "recven");
116: sendmsg(fd, "push dkmux");
117: sendmsg(fd, dkptr);
118: close(fd);
119: }
120:
121: int
122: authbri(void)
123: {
124: return dkauth();
125: }
126:
127: int
128: connectbri(void)
129: {
130: return dkconnect();
131: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.