about summary refs log tree commit homepage
path: root/lib/mogilefs/copy_stream.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mogilefs/copy_stream.rb')
-rw-r--r--lib/mogilefs/copy_stream.rb12
1 files changed, 7 insertions, 5 deletions
diff --git a/lib/mogilefs/copy_stream.rb b/lib/mogilefs/copy_stream.rb
index b928031..7531f54 100644
--- a/lib/mogilefs/copy_stream.rb
+++ b/lib/mogilefs/copy_stream.rb
@@ -3,24 +3,26 @@
 # internal compatibility class for older Rubies
 module MogileFS::CopyStream # :nodoc:
   def self.copy_stream(src, dst)
-    src_io = String === src ? File.open(src) : src
+    src_io = src.respond_to?(:to_str) ? File.open(src) : src
+    dst_io = dst.respond_to?(:to_str) ? File.open(dst, "w") : dst
     buf = ""
     written = 0
     if src_io.respond_to?(:readpartial)
       begin
         src_io.readpartial(0x4000, buf)
-        written += dst.write(buf)
+        written += dst_io.write(buf)
       rescue EOFError
         break
       end while true
     else
       while src_io.read(0x4000, buf)
-        written += dst.write(buf)
+        written += dst_io.write(buf)
       end
     end
-    dst.flush if dst.respond_to?(:flush)
+    dst_io.flush if dst_io.respond_to?(:flush)
     written
     ensure
-      src_io.close if String === src
+      src_io.close if src_io != src
+      dst_io.close if dst_io != dst
   end
 end