|
|
1.1.1.2 root 1: /*
2: * linux/fs/fcntl.c
3: *
4: * (C) 1991 Linus Torvalds
5: */
6:
1.1 root 7: #include <errno.h>
8:
1.1.1.4 root 9: #include <asm/segment.h>
10:
1.1.1.6 ! root 11: #include <linux/stat.h>
! 12: #include <linux/fcntl.h>
1.1.1.4 root 13: #include <linux/string.h>
14: #include <linux/sched.h>
15: #include <linux/kernel.h>
16:
1.1 root 17: extern int sys_close(int fd);
18:
19: static int dupfd(unsigned int fd, unsigned int arg)
20: {
21: if (fd >= NR_OPEN || !current->filp[fd])
22: return -EBADF;
23: if (arg >= NR_OPEN)
24: return -EINVAL;
25: while (arg < NR_OPEN)
26: if (current->filp[arg])
27: arg++;
28: else
29: break;
30: if (arg >= NR_OPEN)
31: return -EMFILE;
32: current->close_on_exec &= ~(1<<arg);
33: (current->filp[arg] = current->filp[fd])->f_count++;
34: return arg;
35: }
36:
37: int sys_dup2(unsigned int oldfd, unsigned int newfd)
38: {
1.1.1.5 root 39: if (oldfd >= NR_OPEN || !current->filp[oldfd])
40: return -EBADF;
1.1.1.3 root 41: if (newfd == oldfd)
42: return newfd;
1.1 root 43: sys_close(newfd);
44: return dupfd(oldfd,newfd);
45: }
46:
47: int sys_dup(unsigned int fildes)
48: {
49: return dupfd(fildes,0);
50: }
51:
52: int sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg)
53: {
54: struct file * filp;
55:
56: if (fd >= NR_OPEN || !(filp = current->filp[fd]))
57: return -EBADF;
58: switch (cmd) {
59: case F_DUPFD:
60: return dupfd(fd,arg);
61: case F_GETFD:
62: return (current->close_on_exec>>fd)&1;
63: case F_SETFD:
64: if (arg&1)
65: current->close_on_exec |= (1<<fd);
66: else
67: current->close_on_exec &= ~(1<<fd);
68: return 0;
69: case F_GETFL:
70: return filp->f_flags;
71: case F_SETFL:
72: filp->f_flags &= ~(O_APPEND | O_NONBLOCK);
73: filp->f_flags |= arg & (O_APPEND | O_NONBLOCK);
74: return 0;
75: case F_GETLK: case F_SETLK: case F_SETLKW:
1.1.1.3 root 76: return -ENOSYS;
1.1 root 77: default:
1.1.1.3 root 78: return -EINVAL;
1.1 root 79: }
80: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.