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

ruby-changes:10570

From: akr <ko1@a...>
Date: Sun, 8 Feb 2009 20:36:29 +0900 (JST)
Subject: [ruby-changes:10570] Ruby:r22126 (trunk): * ext/socket/extconf.rb: check struct sockcred.

akr	2009-02-08 20:36:18 +0900 (Sun, 08 Feb 2009)

  New Revision: 22126

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

  Log:
    * ext/socket/extconf.rb: check struct sockcred.
    * ext/socket/ancdata.c (anc_inspect_socket_creds): new function to
      show SCM_CREDS on NetBSD.

  Modified files:
    trunk/ChangeLog
    trunk/ext/socket/ancdata.c
    trunk/ext/socket/extconf.rb
    trunk/test/socket/test_unix.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 22125)
+++ ChangeLog	(revision 22126)
@@ -1,3 +1,10 @@
+Sun Feb  8 20:30:29 2009  Tanaka Akira  <akr@f...>
+
+	* ext/socket/extconf.rb: check struct sockcred.
+
+	* ext/socket/ancdata.c (anc_inspect_socket_creds): new function to
+	  show SCM_CREDS on NetBSD.
+
 Sun Feb  8 19:05:24 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* include/ruby/backward/rubysig.h: extern "C" was missing.
Index: ext/socket/extconf.rb
===================================================================
--- ext/socket/extconf.rb	(revision 22125)
+++ ext/socket/extconf.rb	(revision 22126)
@@ -308,6 +308,8 @@
   "#else\n" << "#error\n" << ">>>>>> no in6_pktinfo <<<<<<\n" << "#endif\n"
 }
 
+have_type("struct sockcred", headers)
+
 $distcleanfiles << "constants.h" << "constdefs.*"
 
 if have_func(test_func)
Index: ext/socket/ancdata.c
===================================================================
--- ext/socket/ancdata.c	(revision 22125)
+++ ext/socket/ancdata.c	(revision 22126)
@@ -393,6 +393,41 @@
 }
 #endif
 
+#if defined(SCM_CREDS) && defined(HAVE_TYPE_STRUCT_SOCKCRED) /* NetBSD */
+#define INSPECT_SCM_CREDS
+static int
+anc_inspect_socket_creds(int level, int type, VALUE data, VALUE ret)
+{
+    int i;
+    if (level == SOL_SOCKET && type == SCM_CREDS &&
+        RSTRING_LEN(data) >= SOCKCREDSIZE(0)) {
+	struct sockcred cred0, *cred;
+        memcpy(&cred0, RSTRING_PTR(data), SOCKCREDSIZE(0));
+	if (RSTRING_LEN(data) != SOCKCREDSIZE(cred0.sc_ngroups)) {
+	    return -1;
+	}
+	cred = (struct sockcred *)ALLOCA_N(char, SOCKCREDSIZE(cred0.sc_ngroups));
+        memcpy(cred, RSTRING_PTR(data), SOCKCREDSIZE(cred0.sc_ngroups));
+        rb_str_catf(ret, " uid=%u", cred->sc_uid);
+        rb_str_catf(ret, " euid=%u", cred->sc_euid);
+        rb_str_catf(ret, " gid=%u", cred->sc_gid);
+        rb_str_catf(ret, " egid=%u", cred->sc_egid);
+	if (cred0.sc_ngroups) {
+	    char *sep = "=";
+            rb_str_cat2(ret, " groups");
+	    for (i = 0; i < cred0.sc_ngroups; i++) {
+		rb_str_catf(ret, "%s%u", sep, cred->sc_groups[i]);
+		sep = ",";
+	    }
+	}
+        return 0;
+    }
+    else {
+        return -1;
+    }
+}
+#endif
+
 #if defined(IPPROTO_IP) && defined(IP_RECVDSTADDR) /* 4.4BSD */
 static int
 anc_inspect_ip_recvdstaddr(int level, int type, VALUE data, VALUE ret)
@@ -517,6 +552,9 @@
 #        if defined(SCM_CREDENTIALS) /* GNU/Linux */
           case SCM_CREDENTIALS: if (anc_inspect_passcred_credentials(level, type, data, ret) == -1) goto dump; break;
 #        endif
+#        if defined(INSPECT_SCM_CREDS) /* NetBSD */
+          case SCM_CREDS: if (anc_inspect_socket_creds(level, type, data, ret) == -1) goto dump; break;
+#        endif
           default: goto dump;
         }
         break;
Index: test/socket/test_unix.rb
===================================================================
--- test/socket/test_unix.rb	(revision 22125)
+++ test/socket/test_unix.rb	(revision 22126)
@@ -306,12 +306,29 @@
       s.setsockopt(:SOCKET, :PASSCRED, 1)
       c.print "a"
       msg, cliend_ai, rflags, cred = s.recvmsg
-      p cred
       assert_equal("a", msg)
-      assert_match(/pid=#{$$} /, cred.inspect)
-      assert_match(/uid=#{Process.uid} /, cred.inspect)
-      assert_match(/gid=#{Process.gid}>/, cred.inspect)
+      assert_match(/ pid=#{$$} /, cred.inspect)
+      assert_match(/ uid=#{Process.uid} /, cred.inspect)
+      assert_match(/ gid=#{Process.gid}>/, cred.inspect)
     }
   end
 
+  def test_netbsd_cred
+    return if /netbsd/ !~ RUBY_PLATFORM
+    Dir.mktmpdir {|d|
+      sockpath = "#{d}/sock"
+      serv = Socket.unix_server_socket(sockpath)
+      c = Socket.unix(sockpath)
+      s, = serv.accept
+      s.setsockopt(0, Socket::LOCAL_CREDS, 1)
+      c.print "a"
+      msg, cliend_ai, rflags, cred = s.recvmsg
+      assert_equal("a", msg)
+      assert_match(/ uid=#{Process.uid} /, cred.inspect)
+      assert_match(/ euid=#{Process.euid} /, cred.inspect)
+      assert_match(/ gid=#{Process.gid} /, cred.inspect)
+      assert_match(/ egid=#{Process.egid} /, cred.inspect)
+    }
+  end
+
 end if defined?(UNIXSocket) && /cygwin/ !~ RUBY_PLATFORM

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

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