mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-05 03:24:56 +08:00
filesystem: initial set of fixes for big endian
This commit is contained in:
@@ -1465,7 +1465,7 @@ static qboolean FS_CheckForCrypt( const char *dllname )
|
||||
FS_Read( f, &key, sizeof( key ));
|
||||
FS_Close( f );
|
||||
|
||||
return ( key == 0x12345678 ) ? true : false;
|
||||
return ( key == LittleLong( 0x12345678 )) ? true : false;
|
||||
}
|
||||
|
||||
static int FS_StripIdiotRelativePath( const char *dllname, const char *gamefolder )
|
||||
|
||||
@@ -102,6 +102,7 @@ static pack_t *FS_LoadPackPAK( const char *packfile, int *error )
|
||||
int numpackfiles;
|
||||
pack_t *pack;
|
||||
fs_size_t c;
|
||||
int i;
|
||||
|
||||
// TODO: use FS_Open to allow PK3 to be included into other archives
|
||||
// Currently, it doesn't work with rodir due to FS_FindFile logic
|
||||
@@ -118,7 +119,7 @@ static pack_t *FS_LoadPackPAK( const char *packfile, int *error )
|
||||
|
||||
c = FS_Read( packhandle, (void *)&header, sizeof( header ));
|
||||
|
||||
if( c != sizeof( header ) || header.ident != IDPACKV1HEADER )
|
||||
if( c != sizeof( header ) || header.ident != LittleLong( IDPACKV1HEADER ))
|
||||
{
|
||||
Con_Reportf( "%s is not a packfile. Ignored.\n", packfile );
|
||||
if( error ) *error = PAK_LOAD_BAD_HEADER;
|
||||
@@ -126,6 +127,10 @@ static pack_t *FS_LoadPackPAK( const char *packfile, int *error )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
header.ident = LittleLong( header.ident );
|
||||
header.dirofs = LittleLong( header.dirofs );
|
||||
header.dirlen = LittleLong( header.dirlen );
|
||||
|
||||
if( header.dirlen % sizeof( dpackfile_t ))
|
||||
{
|
||||
Con_Reportf( S_ERROR "%s has an invalid directory size. Ignored.\n", packfile );
|
||||
@@ -165,6 +170,12 @@ static pack_t *FS_LoadPackPAK( const char *packfile, int *error )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for( i = 0; i < numpackfiles; i++ )
|
||||
{
|
||||
pack->files[i].filepos = LittleLong( pack->files[i].filepos );
|
||||
pack->files[i].filelen = LittleLong( pack->files[i].filelen );
|
||||
}
|
||||
|
||||
// TODO: validate directory?
|
||||
|
||||
pack->handle = packhandle;
|
||||
|
||||
@@ -305,7 +305,7 @@ static wfile_t *W_Open( const char *filename, int *error, uint flags )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if( header.ident != IDWAD2HEADER && header.ident != IDWAD3HEADER )
|
||||
if( header.ident != LittleLong( IDWAD2HEADER ) && header.ident != LittleLong( IDWAD3HEADER ))
|
||||
{
|
||||
Con_Reportf( S_ERROR "%s: %s is not a WAD2 or WAD3 file\n", __func__, filename );
|
||||
if( error ) *error = WAD_LOAD_BAD_HEADER;
|
||||
@@ -313,6 +313,10 @@ static wfile_t *W_Open( const char *filename, int *error, uint flags )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
header.ident = LittleLong( header.ident );
|
||||
header.numlumps = LittleLong( header.numlumps );
|
||||
header.infotableofs = LittleLong( header.infotableofs );
|
||||
|
||||
lumpcount = header.numlumps;
|
||||
|
||||
if( lumpcount >= MAX_FILES_IN_WAD )
|
||||
@@ -353,6 +357,13 @@ static wfile_t *W_Open( const char *filename, int *error, uint flags )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for( i = 0; i < lumpcount; i++ )
|
||||
{
|
||||
srclumps[i].filepos = LittleLong( srclumps[i].filepos );
|
||||
srclumps[i].disksize = LittleLong( srclumps[i].disksize );
|
||||
srclumps[i].size = LittleLong( srclumps[i].size );
|
||||
}
|
||||
|
||||
// starting to add lumps
|
||||
wad->lumps = (dlumpinfo_t *)Mem_Calloc( wad->mempool, lat_size );
|
||||
wad->numlumps = 0;
|
||||
|
||||
@@ -209,7 +209,7 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error )
|
||||
|
||||
c = FS_Read( zip->handle, &signature, sizeof( signature ));
|
||||
|
||||
if( c != sizeof( signature ) || signature == ZIP_HEADER_EOCD )
|
||||
if( c != sizeof( signature ) || signature == LittleLong( ZIP_HEADER_EOCD ))
|
||||
{
|
||||
Con_Reportf( S_WARN "%s has no files. Ignored.\n", zipfile );
|
||||
|
||||
@@ -220,7 +220,7 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if( signature != ZIP_HEADER_LF )
|
||||
if( signature != LittleLong( ZIP_HEADER_LF ))
|
||||
{
|
||||
Con_Reportf( S_ERROR "%s is not a zip file. Ignored.\n", zipfile );
|
||||
|
||||
@@ -239,13 +239,13 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error )
|
||||
FS_Seek( zip->handle, filepos, SEEK_SET );
|
||||
c = FS_Read( zip->handle, &signature, sizeof( signature ));
|
||||
|
||||
if( c == sizeof( signature ) && signature == ZIP_HEADER_EOCD )
|
||||
if( c == sizeof( signature ) && signature == LittleLong( ZIP_HEADER_EOCD ))
|
||||
break;
|
||||
|
||||
filepos -= sizeof( char ); // step back one byte
|
||||
}
|
||||
|
||||
if( ZIP_HEADER_EOCD != signature )
|
||||
if( signature != LittleLong( ZIP_HEADER_EOCD ))
|
||||
{
|
||||
Con_Reportf( S_ERROR "cannot find EOCD in %s. Zip file corrupted.\n", zipfile );
|
||||
|
||||
@@ -269,6 +269,14 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
header_eocd.disk_number = LittleShort( header_eocd.disk_number );
|
||||
header_eocd.start_disk_number = LittleShort( header_eocd.start_disk_number );
|
||||
header_eocd.number_central_directory_record = LittleShort( header_eocd.number_central_directory_record );
|
||||
header_eocd.total_central_directory_record = LittleShort( header_eocd.total_central_directory_record );
|
||||
header_eocd.size_of_central_directory = LittleLong( header_eocd.size_of_central_directory );
|
||||
header_eocd.central_directory_offset = LittleLong( header_eocd.central_directory_offset );
|
||||
header_eocd.commentary_len = LittleShort( header_eocd.commentary_len );
|
||||
|
||||
if( header_eocd.total_central_directory_record == 0 ) // refuse to load empty ZIP archives
|
||||
{
|
||||
Con_Reportf( S_WARN "%s has no files (total records is zero). Ignored.\n", zipfile );
|
||||
@@ -291,7 +299,7 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error )
|
||||
{
|
||||
c = FS_Read( zip->handle, &header_cdf, sizeof( header_cdf ));
|
||||
|
||||
if( c != sizeof( header_cdf ) || header_cdf.signature != ZIP_HEADER_CDF )
|
||||
if( c != sizeof( header_cdf ) || header_cdf.signature != LittleLong( ZIP_HEADER_CDF ))
|
||||
{
|
||||
Con_Reportf( S_ERROR "CDF signature mismatch in %s. Zip file corrupted.\n", zipfile );
|
||||
|
||||
@@ -302,6 +310,24 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
header_cdf.signature = LittleLong( header_cdf.signature );
|
||||
header_cdf.version = LittleShort( header_cdf.version );
|
||||
header_cdf.version_need = LittleShort( header_cdf.version_need );
|
||||
header_cdf.generalPurposeBitFlag = LittleShort( header_cdf.generalPurposeBitFlag );
|
||||
header_cdf.flags = LittleShort( header_cdf.flags );
|
||||
header_cdf.modification_time = LittleShort( header_cdf.modification_time );
|
||||
header_cdf.modification_date = LittleShort( header_cdf.modification_date );
|
||||
header_cdf.crc32 = LittleLong( header_cdf.crc32 );
|
||||
header_cdf.compressed_size = LittleLong( header_cdf.compressed_size );
|
||||
header_cdf.uncompressed_size = LittleLong( header_cdf.uncompressed_size );
|
||||
header_cdf.filename_len = LittleShort( header_cdf.filename_len );
|
||||
header_cdf.extrafield_len = LittleShort( header_cdf.extrafield_len );
|
||||
header_cdf.file_commentary_len = LittleShort( header_cdf.file_commentary_len );
|
||||
header_cdf.disk_start = LittleShort( header_cdf.disk_start );
|
||||
header_cdf.internal_attr = LittleShort( header_cdf.internal_attr );
|
||||
header_cdf.external_attr = LittleLong( header_cdf.external_attr );
|
||||
header_cdf.local_header_offset = LittleLong( header_cdf.local_header_offset );
|
||||
|
||||
if( header_cdf.uncompressed_size && header_cdf.filename_len && header_cdf.filename_len < sizeof( filename_buffer ))
|
||||
{
|
||||
memset( &filename_buffer, '\0', sizeof( filename_buffer ));
|
||||
@@ -365,6 +391,17 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
header.signature = LittleLong( header.signature );
|
||||
header.version = LittleShort( header.version );
|
||||
header.flags = LittleShort( header.flags );
|
||||
header.compression_flags = LittleShort( header.compression_flags );
|
||||
header.dos_date = LittleLong( header.dos_date );
|
||||
header.crc32 = LittleLong( header.crc32 );
|
||||
header.compressed_size = LittleLong( header.compressed_size );
|
||||
header.uncompressed_size = LittleLong( header.uncompressed_size );
|
||||
header.filename_len = LittleShort( header.filename_len );
|
||||
header.extrafield_len = LittleShort( header.extrafield_len );
|
||||
|
||||
info[i].flags = header.compression_flags;
|
||||
info[i].offset = info[i].offset + header.filename_len + header.extrafield_len + sizeof( header );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user