diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2003-12-01 17:26:28 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2003-12-01 17:26:28 +0000 |
commit | dc3998682acd295299bffc3c544af74503e1dc02 (patch) | |
tree | 9d483f863e7902630121a627e6db18f632e3ad60 /winsup/cygwin/fhandler_disk_file.cc | |
parent | 6c2b7846124572ffed3ce4fea074cc89e732651c (diff) | |
download | cygnal-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.cc | 39 |
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) |