summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_disk_file.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2003-12-01 17:26:28 +0000
committerCorinna Vinschen <corinna@vinschen.de>2003-12-01 17:26:28 +0000
commitdc3998682acd295299bffc3c544af74503e1dc02 (patch)
tree9d483f863e7902630121a627e6db18f632e3ad60 /winsup/cygwin/fhandler_disk_file.cc
parent6c2b7846124572ffed3ce4fea074cc89e732651c (diff)
downloadcygnal-dc3998682acd295299bffc3c544af74503e1dc02.tar.gz
cygnal-dc3998682acd295299bffc3c544af74503e1dc02.tar.bz2
cygnal-dc3998682acd295299bffc3c544af74503e1dc02.zip
* Makefile.in (OBSOLETE_FUNCTIONS): Add fcntl.
(NEW_FUNCTIONS): Add fcntl64. * cygwin.din: Export fcntl64. Make fcntl being SIGFE. * fcntl.cc (fcntl_worker): New function. (fcntl64): New function. (_fcntl): Call fcntl_worker. Convert 32 bit flock structure into 64 bit flock structure and vice versa. * fhandler.cc (fhandler_base::lock): Change 2nd parameter to struct __flock64 *. * fhandler_disk_file.cc (fhandler_disk_file::lock): Ditto. Rework to be 64 bit aware. * fhandler.h: Accomodate above method argument changes. * include/cygwin/types.h: Add struct __flock32 and __flock64. Define struct flock according to setting of __CYGWIN_USE_BIG_TYPES__. * include/cygwin/version.h: Bump API minor number.
Diffstat (limited to 'winsup/cygwin/fhandler_disk_file.cc')
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc39
1 files changed, 21 insertions, 18 deletions
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
index faebc4511..c51eace2a 100644
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ b/winsup/cygwin/fhandler_disk_file.cc
@@ -460,11 +460,10 @@ fhandler_base::close_fs ()
the best. */
int
-fhandler_disk_file::lock (int cmd, struct flock *fl)
+fhandler_disk_file::lock (int cmd, struct __flock64 *fl)
{
_off64_t win32_start;
- int win32_len;
- DWORD win32_upper;
+ _off64_t win32_len;
_off64_t startpos;
/*
@@ -535,17 +534,22 @@ fhandler_disk_file::lock (int cmd, struct flock *fl)
win32_start = 0;
}
- /*
- * Special case if len == 0 for POSIX means lock
- * to the end of the entire file (and all future extensions).
- */
+ DWORD off_high, off_low, len_high, len_low;
+
+ off_high = (DWORD)(win32_start & 0xffffffff);
+ off_low = (DWORD)(win32_start >> 32);
if (win32_len == 0)
{
- win32_len = 0xffffffff;
- win32_upper = wincap.lock_file_highword ();
+ /* Special case if len == 0 for POSIX means lock to the end of
+ the entire file (and all future extensions). */
+ len_low = 0xffffffff;
+ len_high = wincap.lock_file_highword ();
}
else
- win32_upper = 0;
+ {
+ len_low = (DWORD)(win32_len & 0xffffffff);
+ len_high = (DWORD)(win32_len >> 32);
+ }
BOOL res;
@@ -558,18 +562,18 @@ fhandler_disk_file::lock (int cmd, struct flock *fl)
ov.Internal = 0;
ov.InternalHigh = 0;
- ov.Offset = (DWORD)win32_start;
- ov.OffsetHigh = 0;
+ ov.Offset = off_low;
+ ov.OffsetHigh = off_high;
ov.hEvent = (HANDLE) 0;
if (fl->l_type == F_UNLCK)
{
- res = UnlockFileEx (get_handle (), 0, (DWORD)win32_len, win32_upper, &ov);
+ res = UnlockFileEx (get_handle (), 0, len_low, len_high, &ov);
}
else
{
- res = LockFileEx (get_handle (), lock_flags, 0, (DWORD)win32_len,
- win32_upper, &ov);
+ res = LockFileEx (get_handle (), lock_flags, 0,
+ len_low, len_high, &ov);
/* Deal with the fail immediately case. */
/*
* FIXME !! I think this is the right error to check for
@@ -587,10 +591,9 @@ fhandler_disk_file::lock (int cmd, struct flock *fl)
{
/* Windows 95 -- use primitive lock call */
if (fl->l_type == F_UNLCK)
- res = UnlockFile (get_handle (), (DWORD)win32_start, 0, (DWORD)win32_len,
- win32_upper);
+ res = UnlockFile (get_handle (), off_low, off_high, len_low, len_high);
else
- res = LockFile (get_handle (), (DWORD)win32_start, 0, (DWORD)win32_len, win32_upper);
+ res = LockFile (get_handle (), off_low, off_high, len_low, len_high);
}
if (res == 0)