8 ID name = intern_const(constant);
162 unsigned char i = (
unsigned char)
NUM2CHR(vint);
254 int i =
RTEST(vbool) ? 1 : 0;
299 memset(&l, 0,
sizeof(l));
303 l.l_onoff =
RTEST(vonoff) ? 1 : 0;
326 if (level != SOL_SOCKET || optname != SO_LINGER)
330 (
int)
sizeof(
struct linger), (
long)
RSTRING_LEN(data));
331 memcpy((
char*)&l,
RSTRING_PTR(data),
sizeof(
struct linger));
333 case 0: vonoff =
Qfalse;
break;
334 case 1: vonoff =
Qtrue;
break;
335 default: vonoff =
INT2NUM(l.l_onoff);
break;
359 #if defined(IPPROTO_IP) && defined(IP_MULTICAST_LOOP)
360 # if defined(__NetBSD__) || defined(__OpenBSD__)
368 # error IPPROTO_IP or IP_MULTICAST_LOOP is not implemented
388 #if defined(IPPROTO_IP) && defined(IP_MULTICAST_LOOP)
389 if (family == AF_INET && level ==
IPPROTO_IP && optname == IP_MULTICAST_LOOP) {
390 # if defined(__NetBSD__) || defined(__OpenBSD__)
401 #if defined(__NetBSD__) || defined(__OpenBSD__)
402 # define inspect_ipv4_multicast_loop(a,b,c,d) inspect_byte(a,b,c,d)
404 # define inspect_ipv4_multicast_loop(a,b,c,d) inspect_int(a,b,c,d)
422 #if defined(IPPROTO_IP) && defined(IP_MULTICAST_TTL)
423 # if defined(__NetBSD__) || defined(__OpenBSD__)
431 # error IPPROTO_IP or IP_MULTICAST_TTL is not implemented
451 #if defined(IPPROTO_IP) && defined(IP_MULTICAST_TTL)
452 if (family == AF_INET && level ==
IPPROTO_IP && optname == IP_MULTICAST_TTL) {
453 # if defined(__NetBSD__) || defined(__OpenBSD__)
464 #if defined(__NetBSD__) || defined(__OpenBSD__)
465 # define inspect_ipv4_multicast_ttl(a,b,c,d) inspect_byte(a,b,c,d)
467 # define inspect_ipv4_multicast_ttl(a,b,c,d) inspect_int(a,b,c,d)
484 #if defined(__NetBSD__) || defined(__OpenBSD__)
486 inspect_byte(
int level,
int optname,
VALUE data,
VALUE ret)
514 #if defined(IPV6_MULTICAST_LOOP)
516 inspect_uint(
int level,
int optname,
VALUE data,
VALUE ret)
520 memcpy((
char*)&i,
RSTRING_PTR(data),
sizeof(
unsigned int));
530 #if defined(SOL_SOCKET) && defined(SO_LINGER)
532 inspect_linger(
int level,
int optname,
VALUE data,
VALUE ret)
540 default:
rb_str_catf(ret,
" on(%d)", s.l_onoff);
break;
551 #if defined(SOL_SOCKET) && defined(SO_TYPE)
553 inspect_socktype(
int level,
int optname,
VALUE data,
VALUE ret)
626 #ifndef HAVE_INET_NTOP
628 inet_ntop(
int af,
const void *addr,
char *numaddr,
size_t numaddr_len)
630 #ifdef HAVE_INET_NTOA
632 memcpy(&in.s_addr, addr,
sizeof(in.s_addr));
633 snprintf(numaddr, numaddr_len,
"%s", inet_ntoa(in));
635 unsigned long x = ntohl(*(
unsigned long*)addr);
636 snprintf(numaddr, numaddr_len,
"%d.%d.%d.%d",
637 (
int) (x>>24) & 0xff, (
int) (x>>16) & 0xff,
638 (
int) (x>> 8) & 0xff, (
int) (x>> 0) & 0xff);
642 #elif defined __MINGW64__
643 # define inet_ntop(f,a,n,l) rb_w32_inet_ntop(f,a,n,l)
648 rb_if_indextoname(
const char *succ_prefix,
const char *fail_prefix,
unsigned int ifindex,
char *
buf,
size_t len)
650 #if defined(HAVE_IF_INDEXTONAME)
652 if (if_indextoname(ifindex, ifbuf) ==
NULL)
653 return snprintf(buf, len,
"%s%u", fail_prefix, ifindex);
655 return snprintf(buf, len,
"%s%s", succ_prefix, ifbuf);
658 # define IFNAMSIZ (sizeof(unsigned int)*3+1)
660 return snprintf(buf, len,
"%s%u", fail_prefix, ifindex);
664 #if defined(IPPROTO_IP) && defined(HAVE_TYPE_STRUCT_IP_MREQ)
666 inspect_ipv4_mreq(
int level,
int optname,
VALUE data,
VALUE ret)
688 #if defined(IPPROTO_IP) && defined(HAVE_TYPE_STRUCT_IP_MREQN)
690 inspect_ipv4_mreqn(
int level,
int optname,
VALUE data,
VALUE ret)
692 if (
RSTRING_LEN(data) ==
sizeof(
struct ip_mreqn)) {
714 #if defined(IPPROTO_IP) && defined(HAVE_TYPE_STRUCT_IP_MREQ)
716 inspect_ipv4_add_drop_membership(
int level,
int optname,
VALUE data,
VALUE ret)
719 return inspect_ipv4_mreq(level, optname, data, ret);
720 # if defined(HAVE_TYPE_STRUCT_IP_MREQN)
721 else if (
RSTRING_LEN(data) ==
sizeof(
struct ip_mreqn))
722 return inspect_ipv4_mreqn(level, optname, data, ret);
729 #if defined(IPPROTO_IP) && defined(IP_MULTICAST_IF) && defined(HAVE_TYPE_STRUCT_IP_MREQN)
731 inspect_ipv4_multicast_if(
int level,
int optname,
VALUE data,
VALUE ret)
743 else if (
RSTRING_LEN(data) ==
sizeof(
struct ip_mreqn)) {
744 return inspect_ipv4_mreqn(level, optname, data, ret);
752 #if defined(IPV6_MULTICAST_IF)
754 inspect_ipv6_multicast_if(
int level,
int optname,
VALUE data,
VALUE ret)
758 unsigned int ifindex;
759 memcpy((
char*)&ifindex,
RSTRING_PTR(data),
sizeof(
unsigned int));
770 #if defined(IPPROTO_IPV6) && defined(HAVE_TYPE_STRUCT_IPV6_MREQ)
772 inspect_ipv6_mreq(
int level,
int optname,
VALUE data,
VALUE ret)
774 if (
RSTRING_LEN(data) ==
sizeof(
struct ipv6_mreq)) {
792 #if defined(SOL_SOCKET) && defined(SO_PEERCRED)
793 #if defined(__OpenBSD__)
794 #define RUBY_SOCK_PEERCRED struct sockpeercred
796 #define RUBY_SOCK_PEERCRED struct ucred
799 inspect_peercred(
int level,
int optname,
VALUE data,
VALUE ret)
801 if (
RSTRING_LEN(data) ==
sizeof(RUBY_SOCK_PEERCRED)) {
802 RUBY_SOCK_PEERCRED cred;
803 memcpy(&cred,
RSTRING_PTR(data),
sizeof(RUBY_SOCK_PEERCRED));
805 (
unsigned)cred.pid, (
unsigned)cred.uid, (
unsigned)cred.gid);
815 #if defined(LOCAL_PEERCRED)
817 inspect_local_peercred(
int level,
int optname,
VALUE data,
VALUE ret)
821 memcpy(&cred,
RSTRING_PTR(data),
sizeof(
struct xucred));
822 if (cred.cr_version != XUCRED_VERSION)
826 if (cred.cr_ngroups) {
828 const char *sep =
" groups=";
829 for (i = 0; i < cred.cr_ngroups; i++) {
862 ID family_id, level_id, optname_id;
875 if (level == SOL_SOCKET) {
885 else if (family == AF_UNIX) {
915 if (level == SOL_SOCKET)
922 # if defined(SO_DEBUG)
923 case SO_DEBUG: inspected =
inspect_int(level, optname, data, ret);
break;
925 # if defined(SO_ERROR)
926 case SO_ERROR: inspected =
inspect_errno(level, optname, data, ret);
break;
928 # if defined(SO_TYPE)
929 case SO_TYPE: inspected = inspect_socktype(level, optname, data, ret);
break;
931 # if defined(SO_ACCEPTCONN)
932 case SO_ACCEPTCONN: inspected =
inspect_int(level, optname, data, ret);
break;
934 # if defined(SO_BROADCAST)
935 case SO_BROADCAST: inspected =
inspect_int(level, optname, data, ret);
break;
937 # if defined(SO_REUSEADDR)
938 case SO_REUSEADDR: inspected =
inspect_int(level, optname, data, ret);
break;
940 # if defined(SO_KEEPALIVE)
941 case SO_KEEPALIVE: inspected =
inspect_int(level, optname, data, ret);
break;
943 # if defined(SO_OOBINLINE)
944 case SO_OOBINLINE: inspected =
inspect_int(level, optname, data, ret);
break;
946 # if defined(SO_SNDBUF)
947 case SO_SNDBUF: inspected =
inspect_int(level, optname, data, ret);
break;
949 # if defined(SO_RCVBUF)
950 case SO_RCVBUF: inspected =
inspect_int(level, optname, data, ret);
break;
952 # if defined(SO_DONTROUTE)
953 case SO_DONTROUTE: inspected =
inspect_int(level, optname, data, ret);
break;
955 # if defined(SO_RCVLOWAT)
956 case SO_RCVLOWAT: inspected =
inspect_int(level, optname, data, ret);
break;
958 # if defined(SO_SNDLOWAT)
959 case SO_SNDLOWAT: inspected =
inspect_int(level, optname, data, ret);
break;
961 # if defined(SO_LINGER)
962 case SO_LINGER: inspected = inspect_linger(level, optname, data, ret);
break;
964 # if defined(SO_RCVTIMEO)
967 # if defined(SO_SNDTIMEO)
970 # if defined(SO_PEERCRED)
971 case SO_PEERCRED: inspected = inspect_peercred(level, optname, data, ret);
break;
983 # if defined(IPPROTO_IP)
986 # if defined(IP_MULTICAST_IF) && defined(HAVE_TYPE_STRUCT_IP_MREQN)
987 case IP_MULTICAST_IF: inspected = inspect_ipv4_multicast_if(level, optname, data, ret);
break;
989 # if defined(IP_ADD_MEMBERSHIP)
990 case IP_ADD_MEMBERSHIP: inspected = inspect_ipv4_add_drop_membership(level, optname, data, ret);
break;
992 # if defined(IP_DROP_MEMBERSHIP)
993 case IP_DROP_MEMBERSHIP: inspected = inspect_ipv4_add_drop_membership(level, optname, data, ret);
break;
995 # if defined(IP_MULTICAST_LOOP)
998 # if defined(IP_MULTICAST_TTL)
1005 # if defined(IPPROTO_IPV6)
1008 # if defined(IPV6_MULTICAST_HOPS)
1009 case IPV6_MULTICAST_HOPS: inspected =
inspect_int(level, optname, data, ret);
break;
1011 # if defined(IPV6_MULTICAST_IF)
1012 case IPV6_MULTICAST_IF: inspected = inspect_ipv6_multicast_if(level, optname, data, ret);
break;
1014 # if defined(IPV6_MULTICAST_LOOP)
1015 case IPV6_MULTICAST_LOOP: inspected = inspect_uint(level, optname, data, ret);
break;
1017 # if defined(IPV6_JOIN_GROUP)
1018 case IPV6_JOIN_GROUP: inspected = inspect_ipv6_mreq(level, optname, data, ret);
break;
1020 # if defined(IPV6_LEAVE_GROUP)
1021 case IPV6_LEAVE_GROUP: inspected = inspect_ipv6_mreq(level, optname, data, ret);
break;
1023 # if defined(IPV6_UNICAST_HOPS)
1024 case IPV6_UNICAST_HOPS: inspected =
inspect_int(level, optname, data, ret);
break;
1026 # if defined(IPV6_V6ONLY)
1027 case IPV6_V6ONLY: inspected =
inspect_int(level, optname, data, ret);
break;
1033 # if defined(IPPROTO_TCP)
1036 # if defined(TCP_NODELAY)
1037 case TCP_NODELAY: inspected =
inspect_int(level, optname, data, ret);
break;
1045 #ifdef HAVE_SYS_UN_H
1050 # if defined(LOCAL_PEERCRED)
1051 case LOCAL_PEERCRED: inspected = inspect_local_peercred(level, optname, data, ret);
break;