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;
|
int error;
|
||||||
if (STRCMP(argv[0], "-") == 0) {
|
if (STRCMP(argv[0], "-") == 0) {
|
||||||
const int stdin_dup_fd = os_dup(STDIN_FILENO);
|
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(
|
FileDescriptor *const stdin_dup = file_open_fd_new(
|
||||||
&error, stdin_dup_fd, kFileReadOnly|kFileNonBlocking);
|
&error, stdin_dup_fd, kFileReadOnly|kFileNonBlocking);
|
||||||
assert(stdin_dup != NULL);
|
assert(stdin_dup != NULL);
|
||||||
|
@ -282,6 +282,7 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
|
|||||||
char *buf = ret_buf;
|
char *buf = ret_buf;
|
||||||
size_t read_remaining = size;
|
size_t read_remaining = size;
|
||||||
RBuffer *const rv = fp->rv;
|
RBuffer *const rv = fp->rv;
|
||||||
|
bool called_read = false;
|
||||||
while (read_remaining) {
|
while (read_remaining) {
|
||||||
const size_t rv_size = rbuffer_size(rv);
|
const size_t rv_size = rbuffer_size(rv);
|
||||||
if (rv_size > 0) {
|
if (rv_size > 0) {
|
||||||
@ -289,7 +290,9 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
|
|||||||
buf += rsize;
|
buf += rsize;
|
||||||
read_remaining -= 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;
|
break;
|
||||||
}
|
}
|
||||||
if (read_remaining) {
|
if (read_remaining) {
|
||||||
@ -343,10 +346,7 @@ ptrdiff_t file_read(FileDescriptor *const fp, char *const ret_buf,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
called_read = true;
|
||||||
if (fp->non_blocking) {
|
|
||||||
// Allow only at most one os_read[v] call.
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (ptrdiff_t)(size - read_remaining);
|
return (ptrdiff_t)(size - read_remaining);
|
||||||
|
@ -36,7 +36,6 @@ describe('Command-line option', function()
|
|||||||
os.remove(dollar_fname)
|
os.remove(dollar_fname)
|
||||||
end)
|
end)
|
||||||
it('treats - as stdin', function()
|
it('treats - as stdin', function()
|
||||||
if helpers.pending_win32(pending) then return end
|
|
||||||
eq(nil, lfs.attributes(fname))
|
eq(nil, lfs.attributes(fname))
|
||||||
funcs.system(
|
funcs.system(
|
||||||
{nvim_prog_abs(), '-u', 'NONE', '-i', 'NONE', '--headless',
|
{nvim_prog_abs(), '-u', 'NONE', '-i', 'NONE', '--headless',
|
||||||
|
Loading…
Reference in New Issue
Block a user