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

ruby-changes:9256

From: akr <ko1@a...>
Date: Tue, 16 Dec 2008 19:49:30 +0900 (JST)
Subject: [ruby-changes:9256] Ruby:r20793 (trunk): * ext/pty/extconf.rb: check posix_openpt.

akr	2008-12-16 19:49:12 +0900 (Tue, 16 Dec 2008)

  New Revision: 20793

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

  Log:
    * ext/pty/extconf.rb: check posix_openpt.
    * ext/pty/pty.c (get_device_once): use posix_openpt if available.

  Modified files:
    trunk/ChangeLog
    trunk/ext/pty/extconf.rb
    trunk/ext/pty/pty.c
    trunk/test/test_pty.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 20792)
+++ ChangeLog	(revision 20793)
@@ -1,3 +1,9 @@
+Tue Dec 16 19:48:18 2008  Tanaka Akira  <akr@f...>
+
+	* ext/pty/extconf.rb: check posix_openpt.
+
+	* ext/pty/pty.c (get_device_once): use posix_openpt if available.
+
 Tue Dec 16 19:43:53 2008  Tanaka Akira  <akr@f...>
 
 	* re.c: use strlcpy for error messages.
Index: ext/pty/extconf.rb
===================================================================
--- ext/pty/extconf.rb	(revision 20792)
+++ ext/pty/extconf.rb	(revision 20793)
@@ -6,7 +6,8 @@
   have_header("libutil.h")
   have_header("pty.h")
   have_library("util", "openpty")
-  if have_func("openpty") or
+  if have_func("posix_openpt") or
+      have_func("openpty") or
       have_func("_getpty") or
       have_func("ptsname") or
       have_func("ioctl")
Index: ext/pty/pty.c
===================================================================
--- ext/pty/pty.c	(revision 20792)
+++ ext/pty/pty.c	(revision 20793)
@@ -2,6 +2,7 @@
 #ifdef RUBY_EXTCONF_H
 #include RUBY_EXTCONF_H
 #endif
+#include	<stdlib.h>
 #include	<stdio.h>
 #include	<sys/types.h>
 #include	<sys/stat.h>
@@ -272,7 +273,44 @@
 static int
 get_device_once(int *master, int *slave, char SlaveName[DEVICELEN], int fail)
 {
-#if defined HAVE_OPENPTY
+#if defined(HAVE_POSIX_OPENPT)
+    int masterfd,slavefd;
+    char *slavedevice;
+    struct sigaction dfl, old;
+
+    dfl.sa_handler = SIG_DFL;
+    dfl.sa_flags = 0;
+    sigemptyset(&dfl.sa_mask);
+
+    if((masterfd = posix_openpt(O_RDWR|O_NOCTTY)) != -1) {
+	sigaction(SIGCHLD, &dfl, &old);
+	if(grantpt(masterfd) != -1) {
+	    sigaction(SIGCHLD, &old, NULL);
+	    if(unlockpt(masterfd) != -1) {
+		if((slavedevice = ptsname(masterfd)) != NULL) {
+		    if((slavefd = open(slavedevice, O_RDWR|O_NOCTTY, 0)) != -1) {
+#if defined I_PUSH && !defined linux
+			if(ioctl(slavefd, I_PUSH, "ptem") != -1) {
+			    if(ioctl(slavefd, I_PUSH, "ldterm") != -1) {
+				ioctl(slavefd, I_PUSH, "ttcompat");
+#endif
+				*master = masterfd;
+				*slave = slavefd;
+				strlcpy(SlaveName, slavedevice, DEVICELEN);
+				return 0;
+#if defined I_PUSH && !defined linux
+			    }
+			}
+#endif
+		    }
+		}
+	    }
+	}
+	close(masterfd);
+    }
+    if (!fail) rb_raise(rb_eRuntimeError, "can't get Master/Slave device");
+    return -1;
+#elif defined HAVE_OPENPTY
 /*
  * Use openpty(3) of 4.3BSD Reno and later,
  * or the same interface function.
@@ -296,10 +334,8 @@
     strlcpy(SlaveName, name, DEVICELEN);
 
     return 0;
-#else /* HAVE__GETPTY */
+#elif defined(HAVE_PTSNAME)
     int	 i,j;
-
-#ifdef HAVE_PTSNAME
     char *pn;
     void (*s)();
 
@@ -336,6 +372,7 @@
     if (!fail) rb_raise(rb_eRuntimeError, "can't get Master/Slave device");
     return -1;
 #else
+    int	 i,j;
     const char *const *p;
     char MasterName[DEVICELEN];
 
@@ -356,7 +393,6 @@
     if (fail) rb_raise(rb_eRuntimeError, "can't get %s", SlaveName);
     return -1;
 #endif
-#endif
 }
 
 static void
Index: test/test_pty.rb
===================================================================
--- test/test_pty.rb	(revision 20792)
+++ test/test_pty.rb	(revision 20793)
@@ -98,5 +98,24 @@
     }
   end
 
+  def test_stat_slave
+    # If grantpt is used, the slave device is changed as follows.
+    #   owner: real UID
+    #   group: an unspecified value (e.g. tty)
+    #   mode: 0620 (rw--w----)
+    #
+    # The group is not testable because unspecified.
+    #
+    # The mode is testable but the condition is relaxed because other
+    # pty functions (openpty, _getpty, etc.) may not use 0620.
+    # But no one can read from the tty, I hope (for security reason).
+    #
+    PTY.open {|master, slave|
+      s =  File.stat(slave.path)
+      assert_equal(Process.uid, s.uid)
+      assert_equal(0600, s.mode & 0755)
+    }
+  end
+
 end if defined? PTY
 

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

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