aboutsummaryrefslogtreecommitdiff
path: root/zencore/iobuffer.cpp
diff options
context:
space:
mode:
authorMartin Ridgers <[email protected]>2021-09-16 13:56:28 +0200
committerMartin Ridgers <[email protected]>2021-09-16 14:20:52 +0200
commit572d1a61ecb2133f4854dfcfe35406699f763c05 (patch)
treef98694a3c4770a7c5d5debda2aa364f482d600d3 /zencore/iobuffer.cpp
parentMakeFromFile() on POSIX (diff)
downloadzen-572d1a61ecb2133f4854dfcfe35406699f763c05.tar.xz
zen-572d1a61ecb2133f4854dfcfe35406699f763c05.zip
MakeFromTemporaryFile() on POSIX
Diffstat (limited to 'zencore/iobuffer.cpp')
-rw-r--r--zencore/iobuffer.cpp33
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;
}
//////////////////////////////////////////////////////////////////////////