This patch moves the handle operations in a static struct.
pComm->serverSerialDriverId = driverId;
}
+static HANDLE_OPS ops = {
+ CommIsHandled,
+ CommCloseHandle,
+ CommGetFd,
+ NULL /* CleanupHandle */
+};
+
/**
* http://msdn.microsoft.com/en-us/library/windows/desktop/aa363198%28v=vs.85%29.aspx
WINPR_HANDLE_SET_TYPE(pComm, HANDLE_TYPE_COMM);
- pComm->cb.GetFd = CommGetFd;
- pComm->cb.CloseHandle = CommCloseHandle;
- pComm->cb.IsHandled = CommIsHandled;
+ pComm->ops = &ops;
/* error_handle */
#endif /* HAVE_AIO_H */
+static HANDLE_OPS ops = {
+ FileIsHandled,
+ FileCloseHandle,
+ FileGetFd,
+ NULL /* CleanupHandle */
+};
+
HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
strcpy(s.sun_path, pNamedPipe->lpFilePath);
status = connect(pNamedPipe->clientfd, (struct sockaddr*) &s, sizeof(struct sockaddr_un));
- pNamedPipe->cb.IsHandled = FileIsHandled;
- pNamedPipe->cb.CloseHandle = FileCloseHandle;
- pNamedPipe->cb.GetFd = FileGetFd;
+ pNamedPipe->ops = &ops;
if (status != 0)
{
if (!winpr_Handle_GetInfo(hObject, &Type, (PVOID*)&Object))
return FALSE;
- if (Object && Object->cb.CloseHandle)
- return Object->cb.CloseHandle(hObject);
+ if (!Object)
+ return FALSE;
+
+ if (!Object->ops)
+ return FALSE;
+
+ if(Object->ops->CloseHandle)
+ return Object->ops->CloseHandle(hObject);
return FALSE;
}
#define WINPR_HANDLE_DEF() \
ULONG Type; \
- HANDLE_CLOSE_CB cb
+ HANDLE_OPS *ops
typedef BOOL (*pcIsHandled)(HANDLE handle);
typedef BOOL (*pcCloseHandle)(HANDLE handle);
typedef int (*pcGetFd)(HANDLE handle);
typedef DWORD (*pcCleanupHandle)(HANDLE handle);
-typedef struct _HANDLE_CLOSE_CB
+typedef struct _HANDLE_OPS
{
pcIsHandled IsHandled;
pcCloseHandle CloseHandle;
pcGetFd GetFd;
pcCleanupHandle CleanupHandle;
-} HANDLE_CLOSE_CB;
+} HANDLE_OPS;
struct winpr_handle
{
if (!winpr_Handle_GetInfo(handle, &type, (PVOID*)&hdl))
return -1;
- if (!hdl || !hdl->cb.GetFd)
+ if (!hdl || !hdl->ops->GetFd)
return -1;
- return hdl->cb.GetFd(handle);
+ return hdl->ops->GetFd(handle);
}
static INLINE DWORD winpr_Handle_cleanup(HANDLE handle)
return WAIT_FAILED;
/* If there is no cleanup function, assume all ok. */
- if (!hdl->cb.CleanupHandle)
+ if (!hdl->ops->CleanupHandle)
return WAIT_OBJECT_0;
- return hdl->cb.CleanupHandle(handle);
+ return hdl->ops->CleanupHandle(handle);
}
#endif /* WINPR_HANDLE_PRIVATE_H */
return -1;
}
+static HANDLE_OPS ops = {
+ NoneHandleIsHandle,
+ NoneHandleCloseHandle,
+ NoneHandleGetFd,
+ NULL /* CleanupHandle */
+};
+
HANDLE CreateNoneHandle()
{
WINPR_NONE_HANDLE* none;
if (!none)
return NULL;
- none->cb.IsHandled = NoneHandleIsHandle;
- none->cb.CloseHandle = NoneHandleCloseHandle;
- none->cb.GetFd = NoneHandleGetFd;
+ none->ops = &ops;
return (HANDLE)none;
}
if (pipe->fd != -1)
{
close(pipe->fd);
+ pipe->fd = -1;
}
free(handle);
g_NamedPipeServerSockets = ArrayList_New(FALSE);
}
+static HANDLE_OPS ops = {
+ PipeIsHandled,
+ PipeCloseHandle,
+ PipeGetFd,
+ NULL /* CleanupHandle */
+};
+
/*
* Unnamed pipe
pReadPipe->fd = pipe_fd[0];
pWritePipe->fd = pipe_fd[1];
WINPR_HANDLE_SET_TYPE(pReadPipe, HANDLE_TYPE_ANONYMOUS_PIPE);
- pReadPipe->cb.GetFd = PipeGetFd;
- pReadPipe->cb.CloseHandle = PipeCloseHandle;
- pReadPipe->cb.IsHandled = PipeIsHandled;
+ pReadPipe->ops = &ops;
*((ULONG_PTR*) hReadPipe) = (ULONG_PTR) pReadPipe;
WINPR_HANDLE_SET_TYPE(pWritePipe, HANDLE_TYPE_ANONYMOUS_PIPE);
- pWritePipe->cb.GetFd = PipeGetFd;
- pWritePipe->cb.CloseHandle = PipeCloseHandle;
- pWritePipe->cb.IsHandled = PipeIsHandled;
+ pWritePipe->ops = &ops;
*((ULONG_PTR*) hWritePipe) = (ULONG_PTR) pWritePipe;
return TRUE;
}
return TRUE;
}
+static HANDLE_OPS ops = {
+ LogonUserIsHandled,
+ LogonUserCloseHandle,
+ LogonUserGetFd,
+ NULL /* CleanupHandle */
+};
+
BOOL LogonUserA(LPCSTR lpszUsername, LPCSTR lpszDomain, LPCSTR lpszPassword,
DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken)
{
WINPR_HANDLE_SET_TYPE(token, HANDLE_TYPE_ACCESS_TOKEN);
- token->cb.GetFd = LogonUserGetFd;
- token->cb.CloseHandle = LogonUserCloseHandle;
- token->cb.IsHandled = LogonUserIsHandled;
+ token->ops = &ops;
token->Username = _strdup(lpszUsername);
return TRUE;
}
+static HANDLE_OPS ops = {
+ EventIsHandled,
+ EventCloseHandle,
+ EventGetFd,
+ NULL /* CleanupHandle */
+};
+
HANDLE CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCWSTR lpName)
{
WINPR_EVENT* event;
{
event->bAttached = FALSE;
event->bManualReset = bManualReset;
- event->cb.IsHandled = EventIsHandled;
- event->cb.CloseHandle = EventCloseHandle;
- event->cb.GetFd = EventGetFd;
+ event->ops = &ops;
if (!event->bManualReset)
{
#endif
+
HANDLE CreateFileDescriptorEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, int FileDescriptor)
{
#ifndef _WIN32
event->bManualReset = bManualReset;
event->pipe_fd[0] = FileDescriptor;
event->pipe_fd[1] = -1;
- event->cb.CloseHandle = EventCloseHandle;
- event->cb.GetFd = EventGetFd;
- event->cb.IsHandled = EventIsHandled;
+ event->ops = &ops;
WINPR_HANDLE_SET_TYPE(event, HANDLE_TYPE_EVENT);
handle = (HANDLE) event;
}
return TRUE;
}
+static HANDLE_OPS ops = {
+ MutexIsHandled,
+ MutexCloseHandle,
+ MutexGetFd,
+ NULL /* CleanupHandle */
+};
+
HANDLE CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCWSTR lpName)
{
HANDLE handle = NULL;
pthread_mutex_init(&mutex->mutex, 0);
WINPR_HANDLE_SET_TYPE(mutex, HANDLE_TYPE_MUTEX);
- mutex->cb.GetFd = MutexGetFd;
- mutex->cb.CloseHandle = MutexCloseHandle;
- mutex->cb.IsHandled = MutexIsHandled;
+ mutex->ops = &ops;
handle = (HANDLE) mutex;
return TRUE;
}
+static HANDLE_OPS ops = {
+ SemaphoreIsHandled,
+ SemaphoreCloseHandle,
+ SemaphoreGetFd,
+ SemaphoreCleanupHandle
+};
+
HANDLE CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCWSTR lpName)
{
HANDLE handle;
semaphore->pipe_fd[0] = -1;
semaphore->pipe_fd[0] = -1;
semaphore->sem = (winpr_sem_t*) NULL;
- semaphore->cb.IsHandled = SemaphoreIsHandled;
- semaphore->cb.CloseHandle = SemaphoreCloseHandle;
- semaphore->cb.GetFd = SemaphoreGetFd;
- semaphore->cb.CleanupHandle = SemaphoreCleanupHandle;
+ semaphore->ops = &ops;
if (semaphore)
{
return TRUE;
}
+ WLog_ERR(TAG, "calling %s on a handle that is not a semaphore");
return FALSE;
}
return 0;
}
+
+static HANDLE_OPS ops = {
+ TimerIsHandled,
+ TimerCloseHandle,
+ TimerGetFd,
+ TimerCleanupHandle
+};
+
/**
* Waitable Timer
*/
timer->pfnCompletionRoutine = NULL;
timer->lpArgToCompletionRoutine = NULL;
timer->bInit = FALSE;
- timer->cb.GetFd = TimerGetFd;
- timer->cb.CloseHandle = TimerCloseHandle;
- timer->cb.IsHandled = TimerIsHandled;
- timer->cb.CleanupHandle = TimerCleanupHandle;
+ timer->ops = &ops;
}
return handle;
return -1;
}
+static HANDLE_OPS ops = {
+ ProcessHandleIsHandle,
+ ProcessHandleCloseHandle,
+ ProcessGetFd,
+ NULL /* CleanupHandle */
+};
+
HANDLE CreateProcessHandle(pid_t pid)
{
WINPR_PROCESS* process;
process->pid = pid;
process->Type = HANDLE_TYPE_PROCESS;
- process->cb.GetFd = ProcessGetFd;
- process->cb.CloseHandle = ProcessHandleCloseHandle;
- process->cb.IsHandled = ProcessHandleIsHandle;
+ process->ops = &ops;
return (HANDLE)process;
}
return WAIT_OBJECT_0;
}
+static HANDLE_OPS ops = {
+ ThreadIsHandled,
+ ThreadCloseHandle,
+ ThreadGetFd,
+ ThreadCleanupHandle
+};
+
+
static void dump_thread(WINPR_THREAD* thread)
{
#if defined(WITH_DEBUG_THREADS)
thread->lpParameter = lpParameter;
thread->lpStartAddress = lpStartAddress;
thread->lpThreadAttributes = lpThreadAttributes;
- thread->cb.IsHandled = ThreadIsHandled;
- thread->cb.CloseHandle = ThreadCloseHandle;
- thread->cb.GetFd = ThreadGetFd;
- thread->cb.CleanupHandle = ThreadCleanupHandle;
+ thread->ops = &ops;
#if defined(WITH_DEBUG_THREADS)
thread->create_stack = winpr_backtrace(20);