IO.pos bug?

irb(main):001:0> f = File.new("/etc/host.conf")
=> #<File:/etc/host.conf>
irb(main):002:0> f.gets
=> “multi off\n”
irb(main):003:0> f.pos
=> 10
irb(main):004:0> f.gets
=> “order hosts,bind\n”
irb(main):005:0> f.pos
=> 27
irb(main):006:0> f.close
=> nil

All right.

irb(main):007:0> f = File.new("/etc/host.conf")
=> #<File:/etc/host.conf>
irb(main):008:0> f.sysread(5)
=> “multi”
irb(main):009:0> f.pos
=> 5
irb(main):010:0> f.sysread(10)
=> " off\norder"
irb(main):011:0> f.pos
=> 5

Bug?
% ruby1.8 --version
ruby 1.8.5 (2006-08-25) [i486-linux]

Hi –

On Tue, 29 Jul 2008, andrey wrote:

irb(main):006:0> f.close
irb(main):010:0> f.sysread(10)
=> " off\norder"
irb(main):011:0> f.pos
=> 5

Bug?
% ruby1.8 --version
ruby 1.8.5 (2006-08-25) [i486-linux]

It works OK in 1.8.6:

irb(main):001:0> f = File.new("/etc/hosts")
=> #<File:/etc/hosts>
irb(main):002:0> f.sysread(5)
=> "##\n# "
irb(main):003:0> f.pos
=> 5
irb(main):004:0> f.sysread(10)
=> “Host Datab”
irb(main):005:0> f.pos
=> 15

I don’t think 1.8.5 is supported any more, so it might be good to
update your installation if possible.

David

On Mon, Jul 28, 2008 at 8:38 PM, David A. Black [email protected]
wrote:

irb(main):004:0> f.gets
irb(main):008:0> f.sysread(5)
ruby 1.8.5 (2006-08-25) [i486-linux]

It works OK in 1.8.6:

[…]

I don’t think 1.8.5 is supported any more, so it might be good to
update your installation if possible.

David

It works for me with 1.8.5 too:

irb(main):007:0> f = File.new(“/tmp/jhjh”)
=> #<File:/tmp/jhjh>
irb(main):008:0> f.sysread(5)
=> “multi”
irb(main):009:0> f.pos
=> 5
irb(main):010:0> f.sysread(10)
=> " off\norder"
irb(main):011:0> f.pos
=> 15

$ ruby -v
ruby 1.8.5 (2006-08-25) [powerpc-darwin8.8.0]

I have built this “ruby” myself from source (but note that it is on
Mac OS X, not Linux).

/Johan H.

Same here…on ruby 1.8.7 (2008-06-20 patchlevel 22) [i686-linux]

Regards, John.

irb(main):001:0> f = File.new("/etc/hosts")
=> #<File:/etc/hosts>
irb(main):002:0> f.sysread(5)
=> “#\n# /”
irb(main):003:0> f.pos
=> 5
irb(main):004:0> f.sysread(10)
=> “etc/hosts:”
irb(main):005:0> f.pos
=> 5
irb(main):006:0>

From: John Slobbe [mailto:[email protected]]

Same here…on ruby 1.8.7 (2008-06-20 patchlevel 22) [i686-linux]

irb(main):001:0> f = File.new(“/etc/hosts”)

=> #<File:/etc/hosts>

irb(main):002:0> f.sysread(5)

=> “#\n# /”

irb(main):003:0> f.pos

=> 5

irb(main):004:0> f.sysread(10)

=> “etc/hosts:”

irb(main):005:0> f.pos

=> 5

i seem to remember (don’t know where/when) that you must not mix low
level calls like #sysread w highlevel calls like #pos, use #read with
#pos, or use #sysread w #sysseek

but i guess we need a confirmation fr the core dev to verify that. Nobu
perhaps?

eg,

irb(main):016:0> File.open “/etc/hosts” do |f|
irb(main):017:1* f.sysread 2
irb(main):018:1> p f.sysseek(0,IO::SEEK_CUR)
irb(main):019:1> f.sysread 10
irb(main):020:1> p f.sysseek(0,IO::SEEK_CUR)
irb(main):021:1> end
2
12
=> nil

irb(main):022:0> RUBY_VERSION
=> “1.8.7”

hth.
kind regards -botp

Hi,

At Thu, 31 Jul 2008 10:31:24 +0900,
Peña, Botp [email protected] wrote in [ruby-talk:309630]:

i seem to remember (don’t know where/when) that you must not
mix low level calls like #sysread w highlevel calls like
#pos, use #read with #pos, or use #sysread w #sysseek

but i guess we need a confirmation fr the core dev to verify
that. Nobu perhaps?

You’re correct, it depends on underlying libc, since 1.8 uses
stdio. 1.9 has its own buffering mechanism and doesn’t have
that issue.