diff options
author | Christian Grothoff <christian@grothoff.org> | 2011-12-31 20:26:14 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2011-12-31 20:26:14 +0000 |
commit | 733b4a4947f50dee6c570ea7f5fe11d4cee807a4 (patch) | |
tree | ed25799a1534d26ae5370d358699780a2488352b | |
parent | 95501d29b530b2c02efd81d8b9f3b7836edab51d (diff) | |
download | gnunet-733b4a4947f50dee6c570ea7f5fe11d4cee807a4.tar.gz gnunet-733b4a4947f50dee6c570ea7f5fe11d4cee807a4.zip |
-LRN: 64-bit offsets for file locking on W32
-rw-r--r-- | src/util/disk.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/util/disk.c b/src/util/disk.c index dd2c4fb9d..e6b542adf 100644 --- a/src/util/disk.c +++ b/src/util/disk.c | |||
@@ -1273,13 +1273,18 @@ GNUNET_DISK_file_lock (struct GNUNET_DISK_FileHandle *fh, OFF_T lockStart, | |||
1273 | return fcntl (fh->fd, F_SETLK, &fl) != 0 ? GNUNET_SYSERR : GNUNET_OK; | 1273 | return fcntl (fh->fd, F_SETLK, &fl) != 0 ? GNUNET_SYSERR : GNUNET_OK; |
1274 | #else | 1274 | #else |
1275 | OVERLAPPED o; | 1275 | OVERLAPPED o; |
1276 | OFF_T diff = lockEnd - lockStart; | ||
1277 | DWORD diff_low, diff_high; | ||
1278 | diff_low = (DWORD) (diff & 0xFFFFFFFF); | ||
1279 | diff_high = (DWORD) ((diff >> (sizeof (DWORD) * 8)) & 0xFFFFFFFF); | ||
1276 | 1280 | ||
1277 | memset (&o, 0, sizeof (OVERLAPPED)); | 1281 | memset (&o, 0, sizeof (OVERLAPPED)); |
1278 | o.Offset = lockStart; | 1282 | o.Offset = (DWORD) (lockStart & 0xFFFFFFFF);; |
1283 | o.OffsetHigh = (DWORD) (((lockStart & ~0xFFFFFFFF) >> (sizeof (DWORD) * 8)) & 0xFFFFFFFF); | ||
1279 | 1284 | ||
1280 | if (!LockFileEx | 1285 | if (!LockFileEx |
1281 | (fh->h, (excl ? LOCKFILE_EXCLUSIVE_LOCK : 0) | LOCKFILE_FAIL_IMMEDIATELY, | 1286 | (fh->h, (excl ? LOCKFILE_EXCLUSIVE_LOCK : 0) | LOCKFILE_FAIL_IMMEDIATELY, |
1282 | 0, lockEnd - lockStart, 0, &o)) | 1287 | 0, diff_low, diff_high, &o)) |
1283 | { | 1288 | { |
1284 | SetErrnoFromWinError (GetLastError ()); | 1289 | SetErrnoFromWinError (GetLastError ()); |
1285 | return GNUNET_SYSERR; | 1290 | return GNUNET_SYSERR; |
@@ -1319,11 +1324,16 @@ GNUNET_DISK_file_unlock (struct GNUNET_DISK_FileHandle *fh, OFF_T unlockStart, | |||
1319 | return fcntl (fh->fd, F_SETLK, &fl) != 0 ? GNUNET_SYSERR : GNUNET_OK; | 1324 | return fcntl (fh->fd, F_SETLK, &fl) != 0 ? GNUNET_SYSERR : GNUNET_OK; |
1320 | #else | 1325 | #else |
1321 | OVERLAPPED o; | 1326 | OVERLAPPED o; |
1327 | OFF_T diff = unlockEnd - unlockStart; | ||
1328 | DWORD diff_low, diff_high; | ||
1329 | diff_low = (DWORD) (diff & 0xFFFFFFFF); | ||
1330 | diff_high = (DWORD) ((diff >> (sizeof (DWORD) * 8)) & 0xFFFFFFFF); | ||
1322 | 1331 | ||
1323 | memset (&o, 0, sizeof (OVERLAPPED)); | 1332 | memset (&o, 0, sizeof (OVERLAPPED)); |
1324 | o.Offset = unlockStart; | 1333 | o.Offset = (DWORD) (unlockStart & 0xFFFFFFFF);; |
1334 | o.OffsetHigh = (DWORD) (((unlockStart & ~0xFFFFFFFF) >> (sizeof (DWORD) * 8)) & 0xFFFFFFFF); | ||
1325 | 1335 | ||
1326 | if (!UnlockFileEx (fh->h, 0, unlockEnd - unlockStart, 0, &o)) | 1336 | if (!UnlockFileEx (fh->h, 0, diff_low, diff_high, &o)) |
1327 | { | 1337 | { |
1328 | SetErrnoFromWinError (GetLastError ()); | 1338 | SetErrnoFromWinError (GetLastError ()); |
1329 | return GNUNET_SYSERR; | 1339 | return GNUNET_SYSERR; |