From 682fac15871783915b7147f5a7017c113530a752 Mon Sep 17 00:00:00 2001 From: manojampalam Date: Mon, 7 Mar 2016 20:08:45 -0800 Subject: [PATCH] 3-7 20:00 --- contrib/win32/win32compat/fileio.c | 3 +++ contrib/win32/win32compat/w32fd.c | 11 ++++++++++- regress/unittests/win32compat/file_tests.c | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/contrib/win32/win32compat/fileio.c b/contrib/win32/win32compat/fileio.c index 04f89a4..5aac018 100644 --- a/contrib/win32/win32compat/fileio.c +++ b/contrib/win32/win32compat/fileio.c @@ -393,6 +393,8 @@ VOID CALLBACK WriteCompletionRoutine( pio->write_details.remaining); pio->write_details.error = dwErrorCode; /* TODO - assert that remaining == dwNumberOfBytesTransfered */ + if (pio->write_details.remaining != dwNumberOfBytesTransfered) + abort(); pio->write_details.remaining -= dwNumberOfBytesTransfered; pio->write_details.pending = FALSE; } @@ -453,6 +455,7 @@ fileio_write(struct w32_io* pio, const void *buf, unsigned int max) { if (WriteFileEx(h, pio->write_details.buf, bytes_copied, &pio->write_overlapped, &WriteCompletionRoutine)) { pio->write_details.pending = TRUE; + pio->write_details.remaining = bytes_copied; /* execute APC if write has completed */ if (wait_for_any_event(NULL, 0, 0) == -1) return -1; diff --git a/contrib/win32/win32compat/w32fd.c b/contrib/win32/win32compat/w32fd.c index 2bfaf9d..32c11f1 100644 --- a/contrib/win32/win32compat/w32fd.c +++ b/contrib/win32/win32compat/w32fd.c @@ -622,7 +622,15 @@ w32_dup(int oldfd) { return -1; } - if (!DuplicateHandle(GetCurrentProcess(), src, GetCurrentProcess(), &target, 0, TRUE, DUPLICATE_SAME_ACCESS)) { + if ((oldfd == STDIN_FILENO) && (GetFileType(GetStdHandle(STD_INPUT_HANDLE)) == FILE_TYPE_CHAR)) { + target = CreateFile(L"CONIN$", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, NULL); + if (target == INVALID_HANDLE_VALUE) { + errno = EOTHER; + debug("ERROR: CreateFile CONIN$ failed, error:%d", GetLastError()); + return -1; + } + } + else if (!DuplicateHandle(GetCurrentProcess(), src, GetCurrentProcess(), &target, 0, TRUE, DUPLICATE_SAME_ACCESS)) { errno = EOTHER; debug("ERROR: Duplicated Handle failed, error:%d", GetLastError()); return -1; @@ -636,6 +644,7 @@ w32_dup(int oldfd) { return -1; } + memset(pio, 0, sizeof(struct w32_io)); pio->handle = target; pio->type = FILE_FD; fd_table_set(pio, min_index); diff --git a/regress/unittests/win32compat/file_tests.c b/regress/unittests/win32compat/file_tests.c index e83b505..1808318 100644 --- a/regress/unittests/win32compat/file_tests.c +++ b/regress/unittests/win32compat/file_tests.c @@ -239,7 +239,7 @@ void file_tests() { w32posix_initialize(); - //console_io_test(); + console_io_test(); //file_simple_fileio(); file_blocking_io_tests(); file_nonblocking_io_tests();