Class: Vagrant::Util::IO
- Inherits:
-
Object
- Object
- Vagrant::Util::IO
- Defined in:
- lib/vagrant/util/io.rb
Constant Summary collapse
- READ_CHUNK_SIZE =
The chunk size for reading from subprocess IO.
4096
Class Method Summary collapse
-
.read_until_block(io) ⇒ String
Reads data from an IO object while it can, returning the data it reads.
Class Method Details
.read_until_block(io) ⇒ String
Reads data from an IO object while it can, returning the data it reads. When it encounters a case when it can't read anymore, it returns the data.
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/vagrant/util/io.rb', line 17 def self.read_until_block(io) data = "" while true begin if Platform.windows? # Windows doesn't support non-blocking reads on # file descriptors or pipes so we have to get # a bit more creative. # Check if data is actually ready on this IO device. # We have to do this since `readpartial` will actually block # until data is available, which can cause blocking forever # in some cases. results = ::IO.select([io], nil, nil, 1.0) break if !results || results[0].empty? # Read! data << io.readpartial(READ_CHUNK_SIZE).encode( "UTF-8", Encoding.default_external, invalid: :replace, undef: :replace ) else # Do a simple non-blocking read on the IO object data << io.read_nonblock(READ_CHUNK_SIZE) end rescue EOFError, Errno::EAGAIN, ::IO::WaitReadable break end end data end |