copy_stream: enough to get this working under MRI 1.8
[ruby_io_splice.git] / lib / io / splice / mri_18.rb
blobad20152e737e3b1f0871de59eb00b6f8e4bee457
1 # :enddoc:
2 require "io/nonblock"
3 module IO::Splice
4   class << self
5     remove_method :full
6     remove_method :partial
7   end
8   def self.full(src, dst, len, src_offset)
9     dst.to_io.nonblock = src.to_io.nonblock = true
10     spliced = 0
11     case n = IO.trysplice(src, src_offset, dst, nil, len, IO::Splice::F_MOVE)
12     when :EAGAIN
13       src.to_io.wait
14       IO.select(nil, [dst])
15     when Integer
16       spliced += n
17       len -= n
18       src_offset += n if src_offset
19     when nil
20       break
21     end while len > 0
22     spliced
23   end
25   def self.partial(src, dst, len, src_offset)
26     dst.to_io.nonblock = src.to_io.nonblock = true
27     begin
28       src.to_io.wait
29       IO.select(nil, [dst])
30       rv = IO.trysplice(src, src_offset, dst, nil, len, IO::Splice::F_MOVE)
31     end while rv == :EAGAIN
32     rv
33   end
34 end