9
9
#pragma warning(disable : 4995)
10
10
#ifdef WINDOWS
11
11
#include < direct.h>
12
- #include < fcntl.h>
13
12
#include < sys/stat.h>
13
+ #else
14
+ #include < sys/mman.h>
14
15
#endif
16
+ #include < fcntl.h>
15
17
#pragma warning(pop)
16
18
17
19
#include " FS_internal.h"
@@ -159,10 +161,14 @@ CLocatorAPI::CLocatorAPI() : bNoRecurse(true), m_auth_code(0),
159
161
#endif // CONFIG_PROFILE_LOCKS
160
162
{
161
163
m_Flags.zero ();
164
+ #ifdef WINDOWS
162
165
// get page size
163
166
SYSTEM_INFO sys_inf;
164
167
GetSystemInfo (&sys_inf);
165
168
dwAllocGranularity = sys_inf.dwAllocationGranularity ;
169
+ #else
170
+ dwAllocGranularity = sysconf (_SC_PAGE_SIZE);
171
+ #endif
166
172
m_iLockRescan = 0 ;
167
173
dwOpenCounter = 0 ;
168
174
}
@@ -253,24 +259,43 @@ IReader* open_chunk(void* ptr, u32 ID)
253
259
{
254
260
u32 dwType, dwSize;
255
261
DWORD read_byte;
262
+ #ifdef WINDOWS
256
263
u32 pt = SetFilePointer (ptr, 0 , nullptr , FILE_BEGIN);
257
264
VERIFY (pt != INVALID_SET_FILE_POINTER);
265
+ #else
266
+ rewind (ptr);
267
+ #endif
258
268
while (true )
259
269
{
270
+ #ifdef WINDOWS
260
271
bool res = ReadFile (ptr, &dwType, 4 , &read_byte, nullptr );
272
+ #else
273
+ read_byte = read (ptr, &dwType, 4 );
274
+ bool res = true ;
275
+ #endif
261
276
if (read_byte == 0 )
262
277
return nullptr ;
263
278
// . VERIFY(res&&(read_byte==4));
264
279
280
+ #ifdef WINDOWS
265
281
res = ReadFile (ptr, &dwSize, 4 , &read_byte, nullptr );
282
+ #else
283
+ read_byte = read (ptr, &dwSize, 4 );
284
+ res = true ;
285
+ #endif
266
286
if (read_byte == 0 )
267
287
return nullptr ;
268
288
// . VERIFY(res&&(read_byte==4));
269
289
270
290
if ((dwType & ~CFS_CompressMark) == ID)
271
291
{
272
292
u8 * src_data = xr_alloc<u8 >(dwSize);
293
+ #ifdef WINDOWS
273
294
res = ReadFile (ptr, src_data, dwSize, &read_byte, nullptr );
295
+ #else
296
+ read_byte = read (ptr, src_data, dwSize);
297
+ res = true ;
298
+ #endif
274
299
VERIFY (res && (read_byte == dwSize));
275
300
if (dwType & CFS_CompressMark)
276
301
{
@@ -282,9 +307,11 @@ IReader* open_chunk(void* ptr, u32 ID)
282
307
}
283
308
return new CTempReader (src_data, dwSize, 0 );
284
309
}
310
+ #ifdef WINDOWS
285
311
pt = SetFilePointer (ptr, dwSize, nullptr , FILE_CURRENT);
286
312
if (pt == INVALID_SET_FILE_POINTER)
287
313
return nullptr ;
314
+ #endif
288
315
}
289
316
return nullptr ;
290
317
};
@@ -383,20 +410,35 @@ void CLocatorAPI::archive::open()
383
410
if (hSrcFile && hSrcMap)
384
411
return ;
385
412
413
+ #ifdef WINDOWS
386
414
hSrcFile = CreateFile (*path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr , OPEN_EXISTING, 0 , nullptr );
387
415
R_ASSERT (hSrcFile != INVALID_HANDLE_VALUE);
388
416
hSrcMap = CreateFileMapping (hSrcFile, nullptr , PAGE_READONLY, 0 , 0 , nullptr );
389
417
R_ASSERT (hSrcMap != INVALID_HANDLE_VALUE);
390
418
size = GetFileSize (hSrcFile, nullptr );
391
419
R_ASSERT (size > 0 );
420
+ #else
421
+ hSrcFile = ::open (*path, O_RDONLY|O_NONBLOCK);
422
+ struct stat statbuf;
423
+ int rc = fstat (hSrcFile, &statbuf);
424
+ hSrcMap = mmap (0 , statbuf.st_size , PROT_READ, MAP_SHARED, hSrcFile, 0 );
425
+ size = (rc == 0 ? statbuf.st_size : -1 );
426
+ #endif
392
427
}
393
428
394
429
void CLocatorAPI::archive::close ()
395
430
{
431
+ #ifdef WINDOWS
396
432
CloseHandle (hSrcMap);
397
433
hSrcMap = nullptr ;
398
434
CloseHandle (hSrcFile);
399
435
hSrcFile = nullptr ;
436
+ #else
437
+ munmap (hSrcMap, size);
438
+ hSrcMap = nullptr ;
439
+ ::close (hSrcFile);
440
+ hSrcFile = nullptr ;
441
+ #endif
400
442
}
401
443
402
444
void CLocatorAPI::ProcessArchive (pcstr _path)
0 commit comments