2
2
#include < vector> // wide characters
3
3
#include " ../incWin.h"
4
4
#include < io.h> // _get_osfhandle
5
- #define fseek _fseeki64
6
- #define ftell _ftelli64
5
+ #define fseek64 _fseeki64
6
+ #define ftell64 _ftelli64
7
+ #define fseek invalidFunctionFseek
8
+ #define ftell invalidFunctionFtell
7
9
#else
8
10
#define _FILE_OFFSET_BITS 64
9
11
#include < dirent.h>
10
12
#include < sys/stat.h>
11
13
#include < unistd.h>
14
+ #define fseek64 fseeko64
15
+ #define ftell64 ftello64
12
16
#endif
13
17
#ifdef CAGE_SYSTEM_MAC
14
18
#include < mach-o/dyld.h>
@@ -179,53 +183,71 @@ namespace cage
179
183
{
180
184
CAGE_ASSERT (f);
181
185
#ifdef CAGE_SYSTEM_WINDOWS
182
- HANDLE handle = (HANDLE)_get_osfhandle (_fileno (f));
186
+ const HANDLE handle = (HANDLE)_get_osfhandle (_fileno (f));
183
187
uint64 off = 0 ;
184
188
uint64 s = buffer.size ();
185
189
while (s > 0 )
186
190
{
187
191
OVERLAPPED o;
188
192
detail::memset (&o, 0 , sizeof (o));
189
- uint64 p = at + off;
193
+ const uint64 p = at + off;
190
194
o.Offset = (DWORD)p;
191
195
o.OffsetHigh = (DWORD)((uint64)p >> 32 );
192
- uint64 k = min (s, (uint64)1024 * 1024 * 1024 ); // write in chunks of 1 GB
196
+ const uint64 k = min (s, (uint64)1024 * 1024 * 1024 ); // read in chunks of 1 GB
193
197
DWORD r = 0 ;
194
198
if (!ReadFile (handle, buffer.data () + off, numeric_cast<DWORD>(k), &r, &o) || r != k)
195
199
CAGE_THROW_ERROR (SystemError, " ReadFile" , GetLastError ());
196
200
off += k;
197
201
s -= k;
198
202
}
199
203
#else
200
- if (pread (fileno (f), buffer.data (), buffer.size (), at) != buffer.size ())
201
- CAGE_THROW_ERROR (SystemError, " pread" , errno);
204
+ const int handle = fileno (f);
205
+ uint64 off = 0 ;
206
+ uint64 s = buffer.size ();
207
+ while (s > 0 )
208
+ {
209
+ const uint64 k = min (s, (uint64)1024 * 1024 * 1024 ); // read in chunks of 1 GB
210
+ if (pread64 (handle, buffer.data () + off, k, at) != k)
211
+ CAGE_THROW_ERROR (SystemError, " pread" , errno);
212
+ off += k;
213
+ s -= k;
214
+ }
202
215
#endif
203
216
}
204
217
205
218
void writeAtImpl (PointerRange<const char > buffer, const uint64 at, FILE *f)
206
219
{
207
220
CAGE_ASSERT (f);
208
221
#ifdef CAGE_SYSTEM_WINDOWS
209
- HANDLE handle = (HANDLE)_get_osfhandle (_fileno (f));
222
+ const HANDLE handle = (HANDLE)_get_osfhandle (_fileno (f));
210
223
uint64 off = 0 ;
211
224
uint64 s = buffer.size ();
212
225
while (s > 0 )
213
226
{
214
227
OVERLAPPED o;
215
228
detail::memset (&o, 0 , sizeof (o));
216
- uint64 p = at + off;
229
+ const uint64 p = at + off;
217
230
o.Offset = (DWORD)p;
218
231
o.OffsetHigh = (DWORD)((uint64)p >> 32 );
219
- uint64 k = min (s, (uint64)1024 * 1024 * 1024 ); // write in chunks of 1 GB
232
+ const uint64 k = min (s, (uint64)1024 * 1024 * 1024 ); // write in chunks of 1 GB
220
233
DWORD r = 0 ;
221
234
if (!WriteFile (handle, buffer.data () + off, numeric_cast<DWORD>(k), &r, &o) || r != k)
222
235
CAGE_THROW_ERROR (SystemError, " WriteFile" , GetLastError ());
223
236
off += k;
224
237
s -= k;
225
238
}
226
239
#else
227
- if (pwrite (fileno (f), buffer.data (), buffer.size (), at) != buffer.size ())
228
- CAGE_THROW_ERROR (SystemError, " pwrite" , errno);
240
+ const int handle = fileno (f);
241
+ uint64 off = 0 ;
242
+ uint64 s = buffer.size ();
243
+ while (s > 0 )
244
+ {
245
+ const uint64 k = min (s, (uint64)1024 * 1024 * 1024 ); // write in chunks of 1 GB
246
+ if (pwrite64 (handle, buffer.data () + off, k, at) != k)
247
+ CAGE_THROW_ERROR (SystemError, " pwrite" , errno);
248
+ off += k;
249
+ s -= k;
250
+ }
229
251
#endif
230
252
}
231
253
@@ -300,7 +322,7 @@ namespace cage
300
322
{
301
323
CAGE_ASSERT (f);
302
324
CAGE_ASSERT (position <= size ());
303
- if (fseek (f, position, 0 ) != 0 )
325
+ if (fseek64 (f, position, 0 ) != 0 )
304
326
CAGE_THROW_ERROR (SystemError, " fseek" , errno);
305
327
}
306
328
@@ -316,16 +338,16 @@ namespace cage
316
338
uint64 tell () override
317
339
{
318
340
CAGE_ASSERT (f);
319
- return ftell (f);
341
+ return ftell64 (f);
320
342
}
321
343
322
344
uint64 size () override
323
345
{
324
346
CAGE_ASSERT (f);
325
- uint64 pos = ftell (f);
326
- fseek (f, 0 , 2 );
327
- uint64 siz = ftell (f);
328
- fseek (f, pos, 0 );
347
+ const uint64 pos = ftell64 (f);
348
+ fseek64 (f, 0 , 2 );
349
+ const uint64 siz = ftell64 (f);
350
+ fseek64 (f, pos, 0 );
329
351
return siz;
330
352
}
331
353
@@ -381,8 +403,8 @@ namespace cage
381
403
CAGE_ASSERT (f);
382
404
CAGE_ASSERT (myMode.read );
383
405
ff = f;
384
- at = ftell (f);
385
- if (fseek (f, at + buffer.size (), 0 ) != 0 )
406
+ at = ftell64 (f);
407
+ if (fseek64 (f, at + buffer.size (), 0 ) != 0 )
386
408
CAGE_THROW_ERROR (SystemError, " fseek" , errno);
387
409
}
388
410
readAtImpl (buffer, at, ff);
@@ -399,8 +421,8 @@ namespace cage
399
421
CAGE_ASSERT (f);
400
422
CAGE_ASSERT (myMode.write );
401
423
ff = f;
402
- at = ftell (f);
403
- if (fseek (f, at + buffer.size (), 0 ) != 0 )
424
+ at = ftell64 (f);
425
+ if (fseek64 (f, at + buffer.size (), 0 ) != 0 )
404
426
CAGE_THROW_ERROR (SystemError, " fseek" , errno);
405
427
}
406
428
writeAtImpl (buffer, at, ff);
0 commit comments