From 9aa1217c4e8040d78ce64fc78068ef2a5ef17c99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 7 Oct 2012 20:25:50 -0400 Subject: [PATCH] libwinpr-pipe: implement anonymous pipes --- winpr/include/winpr/handle.h | 2 + winpr/include/winpr/pipe.h | 1 + winpr/include/winpr/wtypes.h | 2 +- winpr/libwinpr/file/file.c | 50 +++++++++++++++++++++- winpr/libwinpr/handle/CMakeLists.txt | 14 +++++- winpr/libwinpr/handle/handle.c | 15 +++++++ winpr/libwinpr/path/test/TestPathIsUNCEx.c | 2 +- winpr/libwinpr/pipe/CMakeLists.txt | 2 +- winpr/libwinpr/pipe/pipe.c | 26 +++++++++++ winpr/libwinpr/synch/CMakeLists.txt | 5 +-- 10 files changed, 109 insertions(+), 10 deletions(-) diff --git a/winpr/include/winpr/handle.h b/winpr/include/winpr/handle.h index 3ae0bc5cb..f479a4a63 100644 --- a/winpr/include/winpr/handle.h +++ b/winpr/include/winpr/handle.h @@ -33,6 +33,8 @@ #define HANDLE_TYPE_MUTEX 3 #define HANDLE_TYPE_SEMAPHORE 4 #define HANDLE_TYPE_TIMER 5 +#define HANDLE_TYPE_NAMED_PIPE 6 +#define HANDLE_TYPE_ANONYMOUS_PIPE 7 WINPR_API HANDLE winpr_Handle_Insert(ULONG Type, PVOID Object); WINPR_API BOOL winpr_Handle_Remove(HANDLE handle); diff --git a/winpr/include/winpr/pipe.h b/winpr/include/winpr/pipe.h index 675065317..24ef3e779 100644 --- a/winpr/include/winpr/pipe.h +++ b/winpr/include/winpr/pipe.h @@ -20,6 +20,7 @@ #ifndef WINPR_PIPE_H #define WINPR_PIPE_H +#include #include #include #include diff --git a/winpr/include/winpr/wtypes.h b/winpr/include/winpr/wtypes.h index 0fb299928..65868531c 100644 --- a/winpr/include/winpr/wtypes.h +++ b/winpr/include/winpr/wtypes.h @@ -70,7 +70,7 @@ typedef short SHORT; #define CONST const #define CALLBACK -typedef void* HANDLE, *LPHANDLE; +typedef void* HANDLE, *PHANDLE, *LPHANDLE; typedef HANDLE HINSTANCE; typedef HANDLE HMODULE; diff --git a/winpr/libwinpr/file/file.c b/winpr/libwinpr/file/file.c index 9ae9c831b..08f562d33 100644 --- a/winpr/libwinpr/file/file.c +++ b/winpr/libwinpr/file/file.c @@ -21,8 +21,14 @@ #include "config.h" #endif +#include + #include +#ifdef HAVE_UNISTD_H +#include +#endif + /** * api-ms-win-core-file-l1-2-0.dll: * @@ -134,7 +140,27 @@ BOOL DeleteFileW(LPCWSTR lpFileName) BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) { - return TRUE; + ULONG Type; + PVOID Object; + + if (!winpr_Handle_GetInfo(hFile, &Type, &Object)) + return FALSE; + + if (Type == HANDLE_TYPE_ANONYMOUS_PIPE) + { + int status; + int read_fd; + + read_fd = (int) ((ULONG_PTR) Object); + + status = read(read_fd, lpBuffer, nNumberOfBytesToRead); + + *lpNumberOfBytesRead = status; + + return TRUE; + } + + return FALSE; } BOOL ReadFileEx(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, @@ -152,7 +178,27 @@ BOOL ReadFileScatter(HANDLE hFile, FILE_SEGMENT_ELEMENT aSegmentArray[], BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped) { - return TRUE; + ULONG Type; + PVOID Object; + + if (!winpr_Handle_GetInfo(hFile, &Type, &Object)) + return FALSE; + + if (Type == HANDLE_TYPE_ANONYMOUS_PIPE) + { + int status; + int write_fd; + + write_fd = (int) ((ULONG_PTR) Object); + + status = write(write_fd, lpBuffer, nNumberOfBytesToWrite); + + *lpNumberOfBytesWritten = status; + + return TRUE; + } + + return FALSE; } BOOL WriteFileEx(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, diff --git a/winpr/libwinpr/handle/CMakeLists.txt b/winpr/libwinpr/handle/CMakeLists.txt index eb0a9db34..207d4885e 100644 --- a/winpr/libwinpr/handle/CMakeLists.txt +++ b/winpr/libwinpr/handle/CMakeLists.txt @@ -18,6 +18,9 @@ set(MODULE_NAME "winpr-handle") set(MODULE_PREFIX "WINPR_HANDLE") +set(CMAKE_THREAD_PREFER_PTHREAD) +find_required_package(Threads) + set(${MODULE_PREFIX}_SRCS handle.c table.c) @@ -34,9 +37,18 @@ endif() set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SOVERSION ${WINPR_VERSION} PREFIX "lib") -if(WITH_MONOLITHIC_BUILD) +set(${MODULE_PREFIX}_LIBS + ${CMAKE_THREAD_LIBS_INIT} + ${CMAKE_DL_LIBS}) + +if(${CMAKE_SYSTEM_NAME} MATCHES SunOS) + set(WINPR_SYNCH_LIBS ${WINPR_SYNCH_LIBS} rt) +endif() +if(WITH_MONOLITHIC_BUILD) + set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() + target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() diff --git a/winpr/libwinpr/handle/handle.c b/winpr/libwinpr/handle/handle.c index 4e0d9e840..13c59e601 100644 --- a/winpr/libwinpr/handle/handle.c +++ b/winpr/libwinpr/handle/handle.c @@ -85,6 +85,21 @@ BOOL CloseHandle(HANDLE hObject) return TRUE; } + else if (Type == HANDLE_TYPE_ANONYMOUS_PIPE) + { + int pipe_fd; + + pipe_fd = (int) ((ULONG_PTR) Object); + + if (pipe_fd != -1) + { + close(pipe_fd); + } + + winpr_Handle_Remove(Object); + + return TRUE; + } return FALSE; } diff --git a/winpr/libwinpr/path/test/TestPathIsUNCEx.c b/winpr/libwinpr/path/test/TestPathIsUNCEx.c index 40edfc86c..3cea93432 100644 --- a/winpr/libwinpr/path/test/TestPathIsUNCEx.c +++ b/winpr/libwinpr/path/test/TestPathIsUNCEx.c @@ -19,7 +19,7 @@ int TestPathIsUNCEx(int argc, char* argv[]) _tcscpy(Path, testPathUNC); - status = PathIsUNCEx(Path, (LPTSTR*) &Server); + status = PathIsUNCEx(Path, &Server); if (!status) { diff --git a/winpr/libwinpr/pipe/CMakeLists.txt b/winpr/libwinpr/pipe/CMakeLists.txt index 42ba8f3d3..45e824a24 100644 --- a/winpr/libwinpr/pipe/CMakeLists.txt +++ b/winpr/libwinpr/pipe/CMakeLists.txt @@ -36,7 +36,7 @@ set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION_FULL} SO if(WITH_MONOLITHIC_BUILD) else() - target_link_libraries(${MODULE_NAME} winpr-crt) + target_link_libraries(${MODULE_NAME} winpr-crt winpr-file winpr-handle) install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() diff --git a/winpr/libwinpr/pipe/pipe.c b/winpr/libwinpr/pipe/pipe.c index 4e857730f..14d784beb 100644 --- a/winpr/libwinpr/pipe/pipe.c +++ b/winpr/libwinpr/pipe/pipe.c @@ -22,13 +22,39 @@ #endif #include +#include #include +#ifdef HAVE_UNISTD_H +#include +#endif + #ifndef _WIN32 BOOL CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize) { + void* ptr; + HANDLE handle; + int pipe_fd[2]; + + pipe_fd[0] = -1; + pipe_fd[1] = -1; + + if (pipe(pipe_fd) < 0) + { + printf("CreatePipe: failed to create pipe\n"); + return FALSE; + } + + ptr = (void*) ((ULONG_PTR) pipe_fd[0]); + handle = winpr_Handle_Insert(HANDLE_TYPE_ANONYMOUS_PIPE, ptr); + *((ULONG_PTR*) hReadPipe) = (ULONG_PTR) handle; + + ptr = (void*) ((ULONG_PTR) pipe_fd[1]); + handle = winpr_Handle_Insert(HANDLE_TYPE_ANONYMOUS_PIPE, ptr); + *((ULONG_PTR*) hWritePipe) = (ULONG_PTR) handle; + return TRUE; } diff --git a/winpr/libwinpr/synch/CMakeLists.txt b/winpr/libwinpr/synch/CMakeLists.txt index d604bf08f..78f5de5af 100644 --- a/winpr/libwinpr/synch/CMakeLists.txt +++ b/winpr/libwinpr/synch/CMakeLists.txt @@ -60,10 +60,7 @@ endif() if(WITH_MONOLITHIC_BUILD) set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE) else() - if(NOT WIN32) - set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr-handle) - endif() - + set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr-handle) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif()