summaryrefslogtreecommitdiffstats
path: root/winpr/libwinpr/handle
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 01:24:41 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 01:24:41 +0000
commita9bcc81f821d7c66f623779fa5147e728eb3c388 (patch)
tree98676963bcdd537ae5908a067a8eb110b93486a6 /winpr/libwinpr/handle
parentInitial commit. (diff)
downloadfreerdp3-a9bcc81f821d7c66f623779fa5147e728eb3c388.tar.xz
freerdp3-a9bcc81f821d7c66f623779fa5147e728eb3c388.zip
Adding upstream version 3.3.0+dfsg1.upstream/3.3.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'winpr/libwinpr/handle')
-rw-r--r--winpr/libwinpr/handle/CMakeLists.txt23
-rw-r--r--winpr/libwinpr/handle/ModuleOptions.cmake9
-rw-r--r--winpr/libwinpr/handle/handle.c81
-rw-r--r--winpr/libwinpr/handle/handle.h198
-rw-r--r--winpr/libwinpr/handle/nonehandle.c82
-rw-r--r--winpr/libwinpr/handle/nonehandle.h40
6 files changed, 433 insertions, 0 deletions
diff --git a/winpr/libwinpr/handle/CMakeLists.txt b/winpr/libwinpr/handle/CMakeLists.txt
new file mode 100644
index 0000000..37c410e
--- /dev/null
+++ b/winpr/libwinpr/handle/CMakeLists.txt
@@ -0,0 +1,23 @@
+# WinPR: Windows Portable Runtime
+# libwinpr-handle cmake build script
+#
+# Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+# Copyright 2014 DI (FH) Martin Haimberger <martin.haimberger@thincast.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+winpr_module_add(handle.c handle.h nonehandle.c nonehandle.h)
+
+if(${CMAKE_SYSTEM_NAME} MATCHES SunOS)
+ winpr_library_add_private(rt)
+endif()
diff --git a/winpr/libwinpr/handle/ModuleOptions.cmake b/winpr/libwinpr/handle/ModuleOptions.cmake
new file mode 100644
index 0000000..545a8e9
--- /dev/null
+++ b/winpr/libwinpr/handle/ModuleOptions.cmake
@@ -0,0 +1,9 @@
+
+set(MINWIN_LAYER "1")
+set(MINWIN_GROUP "core")
+set(MINWIN_MAJOR_VERSION "1")
+set(MINWIN_MINOR_VERSION "0")
+set(MINWIN_SHORT_NAME "handle")
+set(MINWIN_LONG_NAME "Handle and Object Functions")
+set(MODULE_LIBRARY_NAME "api-ms-win-${MINWIN_GROUP}-${MINWIN_SHORT_NAME}-l${MINWIN_LAYER}-${MINWIN_MAJOR_VERSION}-${MINWIN_MINOR_VERSION}")
+
diff --git a/winpr/libwinpr/handle/handle.c b/winpr/libwinpr/handle/handle.c
new file mode 100644
index 0000000..5c35d42
--- /dev/null
+++ b/winpr/libwinpr/handle/handle.c
@@ -0,0 +1,81 @@
+/**
+ * WinPR: Windows Portable Runtime
+ * Handle Management
+ *
+ * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2014 DI (FH) Martin Haimberger <martin.haimberger@thincast.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <winpr/config.h>
+
+#include <winpr/handle.h>
+
+#ifndef _WIN32
+
+#include <pthread.h>
+
+#include "../synch/synch.h"
+#include "../thread/thread.h"
+#include "../pipe/pipe.h"
+#include "../comm/comm.h"
+#include "../security/security.h"
+
+#ifdef WINPR_HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <winpr/assert.h>
+
+#include "../handle/handle.h"
+
+BOOL CloseHandle(HANDLE hObject)
+{
+ ULONG Type = 0;
+ WINPR_HANDLE* Object = NULL;
+
+ if (!winpr_Handle_GetInfo(hObject, &Type, &Object))
+ return FALSE;
+
+ if (!Object)
+ return FALSE;
+
+ if (!Object->ops)
+ return FALSE;
+
+ if (Object->ops->CloseHandle)
+ return Object->ops->CloseHandle(hObject);
+
+ return FALSE;
+}
+
+BOOL DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle,
+ LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle,
+ DWORD dwOptions)
+{
+ *((ULONG_PTR*)lpTargetHandle) = (ULONG_PTR)hSourceHandle;
+ return TRUE;
+}
+
+BOOL GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags)
+{
+ return TRUE;
+}
+
+BOOL SetHandleInformation(HANDLE hObject, DWORD dwMask, DWORD dwFlags)
+{
+ return TRUE;
+}
+
+#endif
diff --git a/winpr/libwinpr/handle/handle.h b/winpr/libwinpr/handle/handle.h
new file mode 100644
index 0000000..dda6d35
--- /dev/null
+++ b/winpr/libwinpr/handle/handle.h
@@ -0,0 +1,198 @@
+/**
+ * WinPR: Windows Portable Runtime
+ * Handle Management
+ *
+ * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef WINPR_HANDLE_PRIVATE_H
+#define WINPR_HANDLE_PRIVATE_H
+
+#include <winpr/handle.h>
+#include <winpr/file.h>
+#include <winpr/synch.h>
+#include <winpr/winsock.h>
+
+#define HANDLE_TYPE_NONE 0
+#define HANDLE_TYPE_PROCESS 1
+#define HANDLE_TYPE_THREAD 2
+#define HANDLE_TYPE_EVENT 3
+#define HANDLE_TYPE_MUTEX 4
+#define HANDLE_TYPE_SEMAPHORE 5
+#define HANDLE_TYPE_TIMER 6
+#define HANDLE_TYPE_NAMED_PIPE 7
+#define HANDLE_TYPE_ANONYMOUS_PIPE 8
+#define HANDLE_TYPE_ACCESS_TOKEN 9
+#define HANDLE_TYPE_FILE 10
+#define HANDLE_TYPE_TIMER_QUEUE 11
+#define HANDLE_TYPE_TIMER_QUEUE_TIMER 12
+#define HANDLE_TYPE_COMM 13
+
+typedef BOOL (*pcIsHandled)(HANDLE handle);
+typedef BOOL (*pcCloseHandle)(HANDLE handle);
+typedef int (*pcGetFd)(HANDLE handle);
+typedef DWORD (*pcCleanupHandle)(HANDLE handle);
+typedef BOOL (*pcReadFile)(PVOID Object, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
+ LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
+typedef BOOL (*pcReadFileEx)(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
+ LPOVERLAPPED lpOverlapped,
+ LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
+typedef BOOL (*pcReadFileScatter)(HANDLE hFile, FILE_SEGMENT_ELEMENT aSegmentArray[],
+ DWORD nNumberOfBytesToRead, LPDWORD lpReserved,
+ LPOVERLAPPED lpOverlapped);
+typedef BOOL (*pcWriteFile)(PVOID Object, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
+ LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
+typedef BOOL (*pcWriteFileEx)(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
+ LPOVERLAPPED lpOverlapped,
+ LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
+typedef BOOL (*pcWriteFileGather)(HANDLE hFile, FILE_SEGMENT_ELEMENT aSegmentArray[],
+ DWORD nNumberOfBytesToWrite, LPDWORD lpReserved,
+ LPOVERLAPPED lpOverlapped);
+typedef DWORD (*pcGetFileSize)(HANDLE handle, LPDWORD lpFileSizeHigh);
+typedef BOOL (*pcGetFileInformationByHandle)(HANDLE handle,
+ LPBY_HANDLE_FILE_INFORMATION lpFileInformation);
+typedef BOOL (*pcFlushFileBuffers)(HANDLE hFile);
+typedef BOOL (*pcSetEndOfFile)(HANDLE handle);
+typedef DWORD (*pcSetFilePointer)(HANDLE handle, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh,
+ DWORD dwMoveMethod);
+typedef BOOL (*pcSetFilePointerEx)(HANDLE hFile, LARGE_INTEGER liDistanceToMove,
+ PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod);
+typedef BOOL (*pcLockFile)(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh,
+ DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh);
+typedef BOOL (*pcLockFileEx)(HANDLE hFile, DWORD dwFlags, DWORD dwReserved,
+ DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh,
+ LPOVERLAPPED lpOverlapped);
+typedef BOOL (*pcUnlockFile)(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh,
+ DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh);
+typedef BOOL (*pcUnlockFileEx)(HANDLE hFile, DWORD dwReserved, DWORD nNumberOfBytesToUnlockLow,
+ DWORD nNumberOfBytesToUnlockHigh, LPOVERLAPPED lpOverlapped);
+typedef BOOL (*pcSetFileTime)(HANDLE hFile, const FILETIME* lpCreationTime,
+ const FILETIME* lpLastAccessTime, const FILETIME* lpLastWriteTime);
+
+typedef struct
+{
+ pcIsHandled IsHandled;
+ pcCloseHandle CloseHandle;
+ pcGetFd GetFd;
+ pcCleanupHandle CleanupHandle;
+ pcReadFile ReadFile;
+ pcReadFileEx ReadFileEx;
+ pcReadFileScatter ReadFileScatter;
+ pcWriteFile WriteFile;
+ pcWriteFileEx WriteFileEx;
+ pcWriteFileGather WriteFileGather;
+ pcGetFileSize GetFileSize;
+ pcFlushFileBuffers FlushFileBuffers;
+ pcSetEndOfFile SetEndOfFile;
+ pcSetFilePointer SetFilePointer;
+ pcSetFilePointerEx SetFilePointerEx;
+ pcLockFile LockFile;
+ pcLockFileEx LockFileEx;
+ pcUnlockFile UnlockFile;
+ pcUnlockFileEx UnlockFileEx;
+ pcSetFileTime SetFileTime;
+ pcGetFileInformationByHandle GetFileInformationByHandle;
+} HANDLE_OPS;
+
+typedef struct
+{
+ ULONG Type;
+ ULONG Mode;
+ HANDLE_OPS* ops;
+} WINPR_HANDLE;
+
+static INLINE BOOL WINPR_HANDLE_IS_HANDLED(HANDLE handle, ULONG type, BOOL invalidValue)
+{
+ WINPR_HANDLE* pWinprHandle = (WINPR_HANDLE*)handle;
+ BOOL invalid = !pWinprHandle;
+
+ if (invalidValue)
+ {
+ if (INVALID_HANDLE_VALUE == pWinprHandle)
+ invalid = TRUE;
+ }
+
+ if (invalid || (pWinprHandle->Type != type))
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static INLINE void WINPR_HANDLE_SET_TYPE_AND_MODE(void* _handle, ULONG _type, ULONG _mode)
+{
+ WINPR_HANDLE* hdl = (WINPR_HANDLE*)_handle;
+
+ hdl->Type = _type;
+ hdl->Mode = _mode;
+}
+
+static INLINE BOOL winpr_Handle_GetInfo(HANDLE handle, ULONG* pType, WINPR_HANDLE** pObject)
+{
+ WINPR_HANDLE* wHandle;
+
+ if (handle == NULL)
+ return FALSE;
+
+ /* INVALID_HANDLE_VALUE is an invalid value for every handle, but it
+ * confuses the clang scanbuild analyzer. */
+#ifndef __clang_analyzer__
+ if (handle == INVALID_HANDLE_VALUE)
+ return FALSE;
+#endif
+
+ wHandle = (WINPR_HANDLE*)handle;
+
+ *pType = wHandle->Type;
+ *pObject = handle;
+
+ return TRUE;
+}
+
+static INLINE int winpr_Handle_getFd(HANDLE handle)
+{
+ WINPR_HANDLE* hdl;
+ ULONG type;
+
+ if (!winpr_Handle_GetInfo(handle, &type, &hdl))
+ return -1;
+
+ if (!hdl || !hdl->ops || !hdl->ops->GetFd)
+ return -1;
+
+ return hdl->ops->GetFd(handle);
+}
+
+static INLINE DWORD winpr_Handle_cleanup(HANDLE handle)
+{
+ WINPR_HANDLE* hdl;
+ ULONG type;
+
+ if (!winpr_Handle_GetInfo(handle, &type, &hdl))
+ return WAIT_FAILED;
+
+ if (!hdl || !hdl->ops)
+ return WAIT_FAILED;
+
+ /* If there is no cleanup function, assume all ok. */
+ if (!hdl->ops->CleanupHandle)
+ return WAIT_OBJECT_0;
+
+ return hdl->ops->CleanupHandle(handle);
+}
+
+#endif /* WINPR_HANDLE_PRIVATE_H */
diff --git a/winpr/libwinpr/handle/nonehandle.c b/winpr/libwinpr/handle/nonehandle.c
new file mode 100644
index 0000000..1fe54b8
--- /dev/null
+++ b/winpr/libwinpr/handle/nonehandle.c
@@ -0,0 +1,82 @@
+/**
+ * WinPR: Windows Portable Runtime
+ * NoneHandle a.k.a. brathandle should be used where a handle is needed, but
+ * functionality is not implemented yet or not implementable.
+ *
+ * Copyright 2014 DI (FH) Martin Haimberger <martin.haimberger@thincast.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <winpr/config.h>
+
+#include "nonehandle.h"
+
+#ifndef _WIN32
+
+#include <pthread.h>
+
+static BOOL NoneHandleCloseHandle(HANDLE handle)
+{
+ WINPR_NONE_HANDLE* none = (WINPR_NONE_HANDLE*)handle;
+ free(none);
+ return TRUE;
+}
+
+static BOOL NoneHandleIsHandle(HANDLE handle)
+{
+ return WINPR_HANDLE_IS_HANDLED(handle, HANDLE_TYPE_NONE, FALSE);
+}
+
+static int NoneHandleGetFd(HANDLE handle)
+{
+ if (!NoneHandleIsHandle(handle))
+ return -1;
+
+ return -1;
+}
+
+static HANDLE_OPS ops = { NoneHandleIsHandle,
+ NoneHandleCloseHandle,
+ NoneHandleGetFd,
+ NULL, /* CleanupHandle */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL };
+
+HANDLE CreateNoneHandle(void)
+{
+ WINPR_NONE_HANDLE* none = (WINPR_NONE_HANDLE*)calloc(1, sizeof(WINPR_NONE_HANDLE));
+
+ if (!none)
+ return NULL;
+
+ none->common.ops = &ops;
+ return (HANDLE)none;
+}
+
+#endif
diff --git a/winpr/libwinpr/handle/nonehandle.h b/winpr/libwinpr/handle/nonehandle.h
new file mode 100644
index 0000000..50e224c
--- /dev/null
+++ b/winpr/libwinpr/handle/nonehandle.h
@@ -0,0 +1,40 @@
+/**
+ * WinPR: Windows Portable Runtime
+ * NoneHandle a.k.a. brathandle should be used where a handle is needed, but
+ * functionality is not implemented yet or not implementable.
+ *
+ * Copyright 2014 DI (FH) Martin Haimberger <martin.haimberger@thincast.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef WINPR_NONE_HANDLE_PRIVATE_H
+#define WINPR_NONE_HANDLE_PRIVATE_H
+
+#ifndef _WIN32
+
+#include <winpr/handle.h>
+#include "handle.h"
+
+struct winpr_none_handle
+{
+ WINPR_HANDLE common;
+};
+
+typedef struct winpr_none_handle WINPR_NONE_HANDLE;
+
+HANDLE CreateNoneHandle(void);
+
+#endif /*_WIN32*/
+
+#endif /* WINPR_NONE_HANDLE_PRIVATE_H */