[前][次][番号順一覧][スレッド一覧]

ruby-changes:20018

From: nobu <ko1@a...>
Date: Mon, 13 Jun 2011 23:28:59 +0900 (JST)
Subject: [ruby-changes:20018] nobu:r32065 (trunk): * ext/io/console/console.c (console_dev): take care of no-ctty

nobu	2011-06-13 23:28:53 +0900 (Mon, 13 Jun 2011)

  New Revision: 32065

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32065

  Log:
    * ext/io/console/console.c (console_dev): take care of no-ctty
      case.

  Modified files:
    trunk/ChangeLog
    trunk/ext/io/console/console.c
    trunk/test/io/console/test_io_console.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32064)
+++ ChangeLog	(revision 32065)
@@ -1,3 +1,8 @@
+Mon Jun 13 23:28:50 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* ext/io/console/console.c (console_dev): take care of no-ctty
+	  case.
+
 Mon Jun 13 23:06:12 2011  KOSAKI Motohiro  <kosaki.motohiro@g...>
 
 	* thread_pthread.c: rewrite GVL completely.
Index: ext/io/console/console.c
===================================================================
--- ext/io/console/console.c	(revision 32064)
+++ ext/io/console/console.c	(revision 32065)
@@ -557,27 +557,36 @@
 	VALUE out;
 	rb_io_t *ofptr;
 #endif
+	int fd, mode;
 
-	args[1] = INT2FIX(O_RDWR);
 #ifdef CONSOLE_DEVICE_FOR_WRITING
-	args[0] = rb_str_new2(CONSOLE_DEVICE_FOR_WRITING);
+	fd = open(CONSOLE_DEVICE_FOR_WRITING, O_WRONLY);
+	if (fd < 0) return Qnil;
+	args[1] = INT2FIX(O_WRONLY);
+	args[0] = INT2NUM(fd);
 	out = rb_class_new_instance(2, args, klass);
 #endif
-	args[0] = rb_str_new2(CONSOLE_DEVICE_FOR_READING);
+	fd = open(CONSOLE_DEVICE_FOR_READING, O_RDWR);
+	if (fd < 0) {
+#ifdef CONSOLE_DEVICE_FOR_WRITING
+	    rb_io_close(out);
+#endif
+	    return Qnil;
+	}
+	args[1] = INT2FIX(O_RDWR);
+	args[0] = INT2NUM(fd);
 	con = rb_class_new_instance(2, args, klass);
+	GetOpenFile(con, fptr);
+	fptr->pathv = rb_obj_freeze(rb_str_new2(CONSOLE_DEVICE));
 #ifdef CONSOLE_DEVICE_FOR_WRITING
-	GetOpenFile(con, fptr);
 	GetOpenFile(out, ofptr);
 # ifdef HAVE_RB_IO_GET_WRITE_IO
-#   ifdef _WIN32
-	ofptr->pathv = fptr->pathv = rb_str_new2(CONSOLE_DEVICE);
-#   endif
+	ofptr->pathv = fptr->pathv;
 	fptr->tied_io_for_writing = out;
 # else
 	fptr->f2 = ofptr->f;
 	ofptr->f = 0;
 # endif
-	fptr->mode |= FMODE_WRITABLE;
 #endif
 	rb_const_set(klass, id_console, con);
     }
Index: test/io/console/test_io_console.rb
===================================================================
--- test/io/console/test_io_console.rb	(revision 32064)
+++ test/io/console/test_io_console.rb	(revision 32065)
@@ -160,3 +160,13 @@
     s.close if s
   end
 end if defined?(PTY) and defined?(IO::console)
+
+class TestIO_Console < Test::Unit::TestCase
+  require_relative '../../ruby/envutil'
+
+  def test_noctty
+    assert_in_out_err(["-rio/console"],
+                      "Process.daemon(true, true); p IO.console",
+                      ["nil"])
+  end
+end if defined?(Process.daemon) and defined?(IO::console)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]