diff --git a/fs/fcntl.c b/fs/fcntl.c index b7eb2d0dc0d8390d342e6abeb795461ba0790719..6264bb20d628e60f3b551ab97ac3f42daf577e4b 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c @@ -32,3 +32,34 @@ int sys_dup(unsigned int fildes) { return dupfd(fildes, 0); } +int sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg) { + struct file * filp; + + if (fd >= NR_OPEN || !(filp = current->filp[fd])) + return -EBADF; + switch (cmd) { + case F_DUPFD: + return dupfd(fd,arg); + case F_GETFD: + return (current->close_on_exec>>fd)&1; + case F_SETFD: + if (arg&1) + current->close_on_exec |= (1<close_on_exec &= ~(1<f_flags; + case F_SETFL: + filp->f_flags &= ~(O_APPEND | O_NONBLOCK); + filp->f_flags |= arg & (O_APPEND | O_NONBLOCK); + return 0; + case F_GETLK: + case F_SETLK: + case F_SETLKW: + return -1; + default: + return -1; + } +} + diff --git a/include/fcntl.h b/include/fcntl.h index 6dac764beb83bf8979cb01f96ef6473e554144bf..d2ed5d698952b5010ee55ca80ab1e11b8060a223 100644 --- a/include/fcntl.h +++ b/include/fcntl.h @@ -15,6 +15,21 @@ #define O_NONBLOCK 04000 #define O_NDELAY O_NONBLOCK +#define F_DUPFD 0 +#define F_GETFD 1 +#define F_SETFD 2 +#define F_GETFL 3 +#define F_SETFL 4 +#define F_GETLK 5 +#define F_SETLK 6 +#define F_SETLKW 7 + +#define FD_CLOEXEC 1 + +#define F_RDLCK 0 +#define F_WRLCK 1 +#define F_UNLCK 2 + extern int open(const char * filename, int flags, ...); #endif diff --git a/include/linux/sys.h b/include/linux/sys.h index 532b87be17f0a111c66ee25a701dd47f9e8a658d..85f11ec31d04607f3aedf84466431019c8b6c514 100644 --- a/include/linux/sys.h +++ b/include/linux/sys.h @@ -53,7 +53,7 @@ extern int sys_acct(); extern int sys_phys(); extern int sys_lock(); extern int sys_ioctl(); -//extern int sys_fcntl(); +extern int sys_fcntl(); extern int sys_mpx(); //extern int sys_setpgid(); extern int sys_ulimit(); @@ -150,7 +150,7 @@ fn_ptr sys_call_table[] = { sys_lock, sys_ioctl, - 0, // sys_fcntl, + sys_fcntl, sys_mpx, 0, // sys_setpgid, sys_ulimit, diff --git a/include/unistd.h b/include/unistd.h index f2436f25520185aa57967c4e296e29c42ebefa8a..e114b7e3a1af43f99831304fd8af957079b7315f 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -156,6 +156,7 @@ int chdir(const char* pathname); int close(int fildes); int dup(int fildes); int execve(const char * filename, char ** argv, char ** envp); +int fcntl(int fildes, int cmd, ...); int fork(); int fstat(); int setup(void *BIOS);