Blame winpr/libwinpr/io/io.c

Packit Service fa4841
/**
Packit Service fa4841
 * WinPR: Windows Portable Runtime
Packit Service fa4841
 * Asynchronous I/O Functions
Packit Service fa4841
 *
Packit Service fa4841
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifdef HAVE_CONFIG_H
Packit Service fa4841
#include "config.h"
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#include <winpr/io.h>
Packit Service fa4841
Packit Service fa4841
#ifndef _WIN32
Packit Service fa4841
Packit Service fa4841
#ifdef HAVE_UNISTD_H
Packit Service fa4841
#include <unistd.h>
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#include <time.h>
Packit Service fa4841
#include <errno.h>
Packit Service fa4841
#include <stdio.h>
Packit Service fa4841
#include <stdlib.h>
Packit Service fa4841
#include <string.h>
Packit Service fa4841
#include <dirent.h>
Packit Service fa4841
Packit Service fa4841
#include <fcntl.h>
Packit Service fa4841
#include <sys/un.h>
Packit Service fa4841
#include <sys/stat.h>
Packit Service fa4841
#include <sys/socket.h>
Packit Service fa4841
Packit Service fa4841
#include <winpr/crt.h>
Packit Service fa4841
#include <winpr/wlog.h>
Packit Service fa4841
Packit Service fa4841
#include "../handle/handle.h"
Packit Service fa4841
#include "../pipe/pipe.h"
Packit Service fa4841
#include "../log.h"
Packit Service fa4841
Packit Service fa4841
#define TAG WINPR_TAG("io")
Packit Service fa4841
Packit Service b1ea74
BOOL GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped,
Packit Service b1ea74
                         LPDWORD lpNumberOfBytesTransferred, BOOL bWait)
Packit Service fa4841
{
Packit Service fa4841
#if 1
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
#else
Packit Service fa4841
	ULONG Type;
Packit Service fa4841
	WINPR_HANDLE* Object;
Packit Service fa4841
Packit Service fa4841
	if (!winpr_Handle_GetInfo(hFile, &Type, &Object))
Packit Service fa4841
		return FALSE;
Packit Service fa4841
Packit Service fa4841
	else if (Type == HANDLE_TYPE_NAMED_PIPE)
Packit Service fa4841
	{
Packit Service fa4841
		int status = -1;
Packit Service fa4841
		DWORD request;
Packit Service fa4841
		PVOID lpBuffer;
Packit Service fa4841
		DWORD nNumberOfBytes;
Packit Service fa4841
		WINPR_NAMED_PIPE* pipe;
Packit Service fa4841
Packit Service b1ea74
		pipe = (WINPR_NAMED_PIPE*)Object;
Packit Service fa4841
Packit Service fa4841
		if (!(pipe->dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
Packit Service fa4841
			return FALSE;
Packit Service fa4841
Packit Service fa4841
		lpBuffer = lpOverlapped->Pointer;
Packit Service b1ea74
		request = (DWORD)lpOverlapped->Internal;
Packit Service b1ea74
		nNumberOfBytes = (DWORD)lpOverlapped->InternalHigh;
Packit Service fa4841
Packit Service fa4841
		if (request == 0)
Packit Service fa4841
		{
Packit Service fa4841
			if (pipe->clientfd == -1)
Packit Service fa4841
				return FALSE;
Packit Service fa4841
Packit Service fa4841
			status = read(pipe->clientfd, lpBuffer, nNumberOfBytes);
Packit Service fa4841
		}
Packit Service fa4841
		else if (request == 1)
Packit Service fa4841
		{
Packit Service fa4841
			if (pipe->clientfd == -1)
Packit Service fa4841
				return FALSE;
Packit Service fa4841
Packit Service fa4841
			status = write(pipe->clientfd, lpBuffer, nNumberOfBytes);
Packit Service fa4841
		}
Packit Service fa4841
		else if (request == 2)
Packit Service fa4841
		{
Packit Service fa4841
			socklen_t length;
Packit Service fa4841
			struct sockaddr_un s;
Packit Service fa4841
Packit Service fa4841
			if (pipe->serverfd == -1)
Packit Service fa4841
				return FALSE;
Packit Service fa4841
Packit Service fa4841
			length = sizeof(struct sockaddr_un);
Packit Service fa4841
			ZeroMemory(&s, sizeof(struct sockaddr_un));
Packit Service fa4841
Packit Service b1ea74
			status = accept(pipe->serverfd, (struct sockaddr*)&s, &length);
Packit Service fa4841
Packit Service fa4841
			if (status < 0)
Packit Service fa4841
				return FALSE;
Packit Service fa4841
Packit Service fa4841
			pipe->clientfd = status;
Packit Service fa4841
			pipe->ServerMode = FALSE;
Packit Service fa4841
Packit Service fa4841
			status = 0;
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		if (status < 0)
Packit Service fa4841
		{
Packit Service fa4841
			*lpNumberOfBytesTransferred = 0;
Packit Service fa4841
			return FALSE;
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		*lpNumberOfBytesTransferred = status;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return TRUE;
Packit Service fa4841
#endif
Packit Service fa4841
}
Packit Service fa4841
Packit Service b1ea74
BOOL GetOverlappedResultEx(HANDLE hFile, LPOVERLAPPED lpOverlapped,
Packit Service b1ea74
                           LPDWORD lpNumberOfBytesTransferred, DWORD dwMilliseconds,
Packit Service b1ea74
                           BOOL bAlertable)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL DeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize,
Packit Service b1ea74
                     LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned,
Packit Service b1ea74
                     LPOVERLAPPED lpOverlapped)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service b1ea74
HANDLE CreateIoCompletionPort(HANDLE FileHandle, HANDLE ExistingCompletionPort,
Packit Service b1ea74
                              ULONG_PTR CompletionKey, DWORD NumberOfConcurrentThreads)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return NULL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL GetQueuedCompletionStatus(HANDLE CompletionPort, LPDWORD lpNumberOfBytesTransferred,
Packit Service b1ea74
                               PULONG_PTR lpCompletionKey, LPOVERLAPPED* lpOverlapped,
Packit Service b1ea74
                               DWORD dwMilliseconds)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL GetQueuedCompletionStatusEx(HANDLE CompletionPort, LPOVERLAPPED_ENTRY lpCompletionPortEntries,
Packit Service b1ea74
                                 ULONG ulCount, PULONG ulNumEntriesRemoved, DWORD dwMilliseconds,
Packit Service b1ea74
                                 BOOL fAlertable)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service b1ea74
BOOL PostQueuedCompletionStatus(HANDLE CompletionPort, DWORD dwNumberOfBytesTransferred,
Packit Service b1ea74
                                ULONG_PTR dwCompletionKey, LPOVERLAPPED lpOverlapped)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL CancelIo(HANDLE hFile)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL CancelIoEx(HANDLE hFile, LPOVERLAPPED lpOverlapped)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL CancelSynchronousIo(HANDLE hThread)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#ifdef _UWP
Packit Service fa4841
Packit Service fa4841
#include <winpr/crt.h>
Packit Service fa4841
#include <winpr/wlog.h>
Packit Service fa4841
Packit Service fa4841
#include "../log.h"
Packit Service fa4841
Packit Service fa4841
#define TAG WINPR_TAG("io")
Packit Service fa4841
Packit Service b1ea74
BOOL GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped,
Packit Service b1ea74
                         LPDWORD lpNumberOfBytesTransferred, BOOL bWait)
Packit Service fa4841
{
Packit Service b1ea74
	return GetOverlappedResultEx(hFile, lpOverlapped, lpNumberOfBytesTransferred,
Packit Service b1ea74
	                             bWait ? INFINITE : 0, TRUE);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL DeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize,
Packit Service b1ea74
                     LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned,
Packit Service b1ea74
                     LPOVERLAPPED lpOverlapped)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service b1ea74
HANDLE CreateIoCompletionPort(HANDLE FileHandle, HANDLE ExistingCompletionPort,
Packit Service b1ea74
                              ULONG_PTR CompletionKey, DWORD NumberOfConcurrentThreads)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return NULL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL GetQueuedCompletionStatus(HANDLE CompletionPort, LPDWORD lpNumberOfBytesTransferred,
Packit Service b1ea74
                               PULONG_PTR lpCompletionKey, LPOVERLAPPED* lpOverlapped,
Packit Service b1ea74
                               DWORD dwMilliseconds)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL GetQueuedCompletionStatusEx(HANDLE CompletionPort, LPOVERLAPPED_ENTRY lpCompletionPortEntries,
Packit Service b1ea74
                                 ULONG ulCount, PULONG ulNumEntriesRemoved, DWORD dwMilliseconds,
Packit Service b1ea74
                                 BOOL fAlertable)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service b1ea74
BOOL PostQueuedCompletionStatus(HANDLE CompletionPort, DWORD dwNumberOfBytesTransferred,
Packit Service b1ea74
                                ULONG_PTR dwCompletionKey, LPOVERLAPPED lpOverlapped)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL CancelIo(HANDLE hFile)
Packit Service fa4841
{
Packit Service fa4841
	return CancelIoEx(hFile, NULL);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL CancelSynchronousIo(HANDLE hThread)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: Not implemented", __FUNCTION__);
Packit Service fa4841
	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
#endif