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