diff options
Diffstat (limited to 'lib/yahns/sendfile_compat.rb')
-rw-r--r-- | lib/yahns/sendfile_compat.rb | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/yahns/sendfile_compat.rb b/lib/yahns/sendfile_compat.rb new file mode 100644 index 0000000..e3f53d1 --- /dev/null +++ b/lib/yahns/sendfile_compat.rb @@ -0,0 +1,29 @@ +# -*- encoding: binary -*- +# Copyright (C) 2009-2014, Eric Wong <normalperson@yhbt.net> et. al. +# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt) +require 'io/extra' # gem install io-extra + +module Yahns::SendfileCompat + def trysendfile(io, offset, count) + return 0 if count == 0 + count = 0x4000 if count > 0x4000 + str = IO.pread(io.fileno, count, offset) + if count > str.bytesize + raise EOFError, "end of file reached" + end + n = 0 + case rv = kgio_trywrite(str) + when String # partial write, keep trying + n += (str.bytesize - rv.bytesize) + str = rv + when :wait_writable, :wait_readable + return n > 0 ? n : rv + when nil + return n + str.bytesize # yay! + end while true + end +end + +class IO + include Yahns::SendfileCompat +end |