summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-04 11:29:24 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-04 11:29:24 +0000
commitbe62297f9230c4cf8d73321c5c9e28037b35fc1d (patch)
tree8f8ef97f4db6938963daf0b6e4adffe957bb4af2
parentc06da4735da0e2285c1e3e52202b7090b3f43b1b (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--ChangeLog6
-rw-r--r--io.c4
-rw-r--r--test/ruby/test_io.rb31
3 files changed, 41 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 305a7a4bc9..dd5fb39be4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/io.c b/io.c
index 0087254291..4336eeda0e 100644
--- a/io.c
+++ b/io.c
@@ -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