diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h index 111ca53b2..faee32fd2 100644 --- a/renderdoc/os/os_specific.h +++ b/renderdoc/os/os_specific.h @@ -290,6 +290,10 @@ bool logfile_open(const char *filename); void logfile_append(const char *msg, size_t length); void logfile_close(const char *filename); +// read the whole logfile into memory. This may race with processes writing, but it will read the +// whole of the file at some point. Useful since normal file reading may fail on the shared logfile +std::string logfile_readall(const char *filename); + // utility functions inline bool dump(const char *filename, const void *buffer, size_t size) { diff --git a/renderdoc/os/posix/posix_stringio.cpp b/renderdoc/os/posix/posix_stringio.cpp index 2d282fa44..7cc2660b2 100644 --- a/renderdoc/os/posix/posix_stringio.cpp +++ b/renderdoc/os/posix/posix_stringio.cpp @@ -484,6 +484,28 @@ void ReleaseFDAfterFork() close(logfileFD); } +std::string logfile_readall(const char *filename) +{ + FILE *f = FileIO::fopen(filename, "r"); + + std::string ret; + + if(f == NULL) + return ret; + + FileIO::fseek64(f, 0, SEEK_END); + uint64_t size = FileIO::ftell64(f); + FileIO::fseek64(f, 0, SEEK_SET); + + ret.resize((size_t)size); + + FileIO::fread(&ret[0], 1, ret.size(), f); + + FileIO::fclose(f); + + return ret; +} + bool logfile_open(const char *filename) { logfileFD = open(filename, O_APPEND | O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); diff --git a/renderdoc/os/win32/win32_stringio.cpp b/renderdoc/os/win32/win32_stringio.cpp index 5e45f29ea..bf6cfe694 100644 --- a/renderdoc/os/win32/win32_stringio.cpp +++ b/renderdoc/os/win32/win32_stringio.cpp @@ -636,6 +636,30 @@ bool logfile_open(const char *filename) return logHandle != NULL; } +std::string logfile_readall(const char *filename) +{ + wstring wfn = StringFormat::UTF82Wide(string(filename)); + HANDLE h = CreateFileW(wfn.c_str(), FILE_READ_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + std::string ret; + + if(h != NULL) + { + DWORD len = GetFileSize(h, NULL); + + ret.resize(len); + + DWORD dummy = len; + + ReadFile(h, &ret[0], len, &dummy, NULL); + + CloseHandle(h); + } + + return ret; +} + void logfile_append(const char *msg, size_t length) { if(logHandle)