libwinpr-pipe: implement anonymous pipes
This commit is contained in:
parent
8d7495dba4
commit
9aa1217c4e
@ -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);
|
||||
|
@ -20,6 +20,7 @@
|
||||
#ifndef WINPR_PIPE_H
|
||||
#define WINPR_PIPE_H
|
||||
|
||||
#include <winpr/file.h>
|
||||
#include <winpr/winpr.h>
|
||||
#include <winpr/error.h>
|
||||
#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;
|
||||
|
||||
|
@ -21,8 +21,14 @@
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <winpr/handle.h>
|
||||
|
||||
#include <winpr/file.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#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,
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ int TestPathIsUNCEx(int argc, char* argv[])
|
||||
|
||||
_tcscpy(Path, testPathUNC);
|
||||
|
||||
status = PathIsUNCEx(Path, (LPTSTR*) &Server);
|
||||
status = PathIsUNCEx(Path, &Server);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
|
@ -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()
|
||||
|
||||
|
@ -22,13 +22,39 @@
|
||||
#endif
|
||||
|
||||
#include <winpr/crt.h>
|
||||
#include <winpr/handle.h>
|
||||
|
||||
#include <winpr/pipe.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#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;
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user