mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
win: Fix reading from stdin
* Reading from stdin on Windows is fixed in the same way as it was in #8267. * The file_read function was returning without filling the destination buffer when it was called with a non-blocking file descriptor.
This commit is contained in:
parent
ad999eaa77
commit
387fbcd95c
@ -1096,6 +1096,17 @@ scripterror:
|
||||
int error;
|
||||
if (STRCMP(argv[0], "-") == 0) {
|
||||
const int stdin_dup_fd = os_dup(STDIN_FILENO);
|
||||
#ifdef WIN32
|
||||
// On Windows, replace the original stdin with the
|
||||
// console input handle.
|
||||
close(STDIN_FILENO);
|
||||
const HANDLE conin_handle =
|
||||
CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES)NULL,
|
||||
OPEN_EXISTING, 0, (HANDLE)NULL);
|
||||
const int conin_fd = _open_osfhandle(conin_handle, _O_RDONLY);
|
||||
assert(conin_fd == STDIN_FILENO);
|
||||
#endif
|
||||
FileDescriptor *const stdin_dup = file_open_fd_new(
|
||||
&error, stdin_dup_fd, kFileReadOnly|kFileNonBlocking);
|
||||
assert(stdin_dup != NULL);
|
||||
|
@ -282,6 +282,7 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
|
||||
char *buf = ret_buf;
|
||||
size_t read_remaining = size;
|
||||
RBuffer *const rv = fp->rv;
|
||||
bool called_read = false;
|
||||
while (read_remaining) {
|
||||
const size_t rv_size = rbuffer_size(rv);
|
||||
if (rv_size > 0) {
|
||||
@ -289,7 +290,9 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
|
||||
buf += rsize;
|
||||
read_remaining -= rsize;
|
||||
}
|
||||
if (fp->eof) {
|
||||
if (fp->eof
|
||||
// Allow only at most one os_read[v] call.
|
||||
|| (called_read && fp->non_blocking)) {
|
||||
break;
|
||||
}
|
||||
if (read_remaining) {
|
||||
@ -343,10 +346,7 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (fp->non_blocking) {
|
||||
// Allow only at most one os_read[v] call.
|
||||
break;
|
||||
called_read = true;
|
||||
}
|
||||
}
|
||||
return (ptrdiff_t)(size - read_remaining);
|
||||
|
@ -36,7 +36,6 @@ describe('Command-line option', function()
|
||||
os.remove(dollar_fname)
|
||||
end)
|
||||
it('treats - as stdin', function()
|
||||
if helpers.pending_win32(pending) then return end
|
||||
eq(nil, lfs.attributes(fname))
|
||||
funcs.system(
|
||||
{nvim_prog_abs(), '-u', 'NONE', '-i', 'NONE', '--headless',
|
||||
|
Loading…
Reference in New Issue
Block a user