aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2011-12-31 20:26:14 +0000
committerChristian Grothoff <christian@grothoff.org>2011-12-31 20:26:14 +0000
commit733b4a4947f50dee6c570ea7f5fe11d4cee807a4 (patch)
treeed25799a1534d26ae5370d358699780a2488352b
parent95501d29b530b2c02efd81d8b9f3b7836edab51d (diff)
downloadgnunet-733b4a4947f50dee6c570ea7f5fe11d4cee807a4.tar.gz
gnunet-733b4a4947f50dee6c570ea7f5fe11d4cee807a4.zip
-LRN: 64-bit offsets for file locking on W32
-rw-r--r--src/util/disk.c18
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;