[+] NT: IOHandle::IsFile(), IOHandle::IsTTY(), IOHandle::IsPipe()
[*] Revert to supporting write-only handles
This commit is contained in:
parent
9cea2fe82a
commit
3df8621944
@ -108,6 +108,8 @@ namespace Aurora::IO
|
|||||||
|
|
||||||
virtual AuUInt64 GetOSHandle() = 0;
|
virtual AuUInt64 GetOSHandle() = 0;
|
||||||
|
|
||||||
|
virtual AuOptionalEx<AuUInt64> GetOSHandleSafe() = 0;
|
||||||
|
|
||||||
virtual AuUInt64 GetOSReadHandle() = 0;
|
virtual AuUInt64 GetOSReadHandle() = 0;
|
||||||
|
|
||||||
virtual AuOptionalEx<AuUInt64> GetOSReadHandleSafe() = 0;
|
virtual AuOptionalEx<AuUInt64> GetOSReadHandleSafe() = 0;
|
||||||
@ -123,6 +125,12 @@ namespace Aurora::IO
|
|||||||
virtual bool IsAsync() = 0;
|
virtual bool IsAsync() = 0;
|
||||||
|
|
||||||
virtual AuString GetPath() = 0;
|
virtual AuString GetPath() = 0;
|
||||||
|
|
||||||
|
virtual bool IsFile() = 0;
|
||||||
|
|
||||||
|
virtual bool IsTTY() = 0;
|
||||||
|
|
||||||
|
virtual bool IsPipe() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
AUKN_SHARED_SOO(IOHandle, IIOHandle, 256);
|
AUKN_SHARED_SOO(IOHandle, IIOHandle, 256);
|
||||||
|
@ -245,8 +245,109 @@ namespace Aurora::IO
|
|||||||
|
|
||||||
return this->IsValid();
|
return this->IsValid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsFile() override;
|
||||||
|
bool IsTTY() override;
|
||||||
|
bool IsPipe() override;
|
||||||
|
|
||||||
|
AuOptionalEx<bool> optIsFile {};
|
||||||
|
AuOptionalEx<bool> optIsPipe {};
|
||||||
|
AuOptionalEx<bool> optIsTTY {};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool NTIOHandle::IsFile()
|
||||||
|
{
|
||||||
|
bool bIsFile {};
|
||||||
|
DWORD dwType {};
|
||||||
|
HANDLE hHandle {};
|
||||||
|
|
||||||
|
if (auto file = this->optIsFile)
|
||||||
|
{
|
||||||
|
return file.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto optHandle = this->GetOSHandleSafe())
|
||||||
|
{
|
||||||
|
hHandle = (HANDLE)optHandle.value();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SysPushErrorUninitialized();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(dwType = GetFileType(hHandle)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bIsFile = dwType == FILE_TYPE_DISK;
|
||||||
|
this->optIsFile = bIsFile;
|
||||||
|
return bIsFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NTIOHandle::IsTTY()
|
||||||
|
{
|
||||||
|
bool bIsTTY {};
|
||||||
|
DWORD dwType {};
|
||||||
|
HANDLE hHandle {};
|
||||||
|
|
||||||
|
if (auto file = this->optIsTTY)
|
||||||
|
{
|
||||||
|
return file.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto optHandle = this->GetOSHandleSafe())
|
||||||
|
{
|
||||||
|
hHandle = (HANDLE)optHandle.value();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SysPushErrorUninitialized();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(dwType = GetFileType(hHandle)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bIsTTY = dwType == FILE_TYPE_CHAR;
|
||||||
|
this->optIsTTY = bIsTTY;
|
||||||
|
return bIsTTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NTIOHandle::IsPipe()
|
||||||
|
{
|
||||||
|
bool bIsPipe {};
|
||||||
|
DWORD dwType {};
|
||||||
|
HANDLE hHandle {};
|
||||||
|
|
||||||
|
if (auto file = this->optIsPipe)
|
||||||
|
{
|
||||||
|
return file.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto optHandle = this->GetOSHandleSafe())
|
||||||
|
{
|
||||||
|
hHandle = (HANDLE)optHandle.value();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SysPushErrorUninitialized();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(dwType = GetFileType(hHandle)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bIsPipe = dwType == FILE_TYPE_PIPE;
|
||||||
|
this->optIsPipe = bIsPipe;
|
||||||
|
return bIsPipe;
|
||||||
|
}
|
||||||
|
|
||||||
AUKN_SYM IIOHandle *IOHandleNew()
|
AUKN_SYM IIOHandle *IOHandleNew()
|
||||||
{
|
{
|
||||||
return _new NTIOHandle();
|
return _new NTIOHandle();
|
||||||
|
@ -126,6 +126,21 @@ namespace Aurora::IO
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AuOptionalEx<AuUInt64> AFileHandle::GetOSHandleSafe()
|
||||||
|
{
|
||||||
|
if (auto write = this->uOSWriteHandle)
|
||||||
|
{
|
||||||
|
return write;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto read = this->uOSReadHandle)
|
||||||
|
{
|
||||||
|
return read;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
AuUInt64 AFileHandle::GetOSHandle()
|
AuUInt64 AFileHandle::GetOSHandle()
|
||||||
{
|
{
|
||||||
return this->uOSReadHandle.ValueOr(this->uOSWriteHandle.Value());
|
return this->uOSReadHandle.ValueOr(this->uOSWriteHandle.Value());
|
||||||
|
@ -32,6 +32,8 @@ namespace Aurora::IO
|
|||||||
|
|
||||||
AuUInt64 GetOSHandle() override;
|
AuUInt64 GetOSHandle() override;
|
||||||
|
|
||||||
|
AuOptionalEx<AuUInt64> GetOSHandleSafe() override;
|
||||||
|
|
||||||
AuUInt64 GetOSReadHandle() override;
|
AuUInt64 GetOSReadHandle() override;
|
||||||
|
|
||||||
AuOptionalEx<AuUInt64> GetOSReadHandleSafe() override;
|
AuOptionalEx<AuUInt64> GetOSReadHandleSafe() override;
|
||||||
|
@ -30,10 +30,25 @@ namespace Aurora::IO::FS
|
|||||||
{
|
{
|
||||||
LARGE_INTEGER distance {};
|
LARGE_INTEGER distance {};
|
||||||
LARGE_INTEGER pos {};
|
LARGE_INTEGER pos {};
|
||||||
|
HANDLE hHandle {};
|
||||||
|
|
||||||
auto hHandle = this->GetWin32Handle();
|
if (auto pHandle = this->pHandle_)
|
||||||
|
{
|
||||||
|
if (!pHandle->IsFile())
|
||||||
|
{
|
||||||
|
SysPushErrorIOResourceRejected();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (hHandle == INVALID_HANDLE_VALUE)
|
hHandle = this->GetWin32Handle();
|
||||||
|
|
||||||
|
if (hHandle == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
SysPushErrorInvalidFd();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
SysPushErrorUninitialized();
|
SysPushErrorUninitialized();
|
||||||
return 0;
|
return 0;
|
||||||
@ -55,13 +70,28 @@ namespace Aurora::IO::FS
|
|||||||
{
|
{
|
||||||
LARGE_INTEGER distance {};
|
LARGE_INTEGER distance {};
|
||||||
LARGE_INTEGER pos {};
|
LARGE_INTEGER pos {};
|
||||||
|
HANDLE hHandle {};
|
||||||
|
|
||||||
auto hHandle = this->GetWin32Handle();
|
if (auto pHandle = this->pHandle_)
|
||||||
|
{
|
||||||
|
if (!pHandle->IsFile())
|
||||||
|
{
|
||||||
|
SysPushErrorIOResourceRejected();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (hHandle == INVALID_HANDLE_VALUE)
|
hHandle = this->GetWin32Handle();
|
||||||
|
|
||||||
|
if (hHandle == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
SysPushErrorInvalidFd();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
SysPushErrorUninitialized();
|
SysPushErrorUninitialized();
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
distance.QuadPart = offset;
|
distance.QuadPart = offset;
|
||||||
@ -78,10 +108,25 @@ namespace Aurora::IO::FS
|
|||||||
AuUInt64 WinFileStream::GetLength()
|
AuUInt64 WinFileStream::GetLength()
|
||||||
{
|
{
|
||||||
LARGE_INTEGER length;
|
LARGE_INTEGER length;
|
||||||
|
HANDLE hHandle {};
|
||||||
|
|
||||||
auto hHandle = this->GetWin32Handle();
|
if (auto pHandle = this->pHandle_)
|
||||||
|
{
|
||||||
if (hHandle == INVALID_HANDLE_VALUE)
|
if (!pHandle->IsFile())
|
||||||
|
{
|
||||||
|
SysPushErrorIOResourceRejected();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hHandle = this->GetWin32Handle();
|
||||||
|
|
||||||
|
if (hHandle == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
SysPushErrorInvalidFd();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
SysPushErrorUninitialized();
|
SysPushErrorUninitialized();
|
||||||
return 0;
|
return 0;
|
||||||
@ -98,12 +143,18 @@ namespace Aurora::IO::FS
|
|||||||
|
|
||||||
bool WinFileStream::Read(const Memory::MemoryViewStreamWrite ¶meters)
|
bool WinFileStream::Read(const Memory::MemoryViewStreamWrite ¶meters)
|
||||||
{
|
{
|
||||||
auto hHandle = this->GetWin32Handle();
|
if (!this->pHandle_)
|
||||||
|
{
|
||||||
|
SysPushErrorUninitialized();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto hHandle = this->GetWin32Handle(true);
|
||||||
HANDLE hEventHandle { INVALID_HANDLE_VALUE };
|
HANDLE hEventHandle { INVALID_HANDLE_VALUE };
|
||||||
|
|
||||||
if (hHandle == INVALID_HANDLE_VALUE)
|
if (hHandle == INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
SysPushErrorUninitialized();
|
SysPushErrorIOResourceRejected();
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -339,11 +390,21 @@ namespace Aurora::IO::FS
|
|||||||
return this->pHandle_;
|
return this->pHandle_;
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE WinFileStream::GetWin32Handle()
|
HANDLE WinFileStream::GetWin32Handle(bool bReadOnly)
|
||||||
{
|
{
|
||||||
return this->pHandle_ ?
|
if (this->pHandle_)
|
||||||
(HANDLE)this->pHandle_->GetOSWriteHandleSafe().ValueOr(this->pHandle_->GetOSReadHandleSafe().ValueOr((AuUInt)INVALID_HANDLE_VALUE)) :
|
{
|
||||||
INVALID_HANDLE_VALUE;
|
if (bReadOnly)
|
||||||
|
{
|
||||||
|
return (HANDLE)this->pHandle_->GetOSReadHandleSafe().ValueOr((AuUInt)INVALID_HANDLE_VALUE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (HANDLE)this->pHandle_->GetOSWriteHandleSafe().ValueOr(this->pHandle_->GetOSReadHandleSafe().ValueOr((AuUInt)INVALID_HANDLE_VALUE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
AUKN_SYM AuSPtr<IFileStream> OpenBlockingFileStreamFromHandle(AuSPtr<IIOHandle> pIOHandle)
|
AUKN_SYM AuSPtr<IFileStream> OpenBlockingFileStreamFromHandle(AuSPtr<IIOHandle> pIOHandle)
|
||||||
|
@ -28,7 +28,7 @@ namespace Aurora::IO::FS
|
|||||||
void MakeTemporary() override;
|
void MakeTemporary() override;
|
||||||
AuSPtr<IIOHandle> GetHandle() override;
|
AuSPtr<IIOHandle> GetHandle() override;
|
||||||
|
|
||||||
HANDLE GetWin32Handle();
|
HANDLE GetWin32Handle(bool bReadOnly = false);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AuSPtr<IIOHandle> pHandle_;
|
AuSPtr<IIOHandle> pHandle_;
|
||||||
|
@ -215,10 +215,10 @@ namespace Aurora::IO::FS
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fd = this->GetUnixHandle();
|
int fd = (int)this->pHandle_->GetOSReadHandleSafe().ValueOr((AuUInt)-1);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
{
|
{
|
||||||
SysPushErrorUninitialized();
|
SysPushErrorIOResourceRejected();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user