Bug #1807

r+ オープンしたファイルが MinGW の拡張ライブラリで扱えない

Added by ykc@venus.dti.ne.jp (Kimura Yoshihiro) almost 3 years ago. Updated about 1 year ago.

Status:Closed Start date:07/23/2009
Priority:Normal Due date:
Assignee:usa (Usaku NAKAMURA) % Done:

100%

Category:-
Target version:2.0.0
ruby -v:ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]

Description

手元に FILE* を扱う拡張ライブラリがあり、1.9 へ移植しているのですが、
Windows (MinGW) でうまくいかない処理があります。

処理としては、以下のように GetOpenFile -> rb_io_stdio_file で
取り出した FILE* から何かを読む、というだけの処理なのですが、
r+ でオープンすると何も読むことができません。

  /* 拡張ライブラリサンプル */
  #include <stdio.h>
  #include <ruby.h>
  #include <ruby/io.h>  /* 1.8 では <rubyio.h> */

  static VALUE fget(VALUE self, VALUE arg) {
    rb_io_t* fptr;
    FILE* f;
    int i;

    GetOpenFile(arg, fptr);
    rb_io_check_readable(fptr);
    f = rb_io_stdio_file(fptr);  /* 1.8 では GetReadFile */

    if ((i = fgetc(f)) != EOF) {
      char c = i;
      return rb_str_new(&c, 1);
    }
    return Qnil;
  }

  void Init_fget() {
    rb_define_singleton_method(
      rb_define_module("F"),
      "get", RUBY_METHOD_FUNC(fget), 1
    );
  }

  # Ruby側サンプル
  require './fget.so'

  File.open('test.dat', 'w') {|f| f.write "123" }

  File.open('test.dat', 'r+') {|f|  # 読めない(rb+も同様)
    p F.get(f)  # => nil
    p F.get(f)  # => nil
    p F.get(f)  # => nil
  }

  File.open('test.dat', 'r') {|f|  # 読める(rbも同様)
    p F.get(f)  # => "1"
    p F.get(f)  # => "2"
    p F.get(f)  # => "3"
  }

Linux の Ruby 1.9.1 では問題ありません。

1.9 の IO 周りはかなり変わったようなので、もしおかしなことを
しているようならご指摘下さい。

Associated revisions

Revision 27449
Added by usa (Usaku NAKAMURA) about 2 years ago

* win32/win32.c (rb_w32_wopen): shouldn't use FILE_FLAG_OVERLAPPED with normal file. #1807, #2510, #2549

Revision 27449
Added by usa (Usaku NAKAMURA) about 2 years ago

* win32/win32.c (rb_w32_wopen): shouldn't use FILE_FLAG_OVERLAPPED with normal file. #1807, #2510, #2549

History

Updated by usa (Usaku NAKAMURA) almost 3 years ago

  • Assignee set to usa (Usaku NAKAMURA)
  • Target version set to 2.0.0

Updated by usa (Usaku NAKAMURA) almost 3 years ago

こんにちは、なかむら(う)です。

In message "[ruby-dev:38882] [Bug #1807] r+  オープンしたファイルが MinGW  の拡張ライブラリで扱えない"
    on Jul.23,2009 12:00:22, <redmine@ruby-lang.org> wrote:
> 処理としては、以下のように GetOpenFile -> rb_io_stdio_file で
> 取り出した FILE* から何かを読む、というだけの処理なのですが、
> r+ でオープンすると何も読むことができません。

調査の過程で微妙なバグを発見しました。
修正の結果、trunkでは "r+" のみならず "r" の場合も、fget()で
-1が返るようになりました。


って、全然元の問題は解決しないで悪化してるわけですが(すみませ
ん)、原因の方は判明しました。
ruby内部ではファイルをFILE_FLAG_OVERLAPPED付きでオープンして
いるため、Cランタイムでファイルを読み書きしようとしてしまうと
必ずEINVALになるようになってしまっています。
どうやったら問題を回避できるかは現在研究中です。


それでは。
-- 
U.Nakamura <usa@garbagecollect.jp>

Updated by usa (Usaku NAKAMURA) almost 3 years ago

  • Status changed from Open to Assigned

Updated by usa (Usaku NAKAMURA) about 2 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100
This issue was solved with changeset r27449.
Kimura, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

Also available in: Atom PDF