mirror of https://github.com/FreeRDP/FreeRDP
winpr-comm, winpr-file: better initialization of the static variables
This commit is contained in:
parent
e6c82f99d5
commit
d38a323526
|
@ -321,7 +321,7 @@ typedef HANDLE (*pcCreateFileA)(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD
|
|||
typedef struct _HANDLE_CREATOR
|
||||
{
|
||||
pcIsHandled IsHandled;
|
||||
pcCreateFileA CreateFileA; /* TMP: FIXME: CreateFileA or CreateFile ? */
|
||||
pcCreateFileA CreateFileA;
|
||||
} HANDLE_CREATOR, *PHANDLE_CREATOR, *LPHANDLE_CREATOR;
|
||||
|
||||
BOOL RegisterHandleCreator(PHANDLE_CREATOR pHandleCreator);
|
||||
|
|
|
@ -26,15 +26,16 @@
|
|||
|
||||
#ifndef _WIN32
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <pthread.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <freerdp/utils/debug.h>
|
||||
|
||||
#include <winpr/crt.h>
|
||||
|
@ -749,31 +750,33 @@ typedef struct _COMM_DEVICE
|
|||
} COMM_DEVICE;
|
||||
|
||||
/* FIXME: get a clever data structure, see also io.h functions */
|
||||
static COMM_DEVICE **_CommDevices = NULL;
|
||||
|
||||
/* _CommDevices is a NULL-terminated array with a maximun of COMM_DEVICE_MAX COMM_DEVICE */
|
||||
#define COMM_DEVICE_MAX 128
|
||||
static COMM_DEVICE **_CommDevices = NULL;
|
||||
|
||||
static HANDLE_CREATOR *_CommHandleCreator = NULL;
|
||||
|
||||
|
||||
static void _CommDevicesInit()
|
||||
static pthread_once_t _CommInitialized = PTHREAD_ONCE_INIT;
|
||||
static void _CommInit()
|
||||
{
|
||||
/*
|
||||
* TMP: FIXME: What kind of mutex should be used here?
|
||||
* better have to let DefineCommDevice() and QueryCommDevice() thread unsafe ?
|
||||
* use of a module_init() ?
|
||||
*/
|
||||
/* NB: error management to be done outside of this function */
|
||||
|
||||
if (_CommDevices == NULL)
|
||||
assert(_CommDevices == NULL);
|
||||
assert(_CommHandleCreator == NULL);
|
||||
|
||||
_CommDevices = (COMM_DEVICE**)calloc(COMM_DEVICE_MAX+1, sizeof(COMM_DEVICE*));
|
||||
|
||||
_CommHandleCreator = (HANDLE_CREATOR*)malloc(sizeof(HANDLE_CREATOR));
|
||||
if (_CommHandleCreator)
|
||||
{
|
||||
_CommDevices = (COMM_DEVICE**)calloc(COMM_DEVICE_MAX+1, sizeof(COMM_DEVICE*));
|
||||
|
||||
_CommHandleCreator = (HANDLE_CREATOR*)malloc(sizeof(HANDLE_CREATOR));
|
||||
_CommHandleCreator->IsHandled = IsCommDevice;
|
||||
_CommHandleCreator->CreateFileA = CommCreateFileA;
|
||||
|
||||
|
||||
RegisterHandleCreator(_CommHandleCreator);
|
||||
}
|
||||
|
||||
assert(_CommDevices != NULL);
|
||||
assert(_CommHandleCreator != NULL);
|
||||
}
|
||||
|
||||
|
||||
|
@ -818,6 +821,7 @@ static BOOL _IsReservedCommDeviceName(LPCTSTR lpName)
|
|||
* information, call GetLastError.
|
||||
*
|
||||
* ERRORS:
|
||||
* ERROR_DLL_INIT_FAILED
|
||||
* ERROR_OUTOFMEMORY was not possible to get mappings.
|
||||
* ERROR_INVALID_DATA was not possible to add the device.
|
||||
*/
|
||||
|
@ -827,10 +831,15 @@ BOOL DefineCommDevice(/* DWORD dwFlags,*/ LPCTSTR lpDeviceName, LPCTSTR lpTarget
|
|||
LPTSTR storedDeviceName = NULL;
|
||||
LPTSTR storedTargetPath = NULL;
|
||||
|
||||
_CommDevicesInit();
|
||||
if (pthread_once(&_CommInitialized, _CommInit) != 0)
|
||||
{
|
||||
SetLastError(ERROR_DLL_INIT_FAILED);
|
||||
goto error_handle;
|
||||
}
|
||||
|
||||
if (_CommDevices == NULL)
|
||||
{
|
||||
SetLastError(ERROR_OUTOFMEMORY);
|
||||
SetLastError(ERROR_DLL_INIT_FAILED);
|
||||
goto error_handle;
|
||||
}
|
||||
|
||||
|
@ -918,6 +927,7 @@ BOOL DefineCommDevice(/* DWORD dwFlags,*/ LPCTSTR lpDeviceName, LPCTSTR lpTarget
|
|||
*
|
||||
* ERRORS:
|
||||
* ERROR_SUCCESS
|
||||
* ERROR_DLL_INIT_FAILED
|
||||
* ERROR_OUTOFMEMORY was not possible to get mappings.
|
||||
* ERROR_NOT_SUPPORTED equivalent QueryDosDevice feature not supported.
|
||||
* ERROR_INVALID_DATA was not possible to retrieve any device information.
|
||||
|
@ -930,10 +940,15 @@ DWORD QueryCommDevice(LPCTSTR lpDeviceName, LPTSTR lpTargetPath, DWORD ucchMax)
|
|||
|
||||
SetLastError(ERROR_SUCCESS);
|
||||
|
||||
_CommDevicesInit();
|
||||
if (pthread_once(&_CommInitialized, _CommInit) != 0)
|
||||
{
|
||||
SetLastError(ERROR_DLL_INIT_FAILED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (_CommDevices == NULL)
|
||||
{
|
||||
SetLastError(ERROR_OUTOFMEMORY);
|
||||
SetLastError(ERROR_DLL_INIT_FAILED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
|
||||
/**
|
||||
* api-ms-win-core-file-l1-2-0.dll:
|
||||
*
|
||||
*
|
||||
* CreateFileA
|
||||
* CreateFileW
|
||||
* CreateFile2
|
||||
|
@ -150,8 +150,10 @@
|
|||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
@ -190,34 +192,45 @@
|
|||
* winpr-collections to avoid a circular dependency
|
||||
* _HandleCreators = ArrayList_New(TRUE);
|
||||
*/
|
||||
/* _HandleCreators is a NULL-terminated array with a maximun of HANDLE_CREATOR_MAX HANDLE_CREATOR */
|
||||
#define HANDLE_CREATOR_MAX 128
|
||||
static HANDLE_CREATOR **_HandleCreators = NULL;
|
||||
|
||||
#define HANDLE_CREATOR_MAX 128
|
||||
|
||||
static pthread_once_t _HandleCreatorsInitialized = PTHREAD_ONCE_INIT;
|
||||
static void _HandleCreatorsInit()
|
||||
{
|
||||
/*
|
||||
* TMP: FIXME: What kind of mutex should be used here? use of
|
||||
* a module_init()?
|
||||
*/
|
||||
/* NB: error management to be done outside of this function */
|
||||
|
||||
if (_HandleCreators == NULL)
|
||||
{
|
||||
_HandleCreators = (HANDLE_CREATOR**)calloc(HANDLE_CREATOR_MAX+1, sizeof(HANDLE_CREATOR*));
|
||||
}
|
||||
assert(_HandleCreators == NULL);
|
||||
|
||||
_HandleCreators = (HANDLE_CREATOR**)calloc(HANDLE_CREATOR_MAX+1, sizeof(HANDLE_CREATOR*));
|
||||
|
||||
assert(_HandleCreators != NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE on success, FALSE otherwise.
|
||||
*
|
||||
* ERRORS:
|
||||
* ERROR_DLL_INIT_FAILED
|
||||
* ERROR_INSUFFICIENT_BUFFER _HandleCreators full
|
||||
*/
|
||||
BOOL RegisterHandleCreator(PHANDLE_CREATOR pHandleCreator)
|
||||
{
|
||||
int i;
|
||||
|
||||
_HandleCreatorsInit();
|
||||
if (pthread_once(&_HandleCreatorsInitialized, _HandleCreatorsInit) != 0)
|
||||
{
|
||||
SetLastError(ERROR_DLL_INIT_FAILED);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (_HandleCreators == NULL)
|
||||
{
|
||||
SetLastError(ERROR_DLL_INIT_FAILED);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
for (i=0; i<HANDLE_CREATOR_MAX; i++)
|
||||
{
|
||||
|
@ -265,7 +278,7 @@ int InstallAioSignalHandler()
|
|||
#endif /* HAVE_AIO_H */
|
||||
|
||||
HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||||
DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
|
||||
DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
|
||||
{
|
||||
int i;
|
||||
char* name;
|
||||
|
@ -277,9 +290,17 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
|
|||
if (!lpFileName)
|
||||
return INVALID_HANDLE_VALUE;
|
||||
|
||||
_HandleCreatorsInit();
|
||||
if (_HandleCreators == NULL)
|
||||
if (pthread_once(&_HandleCreatorsInitialized, _HandleCreatorsInit) != 0)
|
||||
{
|
||||
SetLastError(ERROR_DLL_INIT_FAILED);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
if (_HandleCreators == NULL)
|
||||
{
|
||||
SetLastError(ERROR_DLL_INIT_FAILED);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
for (i=0; _HandleCreators[i] != NULL; i++)
|
||||
{
|
||||
|
@ -291,7 +312,7 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
|
|||
}
|
||||
}
|
||||
|
||||
/* * */
|
||||
/* TODO: use of a HANDLE_CREATOR for named pipes as well */
|
||||
|
||||
if (!IsNamedPipeFileNameA(lpFileName))
|
||||
return INVALID_HANDLE_VALUE;
|
||||
|
|
Loading…
Reference in New Issue