Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2008-04-01 14:22:33 +0400
committerCorinna Vinschen <corinna@vinschen.de>2008-04-01 14:22:33 +0400
commitfabfb1a1ee52bc5ff248e708de5e7dc56cd6a170 (patch)
tree2d471f2e6ebf7757d28a889cec5ec987fdb4e00a /winsup/cygwin/fcntl.cc
parent636c94d8539476b691bdfff748282027a970725b (diff)
Throughout, call fcntl64 instead of fcntl or fcntl_worker.
* fcntl.cc (fcntl_worker): Remove. (fcntl64): Add fault handler. Move fcntl_worker stuff here. Add case for locking and call fhandler's lock method directly. Make sure that F_FLOCK flag isn't set in lock call. (_fcntl): Add fault handler. * fhandler.cc (fhandler_base::fcntl): Drop lock cases. * flock.cc (flock): Add fault handler. Simplify code. Call fhandlers lock method directly instead of fcntl_worker. Add debug output. (lockf): Add fault handler. Call fhandlers lock method directly instead of fcntl_worker. Add debug output. * winsup.h (fcntl_worker): Drop declaration. (fcntl64): Declare.
Diffstat (limited to 'winsup/cygwin/fcntl.cc')
-rw-r--r--winsup/cygwin/fcntl.cc54
1 files changed, 32 insertions, 22 deletions
diff --git a/winsup/cygwin/fcntl.cc b/winsup/cygwin/fcntl.cc
index f9a023ec4..7c2a218ff 100644
--- a/winsup/cygwin/fcntl.cc
+++ b/winsup/cygwin/fcntl.cc
@@ -20,10 +20,12 @@ details. */
#include "thread.h"
#include "cygtls.h"
-int
-fcntl_worker (int fd, int cmd, void *arg)
+extern "C" int
+fcntl64 (int fd, int cmd, ...)
{
- int res;
+ int res = -1;
+ void *arg = NULL;
+ va_list args;
myfault efault;
if (efault.faulted (EFAULT))
@@ -31,32 +33,36 @@ fcntl_worker (int fd, int cmd, void *arg)
cygheap_fdget cfd (fd, true);
if (cfd < 0)
+ goto done;
+
+ va_start (args, cmd);
+ arg = va_arg (args, void *);
+ va_end (args);
+
+ switch (cmd)
{
- res = -1;
- goto done;
+ case F_DUPFD:
+ res = dup2 (fd, cygheap_fdnew (((int) arg) - 1));
+ break;
+ case F_GETLK:
+ case F_SETLK:
+ case F_SETLKW:
+ {
+ struct __flock64 *fl = (struct __flock64 *) arg;
+ fl->l_type &= F_RDLCK | F_WRLCK | F_UNLCK;
+ res = cfd->lock (cmd, fl);
+ }
+ break;
+ default:
+ res = cfd->fcntl (cmd, arg);
+ break;
}
- if (cmd != F_DUPFD)
- res = cfd->fcntl (cmd, arg);
- else
- res = dup2 (fd, cygheap_fdnew (((int) arg) - 1));
done:
syscall_printf ("%d = fcntl (%d, %d, %p)", res, fd, cmd, arg);
return res;
}
extern "C" int
-fcntl64 (int fd, int cmd, ...)
-{
- void *arg = NULL;
- va_list args;
-
- va_start (args, cmd);
- arg = va_arg (args, void *);
- va_end (args);
- return fcntl_worker (fd, cmd, arg);
-}
-
-extern "C" int
_fcntl (int fd, int cmd, ...)
{
void *arg = NULL;
@@ -64,6 +70,10 @@ _fcntl (int fd, int cmd, ...)
struct __flock32 *src = NULL;
struct __flock64 dst;
+ myfault efault;
+ if (efault.faulted (EFAULT))
+ return -1;
+
va_start (args, cmd);
arg = va_arg (args, void *);
va_end (args);
@@ -77,7 +87,7 @@ _fcntl (int fd, int cmd, ...)
dst.l_pid = src->l_pid;
arg = &dst;
}
- int res = fcntl_worker (fd, cmd, arg);
+ int res = fcntl64 (fd, cmd, arg);
if (cmd == F_GETLK)
{
src->l_type = dst.l_type;