From 3d441febda6a22a6e35168f5f5f4218275cf8295 Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Fri, 3 Dec 2010 12:42:01 +0000 Subject: [PATCH] Attempt to fix issue r3458. I don't have a 32bit linux install, however I know it will at least fix compressing. Please test if uncompressed games run. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6510 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Common/Src/CommonFuncs.h | 2 ++ Source/Core/Common/Src/FileUtil.cpp | 22 ++++++++++++++++--- Source/Core/Common/Src/FileUtil.h | 6 +++++ Source/Core/Core/Src/Boot/Boot_ELF.cpp | 11 ++++------ Source/Core/Core/Src/Debugger/Dump.cpp | 5 ++--- .../Core/Src/HW/SI_DeviceGCController.cpp | 5 ----- Source/Core/Core/Src/State.cpp | 8 ++----- Source/Core/DSPCore/Src/disassemble.cpp | 4 +--- Source/Core/DiscIO/Src/CompressedBlob.cpp | 9 ++------ Source/Core/DiscIO/Src/FileBlob.cpp | 5 ++--- Source/Core/DiscIO/Src/VolumeGC.cpp | 2 +- Source/Core/DolphinWX/Src/Main.cpp | 5 +---- 12 files changed, 42 insertions(+), 42 deletions(-) diff --git a/Source/Core/Common/Src/CommonFuncs.h b/Source/Core/Common/Src/CommonFuncs.h index d3692ab4d3..48ee7e2549 100644 --- a/Source/Core/Common/Src/CommonFuncs.h +++ b/Source/Core/Common/Src/CommonFuncs.h @@ -94,6 +94,8 @@ char* strndup (char const *s, size_t n); #define ftell _ftelli64 #define atoll _atoi64 #define stat64 _stat64 + #define fstat64 _fstat64 + #define fileno _fileno #if _M_IX86 #define Crash() {__asm int 3} diff --git a/Source/Core/Common/Src/FileUtil.cpp b/Source/Core/Common/Src/FileUtil.cpp index bf57fbdd1c..d1c49cb067 100644 --- a/Source/Core/Common/Src/FileUtil.cpp +++ b/Source/Core/Common/Src/FileUtil.cpp @@ -345,6 +345,24 @@ u64 GetSize(const char *filename) return 0; } +// Overloaded GetSize, accepts file descriptor +u64 GetSize(const int fd) +{ + struct stat64 buf; + if (fstat64(fd, &buf) != 0) { + ERROR_LOG(COMMON, "GetSize: stat failed %i: %s", + fd, GetLastErrorMsg()); + return 0; + } + return buf.st_size; +} + +// Overloaded GetSize, accepts FILE* +u64 GetSize(FILE *f) +{ + return GetSize(fileno(f)); +} + // creates an empty file filename, returns true on success bool CreateEmptyFile(const char *filename) { @@ -769,9 +787,7 @@ bool ReadFileToString(bool text_file, const char *filename, std::string &str) FILE *f = fopen(filename, text_file ? "r" : "rb"); if (!f) return false; - fseek(f, 0, SEEK_END); - size_t len = (size_t)ftell(f); - fseek(f, 0, SEEK_SET); + size_t len = (size_t)GetSize(f); char *buf = new char[len + 1]; buf[fread(buf, 1, len, f)] = 0; str = std::string(buf, len); diff --git a/Source/Core/Common/Src/FileUtil.h b/Source/Core/Common/Src/FileUtil.h index bf2a3118cb..69f2b8bf6b 100644 --- a/Source/Core/Common/Src/FileUtil.h +++ b/Source/Core/Common/Src/FileUtil.h @@ -78,6 +78,12 @@ bool IsDirectory(const char *filename); // Returns the size of filename (64bit) u64 GetSize(const char *filename); +// Overloaded GetSize, accepts file descriptor +u64 GetSize(const int fd); + +// Overloaded GetSize, accepts FILE* +u64 GetSize(FILE *f); + // Returns true if successful, or path already exists. bool CreateDir(const char *filename); diff --git a/Source/Core/Core/Src/Boot/Boot_ELF.cpp b/Source/Core/Core/Src/Boot/Boot_ELF.cpp index 6ede52e482..78e281ad78 100644 --- a/Source/Core/Core/Src/Boot/Boot_ELF.cpp +++ b/Source/Core/Core/Src/Boot/Boot_ELF.cpp @@ -21,20 +21,19 @@ #include "Boot_ELF.h" #include "Boot_WiiWAD.h" #include "ElfReader.h" +#include "FileUtil.h" bool CBoot::IsElfWii(const char *filename) { /* We already check if filename existed before we called this function, so there is no need for another check, just read the file right away */ FILE *f = fopen(filename, "rb"); - fseek(f, 0, SEEK_END); - u64 filesize = ftell(f); - fseek(f, 0, SEEK_SET); + u64 filesize = File::GetSize(f); u8 *mem = new u8[(size_t)filesize]; fread(mem, 1, (size_t)filesize, f); fclose(f); - ElfReader reader(mem); + ElfReader reader(mem); // TODO: Find a more reliable way to distinguish. bool isWii = reader.GetEntryPoint() >= 0x80004000; delete[] mem; @@ -46,9 +45,7 @@ bool CBoot::IsElfWii(const char *filename) bool CBoot::Boot_ELF(const char *filename) { FILE *f = fopen(filename, "rb"); - fseek(f, 0, SEEK_END); - u64 filesize = ftell(f); - fseek(f, 0, SEEK_SET); + u64 filesize = File::GetSize(f); u8 *mem = new u8[(size_t)filesize]; fread(mem, 1, (size_t)filesize, f); fclose(f); diff --git a/Source/Core/Core/Src/Debugger/Dump.cpp b/Source/Core/Core/Src/Debugger/Dump.cpp index 52685f8676..b7ce75b84d 100644 --- a/Source/Core/Core/Src/Debugger/Dump.cpp +++ b/Source/Core/Core/Src/Debugger/Dump.cpp @@ -18,6 +18,7 @@ #include "Common.h" #include "Dump.h" +#include "FileUtil.h" CDump::CDump(const char* _szFilename) : m_pData(NULL), @@ -26,9 +27,7 @@ CDump::CDump(const char* _szFilename) : FILE* pStream = fopen(_szFilename, "rb"); if (pStream != NULL) { - fseek(pStream, 0, SEEK_END); - m_size = (size_t) ftell(pStream); - fseek(pStream, 0, SEEK_SET); + m_size = (size_t)File::GetSize(pStream); m_pData = new u8[m_size]; diff --git a/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp b/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp index 415cd64b0f..3cb3b83ac9 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp +++ b/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp @@ -100,11 +100,6 @@ int CSIDevice_GCController::RunBuffer(u8* _pBuffer, int _iLength) iPosition = _iLength; break; - // WII Something - this could be bogus - case 0xCE: - WARN_LOG(SERIALINTERFACE, "Unknown Wii SI Command"); - break; - // DEFAULT default: { diff --git a/Source/Core/Core/Src/State.cpp b/Source/Core/Core/Src/State.cpp index 8033a4661e..e827e23b22 100644 --- a/Source/Core/Core/Src/State.cpp +++ b/Source/Core/Core/Src/State.cpp @@ -353,9 +353,7 @@ void LoadStateCallback(u64 userdata, int cyclesLate) } else { - fseek(f, 0, SEEK_END); - sz = (int)(ftell(f) - sizeof(state_header)); - fseek(f, sizeof(state_header), SEEK_SET); + sz = (int)(File::GetSize(f) - sizeof(state_header)); buffer = new u8[sz]; int x; if ((x = (int)fread(buffer, 1, sz, f)) != (int)sz) @@ -455,9 +453,7 @@ void VerifyStateCallback(u64 userdata, int cyclesLate) } else { - fseek(f, 0, SEEK_END); - sz = (int)(ftell(f) - sizeof(int)); - fseek(f, sizeof(int), SEEK_SET); + sz = (int)(File::GetSize(f) - sizeof(int)); buffer = new u8[sz]; int x; if ((x = (int)fread(buffer, 1, sz, f)) != (int)sz) diff --git a/Source/Core/DSPCore/Src/disassemble.cpp b/Source/Core/DSPCore/Src/disassemble.cpp index 64d4497ae9..03a81ddb1a 100644 --- a/Source/Core/DSPCore/Src/disassemble.cpp +++ b/Source/Core/DSPCore/Src/disassemble.cpp @@ -343,9 +343,7 @@ bool DSPDisassembler::DisFile(const char* name, int base_addr, int pass, std::st return false; } - fseek(in, 0, SEEK_END); - int size = (int)ftell(in) & ~1; - fseek(in, 0, SEEK_SET); + int size = (int)File::GetSize(in) & ~1; u16 *binbuf = new u16[size / 2]; fread(binbuf, 1, size, in); fclose(in); diff --git a/Source/Core/DiscIO/Src/CompressedBlob.cpp b/Source/Core/DiscIO/Src/CompressedBlob.cpp index e822d45e6c..9d0daa74f7 100644 --- a/Source/Core/DiscIO/Src/CompressedBlob.cpp +++ b/Source/Core/DiscIO/Src/CompressedBlob.cpp @@ -39,9 +39,7 @@ CompressedBlobReader::CompressedBlobReader(const char *filename) { file_name = filename; file = fopen(filename, "rb"); - fseek(file, 0, SEEK_END); - file_size = ftell(file); - fseek(file, 0, SEEK_SET); + file_size = File::GetSize(filename); fread(&header, sizeof(CompressedBlobHeader), 1, file); SetSectorSize(header.block_size); @@ -190,14 +188,11 @@ bool CompressFileToBlob(const char* infile, const char* outfile, u32 sub_type, callback("Files opened, ready to compress.", 0, arg); - fseek(inf, 0, SEEK_END); - s64 insize = ftell(inf); - fseek(inf, 0, SEEK_SET); CompressedBlobHeader header; header.magic_cookie = kBlobCookie; header.sub_type = sub_type; header.block_size = block_size; - header.data_size = insize; + header.data_size = File::GetSize(infile); // round upwards! header.num_blocks = (u32)((header.data_size + (block_size - 1)) / block_size); diff --git a/Source/Core/DiscIO/Src/FileBlob.cpp b/Source/Core/DiscIO/Src/FileBlob.cpp index faee3e5c6c..d2ab9c0562 100644 --- a/Source/Core/DiscIO/Src/FileBlob.cpp +++ b/Source/Core/DiscIO/Src/FileBlob.cpp @@ -19,6 +19,7 @@ #include "Blob.h" #include "FileBlob.h" +#include "FileUtil.h" namespace DiscIO { @@ -26,9 +27,7 @@ namespace DiscIO PlainFileReader::PlainFileReader(FILE* file__) { file_ = file__; - fseek(file_, 0, SEEK_END); - size = ftell(file_); - fseek(file_, 0, SEEK_SET); + size = File::GetSize(file__); } PlainFileReader* PlainFileReader::Create(const char* filename) diff --git a/Source/Core/DiscIO/Src/VolumeGC.cpp b/Source/Core/DiscIO/Src/VolumeGC.cpp index e329b5d35f..2ae0f355cf 100644 --- a/Source/Core/DiscIO/Src/VolumeGC.cpp +++ b/Source/Core/DiscIO/Src/VolumeGC.cpp @@ -129,7 +129,7 @@ std::string CVolumeGC::GetApploaderDate() const u64 CVolumeGC::GetSize() const { if (m_pReader) - return (size_t)m_pReader->GetDataSize(); + return m_pReader->GetDataSize(); else return 0; } diff --git a/Source/Core/DolphinWX/Src/Main.cpp b/Source/Core/DolphinWX/Src/Main.cpp index d3a458a510..5c77a0a2fb 100644 --- a/Source/Core/DolphinWX/Src/Main.cpp +++ b/Source/Core/DolphinWX/Src/Main.cpp @@ -269,10 +269,7 @@ bool DolphinApp::OnInit() else { char *tmpChar; - long len; - fseek(workingDir, 0, SEEK_END); - len = ftell(workingDir); - fseek(workingDir, 0, SEEK_SET); + size_t len = (size_t)File::GetSize(workingDir); tmpChar = new char[len]; fread(tmpChar, len, 1, workingDir); fclose(workingDir);