Issue #5530 has been updated by Motohiro KOSAKI.
The code is correct. Ruby's append mode is derived from C and C's append mode mean "ignore file position".
Which documentation bring you confusing?
http://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html
Opening a file with append mode (a as the first character in the mode argument) shall cause all
subsequent writes to the file to be forced to the then current end-of-file, regardless of intervening
calls to fseek().
----------------------------------------
Bug #5530: SEEK_SET malfunctions when used with 'append' File.open mode
http://redmine.ruby-lang.org/issues/5530
Author: Joshua J. Drake
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: all
The following code demonstrates the issue. As documented, IO#seek says "SEEK_SET" will move to a position relative to the start of the file. Using 'ab', it doesn't actually seek where it should. It's possible the documentation is just wrong here, either the code or documentation should change though.
<code lang=ruby>
#!/usr/bin/env ruby
modes = [ 'ab', 'wb', 'w+b', 'r+b' ]
filename = '/tmp/test.txt'
desired = "AABBBBAA"
modes.each { |mode|
File.unlink(filename) rescue nil
File.open(filename, "wb") { |fd|
fd.write('AAAAAAAA')
}
File.open(filename, mode) { |fd|
fd.seek(2, IO::SEEK_SET)
fd.write("BBBB")
fd.close
}
data = ''
File.open(filename, "rb") { |fd|
data = fd.read(fd.stat.size)
}
puts "%3s #{data.inspect}" % mode
}
File.unlink(filename)
puts ""
</code>
Output:
<pre>
fear:0:ruby$ rvm all ruby -v file_mode_test.rb
ruby 1.8.6 (2010-09-02 patchlevel 420) [x86_64-linux]
ab "AAAAAAAABBBB"
wb "\000\000BBBB"
w+b "\000\000BBBB"
r+b "AABBBBAA"
ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux]
ab "AAAAAAAABBBB"
wb "\000\000BBBB"
w+b "\000\000BBBB"
r+b "AABBBBAA"
ruby 1.9.1p378 (2010-01-10 revision 26273) [x86_64-linux]
ab "AAAAAAAABBBB"
wb "\x00\x00BBBB"
w+b "\x00\x00BBBB"
r+b "AABBBBAA"
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
ab "AAAAAAAABBBB"
wb "\x00\x00BBBB"
w+b "\x00\x00BBBB"
r+b "AABBBBAA"
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
ab "AAAAAAAABBBB"
wb "\000\000BBBB"
w+b "\000\000BBBB"
r+b "AABBBBAA"
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]
ab "AAAAAAAABBBB"
wb "\x00\x00BBBB"
w+b "\x00\x00BBBB"
r+b "AABBBBAA"
ruby 1.9.1p431 (2011-02-18 revision 30908) [x86_64-linux]
Error loading gem paths on load path in gem_prelude
can't modify frozen string
<internal:gem_prelude>:69:in `force_encoding'
<internal:gem_prelude>:69:in `set_home'
<internal:gem_prelude>:38:in `dir'
<internal:gem_prelude>:76:in `set_paths'
<internal:gem_prelude>:47:in `path'
<internal:gem_prelude>:286:in `push_all_highest_version_gems_on_load_path'
<internal:gem_prelude>:355:in `<compiled>'
ab "AAAAAAAABBBB"
wb "\x00\x00BBBB"
w+b "\x00\x00BBBB"
r+b "AABBBBAA"
ruby 1.9.3dev (2011-07-31 revision 32789) [x86_64-linux]
ab "AAAAAAAABBBB"
wb "\x00\x00BBBB"
w+b "\x00\x00BBBB"
r+b "AABBBBAA"
fear:0:ruby$
</pre>
The other modes behave as expected.
See also - http://dev.metasploit.com/redmine/issues/3199
--
http://redmine.ruby-lang.org