[#32185] Date#+に大きな数字を与えるとおかしな日付に — "madoka yamamoto" <yamamotomadoka@...>

こんにちは、山本と申します。

26 messages 2007/11/08
[#32186] Re: Date#+に大きな数字を与えるとおかしな日付に — Tadayoshi Funaba <tadf@...> 2007/11/08

> Dateオブジェクトに+で大きな数字を与えるとおかしくなるようです。

[#32188] Re: Date#+に大きな数字を与えるとおかしな日付に — "madoka yamamoto" <yamamotomadoka@...> 2007/11/09

山本です。

[#32191] Re: Date#+に大きな数字を与えるとおかしな日付に — tadf@... 2007/11/09

> アルゴリズムの意味がわからないで書いた、表層的なパッチなので

[#32194] Re: Date#+に大きな数字を与えるとおかしな日付に — Yukihiro Matsumoto <matz@...> 2007/11/09

Hi,

[#32200] Re: rational (Re: Date#+に大きな数字を与えるとおかしな日付に) — Tadayoshi Funaba <tadf@...> 2007/11/10

> 1.9ではRationalとComplexを組み込みに、という話はありましたが、

[#32225] Re: rational (Re: Date#+に大きな数字を与えるとおかしな日付に) — Shin-ichiro HARA <sinara@...> 2007/11/12

原です。

[#32198] [提案] Array#tail — "Yusuke ENDOH" <mame@...>

遠藤と申します。

21 messages 2007/11/09
[#32199] Re: [提案] Array#tail — Yukihiro Matsumoto <matz@...> 2007/11/10

まつもと ゆきひろです

[#32352] 1.9.1のリリース時期について — KIMURA Koichi <hogemuta@...>

木村です。

16 messages 2007/11/24
[#32353] Re: 1.9.1のリリース時期について — Yukihiro Matsumoto <matz@...> 2007/11/24

まつもと ゆきひろです

[#32403] Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Takahiro Kambe <taca@...>

こんばんは。

32 messages 2007/11/29
[#32414] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Urabe Shyouhei <shyouhei@...> 2007/11/30

卜部です。

[#32444] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Yukihiro Matsumoto <matz@...> 2007/12/03

まつもと ゆきひろです

[#32488] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Urabe Shyouhei <shyouhei@...> 2007/12/08

卜部です。

[#32525] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — "Yusuke ENDOH" <mame@...> 2007/12/10

遠藤と申します。

[#32643] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — "Yusuke ENDOH" <mame@...> 2007/12/19

遠藤です。

[#32409] Re: [ruby-cvs:21293] Ruby:r14056 (trunk): * signal.c (trap_signm): SIGVTALRM no longer used for green — SASADA Koichi <ko1@...>

 ささだです.

10 messages 2007/11/30

[ruby-dev:32323] IO#close_on_exec? and IO#close_on_exec=

From: Tanaka Akira <akr@...>
Date: 2007-11-20 05:03:33 UTC
List: ruby-dev #32323
IO#close_on_exec? と IO#close_on_exec= を導入して、これらで
は 2つの fd を扱うのはどうでしょうか。

fd が 2つあると、単純な fcntl では両方を close on exec にで
きなくて困る、ということを昔 [ruby-list:26156] で報告して、
その結果としてfcntl は両方の fd に実行されるということになり
ましたが、これはなんとも乱暴です。たとえば、
[ruby-list:26208] で F_DUPFD はまずいと書きましたが、F_DUPFD
を 2回実行してひとつの結果を無視するというのはなんとも奇妙な
挙動です。

というわけで、close on exec に特化してメソッドを用意するのが
いいと思います。他の fcntl については、もし必要になったら非
常用のインスタンス変数でどうにかして、充分に用法が把握できた
らメソッドにすることを考えるということで。

Index: io.c
===================================================================
--- io.c	(revision 13977)
+++ io.c	(working copy)
@@ -2295,6 +2295,99 @@ rb_io_isatty(VALUE io)
     return Qtrue;
 }
 
+/*
+ *  call-seq:
+ *     ios.close_on_exec?   => true or false
+ *
+ *  Returns <code>true</code> if <em>ios</em> will be closed on exec.
+ *
+ *     f = open("/dev/null")
+ *     f.close_on_exec?                 #=> false
+ *     f.close_on_exec = true
+ *     f.close_on_exec?                 #=> true
+ *     f.close_on_exec = false
+ *     f.close_on_exec?                 #=> false
+ */
+
+static VALUE
+rb_io_close_on_exec_p(VALUE io)
+{
+#if defined(HAVE_FCNTL) && defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
+    rb_io_t *fptr;
+    VALUE write_io;
+    int fd, ret;
+
+    write_io = GetWriteIO(io);
+    if (io != write_io) {
+        GetOpenFile(write_io, fptr);
+        if (fptr && 0 <= (fd = fptr->fd)) {
+            if ((ret = fcntl(fd, F_GETFD)) == -1) rb_sys_fail(fptr->path);
+            if (!(ret & FD_CLOEXEC)) return Qfalse;
+        }
+    }
+
+    GetOpenFile(io, fptr);
+    if (fptr && 0 <= (fd = fptr->fd)) {
+        if ((ret = fcntl(fd, F_GETFD)) == -1) rb_sys_fail(fptr->path);
+        if (!(ret & FD_CLOEXEC)) return Qfalse;
+    }
+    return Qtrue;
+#else
+    rb_notimplement();
+    return Qnil;		/* not reached */
+#endif
+}
+
+/*
+ *  call-seq:
+ *     ios.close_on_exec = bool    => true or false
+ *
+ *  Sets a close-on-exec flag.
+ *
+ *     f = open("/dev/null")
+ *     f.close_on_exec = true
+ *     system("cat", "/proc/self/fd/#{f.fileno}")
+ *     #=> cat: /proc/self/fd/3: No such file or directory
+ */
+
+static VALUE
+rb_io_set_close_on_exec(VALUE io, VALUE arg)
+{
+#if defined(HAVE_FCNTL) && defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
+    int flag = RTEST(arg) ? FD_CLOEXEC : 0;
+    rb_io_t *fptr;
+    VALUE write_io;
+    int fd, ret;
+
+    write_io = GetWriteIO(io);
+    if (io != write_io) {
+        GetOpenFile(write_io, fptr);
+        if (fptr && 0 <= (fd = fptr->fd)) {
+            if ((ret = fcntl(fptr->fd, F_GETFD)) == -1) rb_sys_fail(fptr->path);
+            if ((ret & FD_CLOEXEC) != flag) {
+                ret = (ret & ~FD_CLOEXEC) | flag;
+                ret = fcntl(fd, F_SETFD, ret);
+                if (ret == -1) rb_sys_fail(fptr->path);
+            }
+        }
+
+    }
+
+    GetOpenFile(io, fptr);
+    if (fptr && 0 <= (fd = fptr->fd)) {
+        if ((ret = fcntl(fd, F_GETFD)) == -1) rb_sys_fail(fptr->path);
+        if ((ret & FD_CLOEXEC) != flag) {
+            ret = (ret & ~FD_CLOEXEC) | flag;
+            ret = fcntl(fd, F_SETFD, ret);
+            if (ret == -1) rb_sys_fail(fptr->path);
+        }
+    }
+#else
+    rb_notimplement();
+#endif
+    return Qnil;
+}
+
 #define FMODE_PREP (1<<16)
 #define IS_PREP_STDIO(f) ((f)->mode & FMODE_PREP)
 #define PREP_STDIO_NAME(f) ((f)->path)
@@ -6021,6 +6114,9 @@ Init_IO(void)
     rb_define_method(rb_cIO, "eof", rb_io_eof, 0);
     rb_define_method(rb_cIO, "eof?", rb_io_eof, 0);
 
+    rb_define_method(rb_cIO, "close_on_exec?", rb_io_close_on_exec_p, 0);
+    rb_define_method(rb_cIO, "close_on_exec=", rb_io_set_close_on_exec, 1);
+
     rb_define_method(rb_cIO, "close", rb_io_close_m, 0);
     rb_define_method(rb_cIO, "closed?", rb_io_closed, 0);
     rb_define_method(rb_cIO, "close_read", rb_io_close_read, 0);
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread

Prev Next