On 2008.02.06 04:30, Eero Saynatkari wrote: > On 2008.02.06 03:00, Sam Ruby wrote: > > require 'tmpdir' > > > > save = STDOUT.dup > > STDOUT.reopen File.open(File.join(Dir.tmpdir, "should_output_#{$$}"), "w+") > > puts 'hi' > > out = STDOUT.dup > > STDOUT.reopen save > > > > out.rewind > > p out.read > > > > reopen.rb:7:in `reopen': /tmp/should_output_8694 can't change access > > mode from "w+" to "w" (ArgumentError) > > from reopen.rb:7:in `<main>' > > > > Is this a bug in Ruby 1.9? > > The error message is ambiguous at least. It means that for some reason, > the backend is trying to apply the existing mode 'w+' to the stream to > be opened and since STDOUT is 'w', failing to do so because that would > "widen" the stream. It is a bug, probably caused by 'incorrect' use of > freopen(). > > Logically, there is no reason why reopen should care about the previous > mode of the old stream since it is just closed/discarded. freopen() does > take a new mode which is not allowed to widen the existing mode on the > stream but that only affects the new stream (or pointer), not the previous > one. Blah, exactly the wrong angle of explanation and the "analysis" was inaccurate, too, after reading the io.c code. My apologies. The issue is a special protection mechanism for the stdio streams. Looks like the original change was this: Fri Dec 24 02:52:52 2004 Nobuyoshi Nakada <nobu / ruby-lang.org> * io.c (io_reopen, rb_io_reopen): prohibit to change access mode for special IO ports. [ruby-dev:25225] And Matz reverted it later--but only in the 1.8 branch. Sat Dec 25 01:28:23 2004 Yukihiro Matsumoto <matz / ruby-lang.org> * io.c: cancel io_reopen() change on Dec. 24th. 1.9 does not have that revert. Anyway, the larger point stands: in my opinion, there is no reason why #reopen should care about the existing file mode under any circumstances and that the 1.8 behaviour is the correct one. This is a buyer beware situation--if you #reopen stdio streams, you better make sure that you have them stored somewhere if you want them back. If anyone can explain where the 1.9 behaviour is desirable, I would certainly be happy to listen. The only post I found is the ruby-dev one that seems to reference a now-defunct or changed site (my Japanese is not exactly stellar.) -- Eero