|
|
1.1 root 1: #include "sys/param.h"
2: #include "sys/user.h"
3: #include "sys/inode.h"
4: #include "sys/file.h"
5: #include "sys/conf.h"
6: #include "sys/filio.h"
7:
8: /*
9: * ioctl system call
10: * Check legality, execute common code, and switch out to individual
11: * device routine.
12: */
13: ioctl()
14: {
15: register struct file *fp;
16: register struct inode *ip;
17: register struct a {
18: int fdes;
19: int cmd;
20: caddr_t cmarg;
21: } *uap;
22:
23: uap = (struct a *)u.u_ap;
24: if ((fp = getf(uap->fdes)) == NULL
25: || (fp->f_flag & (FREAD|FWRITE)) == 0) {
26: u.u_error = EBADF;
27: return;
28: }
29: ip = fp->f_inode;
30: switch (uap->cmd) {
31:
32: case FIOCLEX: /* close on exec */
33: u.u_pofile[uap->fdes] |= EXCLOSE;
34: return;
35:
36: case FIONCLEX: /* no close on exec */
37: u.u_pofile[uap->fdes] &= ~EXCLOSE;
38: return;
39:
40: }
41: if (ip->i_sptr) {
42: stioctl(ip, uap->cmd, uap->cmarg);
43: return;
44: }
45: (*fstypsw[ip->i_fstyp]->t_ioctl)(ip, uap->cmd, uap->cmarg, fp->f_flag);
46: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.