mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-14 08:24:16 +09:00
[winpr,file] create global instance for GetStdHandle
This commit is contained in:
@@ -56,6 +56,10 @@
|
||||
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
|
||||
#endif
|
||||
|
||||
static WINPR_FILE* pStdHandleFile = NULL;
|
||||
|
||||
static void GetStdHandle_Uninit(void) __attribute__((destructor));
|
||||
|
||||
static BOOL FileIsHandled(HANDLE handle)
|
||||
{
|
||||
return WINPR_HANDLE_IS_HANDLED(handle, HANDLE_TYPE_FILE, FALSE);
|
||||
@@ -71,13 +75,21 @@ static int FileGetFd(HANDLE handle)
|
||||
return fileno(file->fp);
|
||||
}
|
||||
|
||||
static BOOL FileCloseHandle(HANDLE handle)
|
||||
static BOOL FileCloseHandleInt(HANDLE handle, BOOL force)
|
||||
{
|
||||
WINPR_FILE* file = (WINPR_FILE*)handle;
|
||||
|
||||
if (!FileIsHandled(handle))
|
||||
return FALSE;
|
||||
|
||||
if (!force)
|
||||
{
|
||||
if (handle == pStdHandleFile)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (file->fp)
|
||||
{
|
||||
/* Don't close stdin/stdout/stderr */
|
||||
@@ -93,6 +105,11 @@ static BOOL FileCloseHandle(HANDLE handle)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL FileCloseHandle(HANDLE handle)
|
||||
{
|
||||
return FileCloseHandleInt(handle, FALSE);
|
||||
}
|
||||
|
||||
static BOOL FileSetEndOfFile(HANDLE hFile)
|
||||
{
|
||||
WINPR_FILE* pFile = (WINPR_FILE*)hFile;
|
||||
@@ -1008,10 +1025,14 @@ static WINPR_FILE* FileHandle_New(FILE* fp)
|
||||
return pFile;
|
||||
}
|
||||
|
||||
void GetStdHandle_Uninit(void)
|
||||
{
|
||||
FileCloseHandleInt(pStdHandleFile, TRUE);
|
||||
}
|
||||
|
||||
HANDLE GetStdHandle(DWORD nStdHandle)
|
||||
{
|
||||
FILE* fp = NULL;
|
||||
WINPR_FILE* pFile = NULL;
|
||||
|
||||
switch (nStdHandle)
|
||||
{
|
||||
@@ -1027,11 +1048,13 @@ HANDLE GetStdHandle(DWORD nStdHandle)
|
||||
default:
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
pFile = FileHandle_New(fp);
|
||||
if (!pFile)
|
||||
if (!pStdHandleFile)
|
||||
pStdHandleFile = FileHandle_New(fp);
|
||||
|
||||
if (!pStdHandleFile)
|
||||
return INVALID_HANDLE_VALUE;
|
||||
|
||||
return (HANDLE)pFile;
|
||||
return (HANDLE)pStdHandleFile;
|
||||
}
|
||||
|
||||
BOOL SetStdHandle(WINPR_ATTR_UNUSED DWORD nStdHandle, WINPR_ATTR_UNUSED HANDLE hHandle)
|
||||
|
||||
Reference in New Issue
Block a user