8 ID name = intern_const(constant);
210 int i =
RTEST(vbool) ? 1 : 0;
259 l.l_onoff =
RTEST(vonoff) ? 1 : 0;
282 if (level != SOL_SOCKET || optname != SO_LINGER)
286 (
int)
sizeof(
struct linger), (
long)
RSTRING_LEN(data));
289 case 0: vonoff =
Qfalse;
break;
290 case 1: vonoff =
Qtrue;
break;
291 default: vonoff =
INT2NUM(l.l_onoff);
break;
327 #if defined(IPV6_MULTICAST_LOOP)
343 #if defined(SOL_SOCKET) && defined(SO_LINGER)
345 inspect_linger(
int level,
int optname,
VALUE data,
VALUE ret)
364 #if defined(SOL_SOCKET) && defined(SO_TYPE)
366 inspect_socktype(
int level,
int optname,
VALUE data,
VALUE ret)
372 id = rsock_intern_socktype(i);
439 #ifndef HAVE_INET_NTOP
441 inet_ntop(
int af,
const void *addr,
char *numaddr,
size_t numaddr_len)
443 #ifdef HAVE_INET_NTOA
445 memcpy(&in.s_addr, addr,
sizeof(in.s_addr));
446 snprintf(numaddr, numaddr_len,
"%s", inet_ntoa(in));
448 unsigned long x = ntohl(*(
unsigned long*)addr);
449 snprintf(numaddr, numaddr_len,
"%d.%d.%d.%d",
450 (
int) (x>>24) & 0xff, (
int) (x>>16) & 0xff,
451 (
int) (x>> 8) & 0xff, (
int) (x>> 0) & 0xff);
461 #if defined(HAVE_IF_INDEXTONAME)
463 if (if_indextoname(ifindex, ifbuf) ==
NULL)
464 return snprintf(buf, len,
"%s%u", fail_prefix, ifindex);
466 return snprintf(buf, len,
"%s%s", succ_prefix, ifbuf);
469 # define IFNAMSIZ (sizeof(unsigned int)*3+1)
471 return snprintf(buf, len,
"%s%u", fail_prefix, ifindex);
475 #if defined(IPPROTO_IP) && defined(HAVE_TYPE_STRUCT_IP_MREQ)
477 inspect_ipv4_mreq(
int level,
int optname,
VALUE data,
VALUE ret)
481 char addrbuf[INET_ADDRSTRLEN];
483 if (
inet_ntop(AF_INET, &
s.imr_multiaddr, addrbuf, (socklen_t)
sizeof(addrbuf)) ==
NULL)
487 if (
inet_ntop(AF_INET, &
s.imr_interface, addrbuf, (socklen_t)
sizeof(addrbuf)) ==
NULL)
499 #if defined(IPPROTO_IP) && defined(HAVE_TYPE_STRUCT_IP_MREQN)
501 inspect_ipv4_mreqn(
int level,
int optname,
VALUE data,
VALUE ret)
503 if (
RSTRING_LEN(data) ==
sizeof(
struct ip_mreqn)) {
505 char addrbuf[INET_ADDRSTRLEN], ifbuf[32+
IFNAMSIZ];
507 if (
inet_ntop(AF_INET, &
s.imr_multiaddr, addrbuf, (socklen_t)
sizeof(addrbuf)) ==
NULL)
511 if (
inet_ntop(AF_INET, &
s.imr_address, addrbuf, (socklen_t)
sizeof(addrbuf)) ==
NULL)
525 #if defined(IPPROTO_IP) && defined(HAVE_TYPE_STRUCT_IP_MREQ)
527 inspect_ipv4_add_drop_membership(
int level,
int optname,
VALUE data,
VALUE ret)
530 return inspect_ipv4_mreq(level, optname, data, ret);
531 # if defined(HAVE_TYPE_STRUCT_IP_MREQN)
532 else if (
RSTRING_LEN(data) ==
sizeof(
struct ip_mreqn))
533 return inspect_ipv4_mreqn(level, optname, data, ret);
540 #if defined(IPPROTO_IP) && defined(IP_MULTICAST_IF) && defined(HAVE_TYPE_STRUCT_IP_MREQN)
542 inspect_ipv4_multicast_if(
int level,
int optname,
VALUE data,
VALUE ret)
546 char addrbuf[INET_ADDRSTRLEN];
548 if (
inet_ntop(AF_INET, &
s, addrbuf, (socklen_t)
sizeof(addrbuf)) ==
NULL)
554 else if (
RSTRING_LEN(data) ==
sizeof(
struct ip_mreqn)) {
555 return inspect_ipv4_mreqn(level, optname, data, ret);
563 #if defined(IPV6_MULTICAST_IF)
565 inspect_ipv6_multicast_if(
int level,
int optname,
VALUE data,
VALUE ret)
569 unsigned int ifindex;
581 #if defined(IPPROTO_IPV6) && defined(HAVE_TYPE_STRUCT_IPV6_MREQ)
583 inspect_ipv6_mreq(
int level,
int optname,
VALUE data,
VALUE ret)
585 if (
RSTRING_LEN(data) ==
sizeof(
struct ipv6_mreq)) {
587 char addrbuf[INET6_ADDRSTRLEN], ifbuf[32+
IFNAMSIZ];
589 if (
inet_ntop(AF_INET6, &
s.ipv6mr_multiaddr, addrbuf, (socklen_t)
sizeof(addrbuf)) ==
NULL)
603 #if defined(SOL_SOCKET) && defined(SO_PEERCRED)
604 #if defined(__OpenBSD__)
605 #define RUBY_SOCK_PEERCRED struct sockpeercred
607 #define RUBY_SOCK_PEERCRED struct ucred
610 inspect_peercred(
int level,
int optname,
VALUE data,
VALUE ret)
612 if (
RSTRING_LEN(data) ==
sizeof(RUBY_SOCK_PEERCRED)) {
613 RUBY_SOCK_PEERCRED cred;
616 (
unsigned)cred.pid, (
unsigned)cred.uid, (
unsigned)cred.gid);
626 #if defined(LOCAL_PEERCRED)
628 inspect_local_peercred(
int level,
int optname,
VALUE data,
VALUE ret)
633 if (cred.cr_version != XUCRED_VERSION)
637 if (cred.cr_ngroups) {
639 const char *sep =
" groups=";
640 for (i = 0; i < cred.cr_ngroups; i++) {
673 ID family_id, level_id, optname_id;
680 family_id = rsock_intern_family_noprefix(family);
686 if (level == SOL_SOCKET) {
689 optname_id = rsock_intern_so_optname(optname);
696 else if (family == AF_UNIX) {
699 optname_id = rsock_intern_local_optname(optname);
707 level_id = rsock_intern_iplevel(level);
726 if (level == SOL_SOCKET)
733 # if defined(SO_DEBUG)
734 case SO_DEBUG: inspected =
inspect_int(level, optname, data, ret);
break;
736 # if defined(SO_ERROR)
737 case SO_ERROR: inspected =
inspect_errno(level, optname, data, ret);
break;
739 # if defined(SO_TYPE)
740 case SO_TYPE: inspected = inspect_socktype(level, optname, data, ret);
break;
742 # if defined(SO_ACCEPTCONN)
743 case SO_ACCEPTCONN: inspected =
inspect_int(level, optname, data, ret);
break;
745 # if defined(SO_BROADCAST)
746 case SO_BROADCAST: inspected =
inspect_int(level, optname, data, ret);
break;
748 # if defined(SO_REUSEADDR)
749 case SO_REUSEADDR: inspected =
inspect_int(level, optname, data, ret);
break;
751 # if defined(SO_KEEPALIVE)
752 case SO_KEEPALIVE: inspected =
inspect_int(level, optname, data, ret);
break;
754 # if defined(SO_OOBINLINE)
755 case SO_OOBINLINE: inspected =
inspect_int(level, optname, data, ret);
break;
757 # if defined(SO_SNDBUF)
758 case SO_SNDBUF: inspected =
inspect_int(level, optname, data, ret);
break;
760 # if defined(SO_RCVBUF)
761 case SO_RCVBUF: inspected =
inspect_int(level, optname, data, ret);
break;
763 # if defined(SO_DONTROUTE)
764 case SO_DONTROUTE: inspected =
inspect_int(level, optname, data, ret);
break;
766 # if defined(SO_RCVLOWAT)
767 case SO_RCVLOWAT: inspected =
inspect_int(level, optname, data, ret);
break;
769 # if defined(SO_SNDLOWAT)
770 case SO_SNDLOWAT: inspected =
inspect_int(level, optname, data, ret);
break;
772 # if defined(SO_LINGER)
773 case SO_LINGER: inspected = inspect_linger(level, optname, data, ret);
break;
775 # if defined(SO_RCVTIMEO)
778 # if defined(SO_SNDTIMEO)
781 # if defined(SO_PEERCRED)
782 case SO_PEERCRED: inspected = inspect_peercred(level, optname, data, ret);
break;
794 # if defined(IPPROTO_IP)
797 # if defined(IP_MULTICAST_IF) && defined(HAVE_TYPE_STRUCT_IP_MREQN)
798 case IP_MULTICAST_IF: inspected = inspect_ipv4_multicast_if(level, optname, data, ret);
break;
800 # if defined(IP_ADD_MEMBERSHIP)
801 case IP_ADD_MEMBERSHIP: inspected = inspect_ipv4_add_drop_membership(level, optname, data, ret);
break;
803 # if defined(IP_DROP_MEMBERSHIP)
804 case IP_DROP_MEMBERSHIP: inspected = inspect_ipv4_add_drop_membership(level, optname, data, ret);
break;
810 # if defined(IPPROTO_IPV6)
813 # if defined(IPV6_MULTICAST_HOPS)
814 case IPV6_MULTICAST_HOPS: inspected =
inspect_int(level, optname, data, ret);
break;
816 # if defined(IPV6_MULTICAST_IF)
817 case IPV6_MULTICAST_IF: inspected = inspect_ipv6_multicast_if(level, optname, data, ret);
break;
819 # if defined(IPV6_MULTICAST_LOOP)
820 case IPV6_MULTICAST_LOOP: inspected = inspect_uint(level, optname, data, ret);
break;
822 # if defined(IPV6_JOIN_GROUP)
823 case IPV6_JOIN_GROUP: inspected = inspect_ipv6_mreq(level, optname, data, ret);
break;
825 # if defined(IPV6_LEAVE_GROUP)
826 case IPV6_LEAVE_GROUP: inspected = inspect_ipv6_mreq(level, optname, data, ret);
break;
828 # if defined(IPV6_UNICAST_HOPS)
829 case IPV6_UNICAST_HOPS: inspected =
inspect_int(level, optname, data, ret);
break;
831 # if defined(IPV6_V6ONLY)
832 case IPV6_V6ONLY: inspected =
inspect_int(level, optname, data, ret);
break;
838 # if defined(IPPROTO_TCP)
841 # if defined(TCP_NODELAY)
842 case TCP_NODELAY: inspected =
inspect_int(level, optname, data, ret);
break;
855 # if defined(LOCAL_PEERCRED)
856 case LOCAL_PEERCRED: inspected = inspect_local_peercred(level, optname, data, ret);
break;
#define RSTRING_LEN(string)
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 INT2NUM(int v)
static VALUE sockopt_linger(VALUE self)
#define RSTRING_PTR(string)
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)
return rb_str_append(rb_str_new2(cmd_id_head), id_num)
static VALUE sockopt_level_m(VALUE self)
memset(y->frac+ix+1, 0,(y->Prec-(ix+1))*sizeof(BDIGIT))
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)
#define NEWOBJ(obj, type)
unsigned char buf[MIME_BUF_SIZE]
static char * inet_ntop(int af, const void *addr, char *numaddr, size_t numaddr_len)
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_assoc_new(VALUE car, VALUE cdr)
register unsigned int 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,...)
rb_ivar_set(einfo, ID_at_interp, interp)
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)
return rb_funcall(q->proc, ID_call, 0)
static int sockopt_level(VALUE self)
void rsock_init_sockopt(void)
#define OBJSETUP(obj, c, t)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
VALUE rb_attr_get(VALUE, ID)
VALUE rb_str_new(const char *, long)