diff options
| author | Martin Ridgers <[email protected]> | 2021-09-16 13:56:28 +0200 |
|---|---|---|
| committer | Martin Ridgers <[email protected]> | 2021-09-16 14:20:52 +0200 |
| commit | 572d1a61ecb2133f4854dfcfe35406699f763c05 (patch) | |
| tree | f98694a3c4770a7c5d5debda2aa364f482d600d3 /zencore/iobuffer.cpp | |
| parent | MakeFromFile() on POSIX (diff) | |
| download | zen-572d1a61ecb2133f4854dfcfe35406699f763c05.tar.xz zen-572d1a61ecb2133f4854dfcfe35406699f763c05.zip | |
MakeFromTemporaryFile() on POSIX
Diffstat (limited to 'zencore/iobuffer.cpp')
| -rw-r--r-- | zencore/iobuffer.cpp | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/zencore/iobuffer.cpp b/zencore/iobuffer.cpp index 16b530955..8e51f0872 100644 --- a/zencore/iobuffer.cpp +++ b/zencore/iobuffer.cpp @@ -413,6 +413,10 @@ IoBufferBuilder::MakeFromFile(const path_char_t* FileName, uint64_t Offset, uint IoBuffer IoBufferBuilder::MakeFromTemporaryFile(const path_char_t* FileName) { + uint64_t FileSize; + void* Handle; + +#if ZEN_PLATFORM_WINDOWS CAtlFile DataFile; // We need to open with DELETE since this is used for the case @@ -421,18 +425,33 @@ IoBufferBuilder::MakeFromTemporaryFile(const path_char_t* FileName) HRESULT hRes = DataFile.Create(FileName, GENERIC_READ | DELETE, FILE_SHARE_READ | FILE_SHARE_DELETE, OPEN_EXISTING); - if (SUCCEEDED(hRes)) + if (FAILED(hRes)) { - ULONGLONG FileSize; - DataFile.GetSize(FileSize); + return {}; + } - IoBuffer Iob(IoBuffer::File, DataFile.Detach(), 0, FileSize); - Iob.m_Core->SetIsWholeFile(true); + DataFile.GetSize((ULONGLONG&)FileSize); - return Iob; + Handle = DataFile.Detach(); +#else + int Fd = open(FileName, O_RDONLY); + if (Fd < 0) + { + return {}; } - return {}; + static_assert(sizeof(decltype(stat::st_size)) == sizeof(uint64_t), "fstat() doesn't support large files"); + struct stat Stat; + fstat(Fd, &Stat); + FileSize = Stat.st_size; + + Handle = (void*)uintptr_t(Fd); +#endif // ZEN_PLATFORM_WINDOWS + + IoBuffer Iob(IoBuffer::File, Handle, 0, FileSize); + Iob.m_Core->SetIsWholeFile(true); + + return Iob; } ////////////////////////////////////////////////////////////////////////// |