|
|
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.