summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--io.c2
-rw-r--r--test/ruby/test_io.rb36
3 files changed, 42 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 2ac3a89c5a..b3dd0e10f1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Apr 21 19:08:32 2008 Tanaka Akira <akr@fsij.org>
+
+ * io.c (copy_stream_body): call rb_io_check_readable and
+ rb_io_check_writable.
+
Mon Apr 21 17:45:27 2008 Akinori MUSHA <knu@iDaemons.org>
* ext/dbm/dbm.c (fdbm_each_value, fdbm_each_key, fdbm_each_pair):
diff --git a/io.c b/io.c
index 22b82bba8d..d682ea288a 100644
--- a/io.c
+++ b/io.c
@@ -6628,6 +6628,7 @@ copy_stream_body(VALUE arg)
stp->close_src = 1;
}
GetOpenFile(src_io, src_fptr);
+ rb_io_check_readable(src_fptr);
src_fd = src_fptr->fd;
}
stp->src_fd = src_fd;
@@ -6660,6 +6661,7 @@ copy_stream_body(VALUE arg)
stp->dst = dst_io;
}
GetOpenFile(dst_io, dst_fptr);
+ rb_io_check_writable(dst_fptr);
dst_fd = dst_fptr->fd;
}
stp->dst_fd = dst_fd;
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb
index 5ed0ac4d54..06da5db742 100644
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -237,7 +237,6 @@ class TestIO < Test::Unit::TestCase
}
}
-
bigcontent = "abc" * 123456
File.open("bigsrc", "w") {|f| f << bigcontent }
ret = IO.copy_stream("bigsrc", "bigdst")
@@ -511,4 +510,39 @@ class TestIO < Test::Unit::TestCase
assert_equal("bcd", sio.string)
}
end
+
+ def test_copy_stream_src_wbuf
+ mkcdtmpdir {|d|
+ with_pipe {|r, w|
+ File.open("foe", "w+") {|f|
+ f.write "abcd\n"
+ f.rewind
+ f.write "xy"
+ IO.copy_stream(f, w)
+ }
+ assert_equal("xycd\n", File.read("foe"))
+ w.close
+ assert_equal("cd\n", r.read)
+ r.close
+ }
+ }
+ end
+
+ def test_copy_stream_dst_rbuf
+ mkcdtmpdir {|d|
+ with_pipe {|r, w|
+ w << "xyz"
+ w.close
+ File.open("fom", "w+") {|f|
+ f.write "abcd\n"
+ f.rewind
+ assert_equal("abc", f.read(3))
+ f.ungetc "c"
+ IO.copy_stream(r, f)
+ }
+ assert_equal("abxyz", File.read("fom"))
+ }
+ }
+ end
+
end