diff options
Diffstat (limited to 'winsup/cygwin/fcntl.cc')
-rw-r--r-- | winsup/cygwin/fcntl.cc | 83 |
1 files changed, 11 insertions, 72 deletions
diff --git a/winsup/cygwin/fcntl.cc b/winsup/cygwin/fcntl.cc index f4d1b44f8..408cbc2cb 100644 --- a/winsup/cygwin/fcntl.cc +++ b/winsup/cygwin/fcntl.cc @@ -22,10 +22,9 @@ extern "C" int _fcntl (int fd, int cmd,...) { + void *arg = NULL; va_list args; - int arg = 0; int res; - SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK, "_fcntl"); if (fdtab.not_open (fd)) { @@ -34,77 +33,17 @@ _fcntl (int fd, int cmd,...) goto done; } - switch (cmd) - { - case F_DUPFD: - va_start (args, cmd); - arg = va_arg (args,int); - va_end (args); - res = dup2 (fd, fdtab.find_unused_handle (arg)); - goto done; - - case F_GETFD: - res = fdtab[fd]->get_close_on_exec () ? FD_CLOEXEC : 0; - goto done; - - case F_SETFD: - va_start (args, cmd); - arg = va_arg (args, int); - va_end (args); - fdtab[fd]->set_close_on_exec (arg); - res = 0; - goto done; - - case F_GETFL: - { - res = fdtab[fd]->get_flags (); - goto done; - } - case F_SETFL: - { - int temp = 0; - - va_start (args, cmd); - arg = va_arg (args, int); - va_end (args); - - if (arg & O_RDONLY) - temp |= GENERIC_READ; - if (arg & O_WRONLY) - temp |= GENERIC_WRITE; - - syscall_printf ("fcntl (%d, F_SETFL, %d)", arg); - - fdtab[fd]->set_access (temp); - fdtab[fd]->set_flags (arg); - - res = 0; - goto done; - } - - case F_GETLK: - case F_SETLK: - case F_SETLKW: - { - struct flock *fl; - va_start (args, cmd); - fl = va_arg (args,struct flock *); - va_end (args); - res = fdtab[fd]->lock (cmd, fl); - goto done; - } - default: - set_errno (EINVAL); - res = -1; - goto done; - } - - set_errno (ENOSYS); - res = -1; - - done: + SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK, "_fcntl"); + va_start (args, cmd); + arg = va_arg (args, void *); + if (cmd == F_DUPFD) + res = dup2 (fd, fdtab.find_unused_handle ((int) arg)); + else + res = fdtab[fd]->fcntl(cmd, arg); + va_end (args); ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK,"_fcntl"); - syscall_printf ("%d = fcntl (%d, %d, %d)", res, fd, cmd, arg); +done: + syscall_printf ("%d = fcntl (%d, %d, %p)", res, fd, cmd, arg); return res; } |