libwinpr-pipe: implement anonymous pipes

This commit is contained in:
Marc-André Moreau 2012-10-07 20:25:50 -04:00
parent 8d7495dba4
commit 9aa1217c4e
10 changed files with 109 additions and 10 deletions

View File

@ -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);

View File

@ -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>

View File

@ -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;

View File

@ -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,

View File

@ -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()

View File

@ -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;
}

View File

@ -19,7 +19,7 @@ int TestPathIsUNCEx(int argc, char* argv[])
_tcscpy(Path, testPathUNC);
status = PathIsUNCEx(Path, (LPTSTR*) &Server);
status = PathIsUNCEx(Path, &Server);
if (!status)
{

View File

@ -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()

View File

@ -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;
}

View File

@ -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()