mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/socket/extconf.rb: check struct sockcred.
* ext/socket/ancdata.c (anc_inspect_socket_creds): new function to show SCM_CREDS on NetBSD. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
732b695163
commit
e960cf417a
4 changed files with 68 additions and 4 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
Sun Feb 8 20:30:29 2009 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* 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@ruby-lang.org>
|
Sun Feb 8 19:05:24 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* include/ruby/backward/rubysig.h: extern "C" was missing.
|
* include/ruby/backward/rubysig.h: extern "C" was missing.
|
||||||
|
|
|
@ -393,6 +393,41 @@ anc_inspect_passcred_credentials(int level, int type, VALUE data, VALUE ret)
|
||||||
}
|
}
|
||||||
#endif
|
#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 */
|
#if defined(IPPROTO_IP) && defined(IP_RECVDSTADDR) /* 4.4BSD */
|
||||||
static int
|
static int
|
||||||
anc_inspect_ip_recvdstaddr(int level, int type, VALUE data, VALUE ret)
|
anc_inspect_ip_recvdstaddr(int level, int type, VALUE data, VALUE ret)
|
||||||
|
@ -516,6 +551,9 @@ ancillary_inspect(VALUE self)
|
||||||
# endif
|
# endif
|
||||||
# if defined(SCM_CREDENTIALS) /* GNU/Linux */
|
# if defined(SCM_CREDENTIALS) /* GNU/Linux */
|
||||||
case SCM_CREDENTIALS: if (anc_inspect_passcred_credentials(level, type, data, ret) == -1) goto dump; break;
|
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
|
# endif
|
||||||
default: goto dump;
|
default: goto dump;
|
||||||
}
|
}
|
||||||
|
|
|
@ -308,6 +308,8 @@ have_type("struct in6_pktinfo", headers) {|src|
|
||||||
"#else\n" << "#error\n" << ">>>>>> no in6_pktinfo <<<<<<\n" << "#endif\n"
|
"#else\n" << "#error\n" << ">>>>>> no in6_pktinfo <<<<<<\n" << "#endif\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
have_type("struct sockcred", headers)
|
||||||
|
|
||||||
$distcleanfiles << "constants.h" << "constdefs.*"
|
$distcleanfiles << "constants.h" << "constdefs.*"
|
||||||
|
|
||||||
if have_func(test_func)
|
if have_func(test_func)
|
||||||
|
|
|
@ -306,11 +306,28 @@ class TestUNIXSocket < Test::Unit::TestCase
|
||||||
s.setsockopt(:SOCKET, :PASSCRED, 1)
|
s.setsockopt(:SOCKET, :PASSCRED, 1)
|
||||||
c.print "a"
|
c.print "a"
|
||||||
msg, cliend_ai, rflags, cred = s.recvmsg
|
msg, cliend_ai, rflags, cred = s.recvmsg
|
||||||
p cred
|
|
||||||
assert_equal("a", msg)
|
assert_equal("a", msg)
|
||||||
assert_match(/pid=#{$$} /, cred.inspect)
|
assert_match(/ pid=#{$$} /, cred.inspect)
|
||||||
assert_match(/uid=#{Process.uid} /, cred.inspect)
|
assert_match(/ uid=#{Process.uid} /, cred.inspect)
|
||||||
assert_match(/gid=#{Process.gid}>/, 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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue