|
|
1.1 root 1: /*
2: * file descriptor driver
3: * open(minor n) -> dup of minor n
4: */
5:
6: #include "sys/param.h"
7: #include "sys/file.h"
8: #include "sys/user.h"
9: #include "sys/conf.h"
10:
11: int fdopen();
12:
13: struct cdevsw fdcdev = cdinit(fdopen, nodev, nodev, nodev, nodev);
14:
15: fdopen(dev, flag)
16: {
17: register struct file *fp;
18: register int ofd;
19:
20: ofd = u.u_r.r_val1; /* magic knowledge */
21: if (minor(dev) == ofd || (fp = getf(minor(dev))) == NULL) {
22: u.u_error = EBADF;
23: return;
24: }
25: /* now for the naughty part */
26: if ((unsigned)ofd >= NOFILE || u.u_ofile[ofd] == NULL)
27: panic("fdopen");
28: closef(u.u_ofile[ofd]);
29: u.u_ofile[ofd] = fp;
30: fp->f_count++;
31: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.