8 ID name = intern_const(constant);
209 int i =
RTEST(vbool) ? 1 : 0;
254 memset(&l, 0,
sizeof(l));
258 l.l_onoff =
RTEST(vonoff) ? 1 : 0;
281 if (
level != SOL_SOCKET || optname != SO_LINGER)
285 (
int)
sizeof(
struct linger), (
long)
RSTRING_LEN(data));
286 memcpy((
char*)&l,
RSTRING_PTR(data),
sizeof(
struct linger));
288 case 0: vonoff =
Qfalse;
break;
289 case 1: vonoff =
Qtrue;
break;
290 default: vonoff =
INT2NUM(l.l_onoff);
break;
326 #if defined(IPV6_MULTICAST_LOOP) 332 memcpy((
char*)&
i,
RSTRING_PTR(data),
sizeof(
unsigned int));
342 #if defined(SOL_SOCKET) && defined(SO_LINGER) 352 default:
rb_str_catf(ret,
" on(%d)", s.l_onoff);
break;
363 #if defined(SOL_SOCKET) && defined(SO_TYPE) 371 id = rsock_intern_socktype(
i);
390 rb_str_catf(ret,
" %ld.%06ldsec", (
long)s.tv_sec, (
long)s.tv_usec);
438 #ifndef HAVE_INET_NTOP 440 inet_ntop(
int af,
const void *addr,
char *numaddr,
size_t numaddr_len)
442 #ifdef HAVE_INET_NTOA 444 memcpy(&in.s_addr, addr,
sizeof(in.s_addr));
445 snprintf(numaddr, numaddr_len,
"%s", inet_ntoa(in));
447 unsigned long x = ntohl(*(
unsigned long*)addr);
448 snprintf(numaddr, numaddr_len,
"%d.%d.%d.%d",
449 (
int) (x>>24) & 0xff, (
int) (x>>16) & 0xff,
450 (
int) (x>> 8) & 0xff, (
int) (x>> 0) & 0xff);
454 #elif defined __MINGW64__ 455 # define inet_ntop(f,a,n,l) rb_w32_inet_ntop(f,a,n,l) 460 rb_if_indextoname(
const char *succ_prefix,
const char *fail_prefix,
unsigned int ifindex,
char *
buf,
size_t len)
462 #if defined(HAVE_IF_INDEXTONAME) 464 if (if_indextoname(ifindex, ifbuf) ==
NULL)
465 return snprintf(
buf, len,
"%s%u", fail_prefix, ifindex);
467 return snprintf(
buf, len,
"%s%s", succ_prefix, ifbuf);
470 # define IFNAMSIZ (sizeof(unsigned int)*3+1) 472 return snprintf(
buf, len,
"%s%u", fail_prefix, ifindex);
476 #if defined(IPPROTO_IP) && defined(HAVE_TYPE_STRUCT_IP_MREQ) 482 char addrbuf[INET_ADDRSTRLEN];
484 if (
inet_ntop(AF_INET, &s.imr_multiaddr, addrbuf, (socklen_t)
sizeof(addrbuf)) ==
NULL)
488 if (
inet_ntop(AF_INET, &s.imr_interface, addrbuf, (socklen_t)
sizeof(addrbuf)) ==
NULL)
500 #if defined(IPPROTO_IP) && defined(HAVE_TYPE_STRUCT_IP_MREQN) 504 if (
RSTRING_LEN(data) ==
sizeof(
struct ip_mreqn)) {
506 char addrbuf[INET_ADDRSTRLEN], ifbuf[32+
IFNAMSIZ];
508 if (
inet_ntop(AF_INET, &s.imr_multiaddr, addrbuf, (socklen_t)
sizeof(addrbuf)) ==
NULL)
512 if (
inet_ntop(AF_INET, &s.imr_address, addrbuf, (socklen_t)
sizeof(addrbuf)) ==
NULL)
526 #if defined(IPPROTO_IP) && defined(HAVE_TYPE_STRUCT_IP_MREQ) 528 inspect_ipv4_add_drop_membership(
int level,
int optname,
VALUE data,
VALUE ret)
531 return inspect_ipv4_mreq(
level, optname, data, ret);
532 # if defined(HAVE_TYPE_STRUCT_IP_MREQN) 533 else if (
RSTRING_LEN(data) ==
sizeof(
struct ip_mreqn))
534 return inspect_ipv4_mreqn(
level, optname, data, ret);
541 #if defined(IPPROTO_IP) && defined(IP_MULTICAST_IF) && defined(HAVE_TYPE_STRUCT_IP_MREQN) 543 inspect_ipv4_multicast_if(
int level,
int optname,
VALUE data,
VALUE ret)
547 char addrbuf[INET_ADDRSTRLEN];
549 if (
inet_ntop(AF_INET, &s, addrbuf, (socklen_t)
sizeof(addrbuf)) ==
NULL)
555 else if (
RSTRING_LEN(data) ==
sizeof(
struct ip_mreqn)) {
556 return inspect_ipv4_mreqn(
level, optname, data, ret);
564 #if defined(IPV6_MULTICAST_IF) 566 inspect_ipv6_multicast_if(
int level,
int optname,
VALUE data,
VALUE ret)
570 unsigned int ifindex;
571 memcpy((
char*)&ifindex,
RSTRING_PTR(data),
sizeof(
unsigned int));
582 #if defined(IPPROTO_IPV6) && defined(HAVE_TYPE_STRUCT_IPV6_MREQ) 586 if (
RSTRING_LEN(data) ==
sizeof(
struct ipv6_mreq)) {
588 char addrbuf[INET6_ADDRSTRLEN], ifbuf[32+
IFNAMSIZ];
590 if (
inet_ntop(AF_INET6, &s.ipv6mr_multiaddr, addrbuf, (socklen_t)
sizeof(addrbuf)) ==
NULL)
604 #if defined(SOL_SOCKET) && defined(SO_PEERCRED) 605 #if defined(__OpenBSD__) 606 #define RUBY_SOCK_PEERCRED struct sockpeercred 608 #define RUBY_SOCK_PEERCRED struct ucred 613 if (
RSTRING_LEN(data) ==
sizeof(RUBY_SOCK_PEERCRED)) {
614 RUBY_SOCK_PEERCRED cred;
615 memcpy(&cred,
RSTRING_PTR(data),
sizeof(RUBY_SOCK_PEERCRED));
617 (
unsigned)cred.pid, (
unsigned)cred.uid, (
unsigned)cred.gid);
627 #if defined(LOCAL_PEERCRED) 633 memcpy(&cred,
RSTRING_PTR(data),
sizeof(
struct xucred));
634 if (cred.cr_version != XUCRED_VERSION)
638 if (cred.cr_ngroups) {
640 const char *sep =
" groups=";
641 for (
i = 0;
i < cred.cr_ngroups;
i++) {
674 ID family_id, level_id, optname_id;
681 family_id = rsock_intern_family_noprefix(family);
687 if (
level == SOL_SOCKET) {
690 optname_id = rsock_intern_so_optname(optname);
697 else if (family == AF_UNIX) {
700 optname_id = rsock_intern_local_optname(optname);
708 level_id = rsock_intern_iplevel(
level);
727 if (
level == SOL_SOCKET)
734 # if defined(SO_DEBUG) 737 # if defined(SO_ERROR) 740 # if defined(SO_TYPE) 741 case SO_TYPE: inspected = inspect_socktype(
level, optname, data, ret);
break;
743 # if defined(SO_ACCEPTCONN) 744 case SO_ACCEPTCONN: inspected =
inspect_int(
level, optname, data, ret);
break;
746 # if defined(SO_BROADCAST) 747 case SO_BROADCAST: inspected =
inspect_int(
level, optname, data, ret);
break;
749 # if defined(SO_REUSEADDR) 750 case SO_REUSEADDR: inspected =
inspect_int(
level, optname, data, ret);
break;
752 # if defined(SO_KEEPALIVE) 753 case SO_KEEPALIVE: inspected =
inspect_int(
level, optname, data, ret);
break;
755 # if defined(SO_OOBINLINE) 756 case SO_OOBINLINE: inspected =
inspect_int(
level, optname, data, ret);
break;
758 # if defined(SO_SNDBUF) 761 # if defined(SO_RCVBUF) 764 # if defined(SO_DONTROUTE) 765 case SO_DONTROUTE: inspected =
inspect_int(
level, optname, data, ret);
break;
767 # if defined(SO_RCVLOWAT) 768 case SO_RCVLOWAT: inspected =
inspect_int(
level, optname, data, ret);
break;
770 # if defined(SO_SNDLOWAT) 771 case SO_SNDLOWAT: inspected =
inspect_int(
level, optname, data, ret);
break;
773 # if defined(SO_LINGER) 774 case SO_LINGER: inspected = inspect_linger(
level, optname, data, ret);
break;
776 # if defined(SO_RCVTIMEO) 779 # if defined(SO_SNDTIMEO) 782 # if defined(SO_PEERCRED) 783 case SO_PEERCRED: inspected = inspect_peercred(
level, optname, data, ret);
break;
795 # if defined(IPPROTO_IP) 798 # if defined(IP_MULTICAST_IF) && defined(HAVE_TYPE_STRUCT_IP_MREQN) 799 case IP_MULTICAST_IF: inspected = inspect_ipv4_multicast_if(
level, optname, data, ret);
break;
801 # if defined(IP_ADD_MEMBERSHIP) 802 case IP_ADD_MEMBERSHIP: inspected = inspect_ipv4_add_drop_membership(
level, optname, data, ret);
break;
804 # if defined(IP_DROP_MEMBERSHIP) 805 case IP_DROP_MEMBERSHIP: inspected = inspect_ipv4_add_drop_membership(
level, optname, data, ret);
break;
811 # if defined(IPPROTO_IPV6) 814 # if defined(IPV6_MULTICAST_HOPS) 815 case IPV6_MULTICAST_HOPS: inspected =
inspect_int(
level, optname, data, ret);
break;
817 # if defined(IPV6_MULTICAST_IF) 818 case IPV6_MULTICAST_IF: inspected = inspect_ipv6_multicast_if(
level, optname, data, ret);
break;
820 # if defined(IPV6_MULTICAST_LOOP) 821 case IPV6_MULTICAST_LOOP: inspected = inspect_uint(
level, optname, data, ret);
break;
823 # if defined(IPV6_JOIN_GROUP) 824 case IPV6_JOIN_GROUP: inspected = inspect_ipv6_mreq(
level, optname, data, ret);
break;
826 # if defined(IPV6_LEAVE_GROUP) 827 case IPV6_LEAVE_GROUP: inspected = inspect_ipv6_mreq(
level, optname, data, ret);
break;
829 # if defined(IPV6_UNICAST_HOPS) 830 case IPV6_UNICAST_HOPS: inspected =
inspect_int(
level, optname, data, ret);
break;
832 # if defined(IPV6_V6ONLY) 833 case IPV6_V6ONLY: inspected =
inspect_int(
level, optname, data, ret);
break;
839 # if defined(IPPROTO_TCP) 842 # if defined(TCP_NODELAY) 843 case TCP_NODELAY: inspected =
inspect_int(
level, optname, data, ret);
break;
856 # if defined(LOCAL_PEERCRED) 857 case LOCAL_PEERCRED: inspected = inspect_local_peercred(
level, optname, data, ret);
break;
static VALUE sockopt_unpack(VALUE self, VALUE template)
static VALUE sockopt_family_m(VALUE self)
static VALUE sockopt_bool(VALUE self)
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
static int rb_if_indextoname(const char *succ_prefix, const char *fail_prefix, unsigned int ifindex, char *buf, size_t len)
static VALUE sockopt_inspect(VALUE self)
static VALUE optname_to_sym(int level, int optname)
static int inspect_timeval_as_interval(int level, int optname, VALUE data, VALUE ret)
static VALUE sockopt_linger(VALUE self)
VALUE rb_funcall(VALUE, ID, int,...)
Calls a method.
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rb_check_to_integer(VALUE, const char *)
const char * rb_obj_classname(VALUE)
#define NEWOBJ_OF(obj, type, klass, flags)
static VALUE sockopt_level_m(VALUE self)
static VALUE sockopt_data(VALUE self)
int rsock_family_arg(VALUE domain)
VALUE rsock_sockopt_new(int family, int level, int optname, VALUE data)
static VALUE sockopt_initialize(VALUE self, VALUE vfamily, VALUE vlevel, VALUE voptname, VALUE data)
RUBY_EXTERN VALUE rb_cObject
static int inspect_errno(int level, int optname, VALUE data, VALUE ret)
static VALUE sockopt_s_bool(VALUE klass, VALUE vfamily, VALUE vlevel, VALUE voptname, VALUE vbool)
VALUE rb_str_cat2(VALUE, const char *)
int rsock_level_arg(int family, VALUE level)
static VALUE constant_to_sym(int constant, ID(*intern_const)(int))
static int sockopt_optname(VALUE self)
VALUE rb_sprintf(const char *format,...)
VALUE rb_ivar_set(VALUE, ID, VALUE)
unsigned char buf[MIME_BUF_SIZE]
VALUE rb_assoc_new(VALUE car, VALUE cdr)
static const char * inet_ntop(int af, const void *addr, char *numaddr, size_t numaddr_len)
static VALUE sockopt_optname_m(VALUE self)
static int inspect_int(int level, int optname, VALUE data, VALUE ret)
static VALUE sockopt_int(VALUE self)
static VALUE sockopt_s_int(VALUE klass, VALUE vfamily, VALUE vlevel, VALUE voptname, VALUE vint)
VALUE rb_str_catf(VALUE str, const char *format,...)
RUBY_EXTERN char * strerror(int)
static VALUE sockopt_s_linger(VALUE klass, VALUE vonoff, VALUE vsecs)
int rsock_optname_arg(int family, int level, VALUE optname)
const char * rb_id2name(ID id)
static int sockopt_level(VALUE self)
void rsock_init_sockopt(void)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
VALUE rb_str_append(VALUE, VALUE)
VALUE rb_attr_get(VALUE, ID)
VALUE rb_str_new(const char *, long)