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>
|
||||
|
||||
* 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
|
||||
|
||||
#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)
|
||||
|
@ -516,6 +551,9 @@ ancillary_inspect(VALUE self)
|
|||
# endif
|
||||
# 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;
|
||||
}
|
||||
|
|
|
@ -308,6 +308,8 @@ have_type("struct in6_pktinfo", headers) {|src|
|
|||
"#else\n" << "#error\n" << ">>>>>> no in6_pktinfo <<<<<<\n" << "#endif\n"
|
||||
}
|
||||
|
||||
have_type("struct sockcred", headers)
|
||||
|
||||
$distcleanfiles << "constants.h" << "constdefs.*"
|
||||
|
||||
if have_func(test_func)
|
||||
|
|
|
@ -306,11 +306,28 @@ class TestUNIXSocket < Test::Unit::TestCase
|
|||
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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue