diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-05-04 11:29:24 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-05-04 11:29:24 +0000 |
commit | be62297f9230c4cf8d73321c5c9e28037b35fc1d (patch) | |
tree | 8f8ef97f4db6938963daf0b6e4adffe957bb4af2 | |
parent | c06da4735da0e2285c1e3e52202b7090b3f43b1b (diff) |
* io.c (Init_IO): Added File::CLOEXEC constant. [ruby-core:22893] [Feature #1291]
* test/ruby/test_io.rb (TestIO#test_o_cloexec): test for File::CLOEXEC.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31430 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | io.c | 4 | ||||
-rw-r--r-- | test/ruby/test_io.rb | 31 |
3 files changed, 41 insertions, 0 deletions
@@ -1,3 +1,9 @@ +Wed May 4 20:22:12 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com> + + * io.c (Init_IO): Added File::CLOEXEC constant. + [ruby-core:22893] [Feature #1291] + * test/ruby/test_io.rb (TestIO#test_o_cloexec): test for File::CLOEXEC. + Wed May 4 19:00:59 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com> * thread.c (rb_wait_for_single_fd): Fix wrong return value. @@ -10576,6 +10576,10 @@ Init_IO(void) /* Try to minimize cache effects of the I/O to and from this file. */ rb_file_const("DIRECT", INT2FIX(O_DIRECT)); #endif +#ifdef O_CLOEXEC + /* enable close-on-exec flag */ + rb_file_const("CLOEXEC", INT2FIX(O_CLOEXEC)); /* Linux, POSIX-2008. */ +#endif sym_mode = ID2SYM(rb_intern("mode")); sym_perm = ID2SYM(rb_intern("perm")); diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index 25e6ddbe7f..5a55722115 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -1238,6 +1238,37 @@ class TestIO < Test::Unit::TestCase end end + def test_O_CLOEXEC + if !defined? File::CLOEXEC + return + end + + mkcdtmpdir do + normal_file = Tempfile.new("normal_file"); + assert_equal(false, normal_file.close_on_exec?) + + cloexec_file = Tempfile.new("cloexec_file", :mode => File::CLOEXEC); + assert_equal(true, cloexec_file.close_on_exec?) + + argfile = Tempfile.new("argfile"); + + argfile.puts normal_file.fileno + argfile.puts cloexec_file.fileno + argfile.flush + + ruby('-e', <<-'End', argfile.path) { |f| + begin + puts IO.for_fd(ARGF.gets.to_i).fileno + puts IO.for_fd(ARGF.gets.to_i).fileno + rescue + puts "nofile" + end + End + assert_equal("#{normal_file.fileno}\nnofile\n", f.read) + } + end + end + def test_close_security_error with_pipe do |r, w| assert_raise(SecurityError) do |