diff options
Diffstat (limited to 'winsup/cygwin/fcntl.cc')
-rw-r--r-- | winsup/cygwin/fcntl.cc | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/winsup/cygwin/fcntl.cc b/winsup/cygwin/fcntl.cc new file mode 100644 index 0000000..a82a105 --- /dev/null +++ b/winsup/cygwin/fcntl.cc @@ -0,0 +1,106 @@ +/* fcntl.cc: fcntl syscall + + Copyright 1996, 1997, 1998 Cygnus Solutions. + +This file is part of Cygwin. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +#include <fcntl.h> +#include <stdarg.h> +#include <errno.h> +#include <unistd.h> +#include "winsup.h" + +extern "C" +int +_fcntl (int fd, int cmd,...) +{ + va_list args; + int arg = 0; + int res; + SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK, "_fcntl"); + + if (dtable.not_open (fd)) + { + set_errno (EBADF); + res = -1; + goto done; + } + + switch (cmd) + { + case F_DUPFD: + va_start (args, cmd); + arg = va_arg (args,int); + va_end (args); + res = dup2 (fd, dtable.find_unused_handle (arg)); + goto done; + + case F_GETFD: + res = dtable[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); + dtable[fd]->set_close_on_exec (arg); + res = 0; + goto done; + + case F_GETFL: + { + res = dtable[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); + + dtable[fd]->set_access (temp); + dtable[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 = dtable[fd]->lock (cmd, fl); + goto done; + } + default: + set_errno (EINVAL); + res = -1; + goto done; + } + + set_errno (ENOSYS); + res = -1; + + done: + ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK,"_fcntl"); + + syscall_printf ("%d = fcntl (%d, %d, %d)", res, fd, cmd, arg); + return res; +} |