diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-02-08 15:37:55 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-02-08 15:37:55 +0000 |
commit | 9e457481438cf8b4dbe033b6fbd5ea612c4529c1 (patch) | |
tree | 4d300dde5220bac968cac17be6ccbd103e7b8edc /ext/socket/option.c | |
parent | ce6e0937346c4ecf93d7e4eff7b832c5e60edd12 (diff) |
* ext/socket/extconf.rb: check sys/param.h and sys/ucred.h.
* ext/socket/rubysocket.h: include sys/param.h and sys/ucred.h.
* ext/socket/option.c (inspect_local_peercred): new function to show
LOCAL_PEERCRED socket option on FreeBSD.
(sockopt_inspect): show as LOCAL_* socket option if AF_UNIX and level
is 0.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22137 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket/option.c')
-rw-r--r-- | ext/socket/option.c | 67 |
1 files changed, 56 insertions, 11 deletions
diff --git a/ext/socket/option.c b/ext/socket/option.c index c07779e796..c79c1f529f 100644 --- a/ext/socket/option.c +++ b/ext/socket/option.c @@ -256,6 +256,32 @@ inspect_peercred(int level, int optname, VALUE data, VALUE ret) } #endif +#if defined(LOCAL_PEERCRED) /* FreeBSD */ +static int +inspect_local_peercred(int level, int optname, VALUE data, VALUE ret) +{ + if (RSTRING_LEN(data) == sizeof(struct xucred)) { + struct xucred cred; + memcpy(&cred, RSTRING_PTR(data), sizeof(struct xucred)); + rb_str_catf(ret, " version=%u", cred.cr_version); + rb_str_catf(ret, " uid=%u", cred.cr_uid); + if (cred.cr_ngroups) { + int i; + char *sep = " groups="; + for (i = 0; i < cred.cr_ngroups; i++) { + rb_str_catf(ret, "%s%u", sep, cred.cr_groups[i]); + sep = ","; + } + } + rb_str_cat2(ret, " (xucred)"); + return 0; + } + else { + return -1; + } +} +#endif + static VALUE sockopt_inspect(VALUE self) { @@ -264,7 +290,7 @@ sockopt_inspect(VALUE self) int optname = NUM2INT(sockopt_optname(self)); VALUE data = sockopt_data(self); VALUE v, ret; - ID family_id, level_id; + ID family_id, level_id, optname_id; StringValue(data); @@ -276,17 +302,35 @@ sockopt_inspect(VALUE self) else rb_str_catf(ret, "family:%d", family); - level_id = intern_level(level); - if (level_id) - rb_str_catf(ret, " %s", rb_id2name(level_id)); - else - rb_str_catf(ret, " level:%d", level); + if (family == AF_UNIX && level == 0) { + rb_str_catf(ret, " level:%d", level); - v = optname_to_sym(level, optname); - if (SYMBOL_P(v)) - rb_str_catf(ret, " %s", rb_id2name(SYM2ID(v))); - else - rb_str_catf(ret, " optname:%d", optname); + optname_id = intern_local_optname(optname); + if (optname_id) + rb_str_catf(ret, " %s", rb_id2name(optname_id)); + else + rb_str_catf(ret, " optname:%d", optname); + } + else { + level_id = intern_level(level); + if (level_id) + rb_str_catf(ret, " %s", rb_id2name(level_id)); + else + rb_str_catf(ret, " level:%d", level); + + v = optname_to_sym(level, optname); + if (SYMBOL_P(v)) + rb_str_catf(ret, " %s", rb_id2name(SYM2ID(v))); + else + rb_str_catf(ret, " optname:%d", optname); + } + + if (family == AF_UNIX && level == 0) { + if (optname == LOCAL_PEERCRED) { + if (inspect_local_peercred(level, optname, data, ret) == -1) goto dump; + goto finish; + } + } switch (level) { # if defined(SOL_SOCKET) @@ -391,6 +435,7 @@ sockopt_inspect(VALUE self) rb_str_catf(ret, " %s", StringValueCStr(data)); } + finish: rb_str_cat2(ret, ">"); return ret; |