diff options
Diffstat (limited to 'src/osd/windows/winptty.c')
-rw-r--r-- | src/osd/windows/winptty.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/osd/windows/winptty.c b/src/osd/windows/winptty.c new file mode 100644 index 00000000000..28de05e9a31 --- /dev/null +++ b/src/osd/windows/winptty.c @@ -0,0 +1,67 @@ +#define WIN32_LEAN_AND_MEAN + +#include <windows.h> + +#include "winfile.h" +#include "strconv.h" +#include "winutil.h" + +const char *winfile_ptty_identifier = "\\\\.\\pipe\\"; + +file_error win_open_ptty(const char *path, UINT32 openflags, osd_file **file, UINT64 *filesize) +{ + TCHAR *t_name; + HANDLE pipe; + + if((t_name = tstring_from_utf8(path)) == NULL) + return FILERR_OUT_OF_MEMORY; + + pipe = CreateNamedPipe(t_name, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_NOWAIT, 1, 32, 32, 0, NULL); + + if(pipe == INVALID_HANDLE_VALUE) + return FILERR_ACCESS_DENIED; + + (*file)->handle = pipe; + *filesize = 0; + osd_free(t_name); + return FILERR_NONE; +} + +file_error win_read_ptty(osd_file *file, void *buffer, UINT64 offset, UINT32 count, UINT32 *actual) +{ + BOOL res; + DWORD bytes_read; + + res = ReadFile(file->handle, buffer, count, &bytes_read, NULL); + if(res == FALSE) + return win_error_to_file_error(GetLastError()); + + if(actual != NULL) + *actual = bytes_read; + + return FILERR_NONE; +} + +file_error win_write_ptty(osd_file *file, const void *buffer, UINT64 offset, UINT32 count, UINT32 *actual) +{ + BOOL res; + DWORD bytes_wrote; + + res = WriteFile(file->handle, buffer, count, &bytes_wrote, NULL); + if(res == FALSE) + return win_error_to_file_error(GetLastError()); + + if(actual != NULL) + *actual = bytes_wrote; + + return FILERR_NONE; +} + +file_error win_close_ptty(osd_file *file) +{ + FlushFileBuffers(file->handle); + DisconnectNamedPipe(file->handle); + CloseHandle(file->handle); + osd_free(file); + return FILERR_NONE; +} |