10typedef unsigned LONG_LONG ifa_flags_t;
11#define PRIxIFAFLAGS PRI_LL_PREFIX"x"
12#define IFAFLAGS2NUM(flags) ULL2NUM(flags)
14typedef unsigned int ifa_flags_t;
15#define PRIxIFAFLAGS "x"
16#define IFAFLAGS2NUM(flags) UINT2NUM(flags)
21typedef struct rb_ifaddr_tag rb_ifaddr_t;
22typedef struct rb_ifaddr_root_tag rb_ifaddr_root_t;
29struct rb_ifaddr_root_tag {
35static rb_ifaddr_root_t *
36get_root(
const rb_ifaddr_t *ifaddr)
38 return (rb_ifaddr_root_t *)((
char *)&ifaddr[-ifaddr->ord] -
45 rb_ifaddr_t *ifaddr =
ptr;
46 rb_ifaddr_root_t *
root = get_root(ifaddr);
48 if (
root->refcount == 0) {
55ifaddr_memsize(
const void *
ptr)
58 const rb_ifaddr_t *ifaddr;
60 if (ifaddr->ord == 0)
size =
sizeof(rb_ifaddr_root_t);
67 {0, ifaddr_free, ifaddr_memsize,},
70static inline rb_ifaddr_t *
71check_ifaddr(
VALUE self)
79 rb_ifaddr_t *rifaddr = check_ifaddr(self);
88get_ifaddrs(
VALUE self)
90 return get_ifaddr(self)->ifaddr;
99 rb_ifaddr_root_t *
root;
117 root->numifaddrs = numifaddrs;
120 for (i = 0; i < numifaddrs; i++) {
121 root->ary[i].ord = i;
122 root->ary[i].ifaddr = ifa;
130 for (i = 1; i < numifaddrs; i++) {
147ifaddr_name(
VALUE self)
149 struct ifaddrs *ifa = get_ifaddrs(self);
153#ifdef HAVE_IF_NAMETOINDEX
162ifaddr_ifindex(
VALUE self)
164 struct ifaddrs *ifa = get_ifaddrs(self);
165 unsigned int ifindex = if_nametoindex(ifa->
ifa_name);
172#define ifaddr_ifindex rb_f_notimplement
183ifaddr_flags(
VALUE self)
185 struct ifaddrs *ifa = get_ifaddrs(self);
198ifaddr_addr(
VALUE self)
200 struct ifaddrs *ifa = get_ifaddrs(self);
215ifaddr_netmask(
VALUE self)
217 struct ifaddrs *ifa = get_ifaddrs(self);
232ifaddr_broadaddr(
VALUE self)
234 struct ifaddrs *ifa = get_ifaddrs(self);
249ifaddr_dstaddr(
VALUE self)
251 struct ifaddrs *ifa = get_ifaddrs(self);
257#ifdef HAVE_STRUCT_IF_DATA_IFI_VHID
267ifaddr_vhid(
VALUE self)
269 struct ifaddrs *ifa = get_ifaddrs(self);
278ifaddr_inspect_flags(ifa_flags_t flags,
VALUE result)
280 const char *sep =
" ";
281#define INSPECT_BIT(bit, name) \
282 if (flags & (bit)) { rb_str_catf(result, "%s" name, sep); flags &= ~(ifa_flags_t)(bit); sep = ","; }
284 INSPECT_BIT(IFF_UP,
"UP")
287 INSPECT_BIT(IFF_BROADCAST,
"BROADCAST")
290 INSPECT_BIT(IFF_DEBUG,
"DEBUG")
293 INSPECT_BIT(IFF_LOOPBACK,
"LOOPBACK")
295#ifdef IFF_POINTOPOINT
296 INSPECT_BIT(IFF_POINTOPOINT,
"POINTOPOINT")
299 INSPECT_BIT(IFF_RUNNING,
"RUNNING")
302 INSPECT_BIT(IFF_NOARP,
"NOARP")
305 INSPECT_BIT(IFF_PROMISC,
"PROMISC")
308 INSPECT_BIT(IFF_NOTRAILERS,
"NOTRAILERS")
311 INSPECT_BIT(IFF_ALLMULTI,
"ALLMULTI")
314 INSPECT_BIT(IFF_SIMPLEX,
"SIMPLEX")
317 INSPECT_BIT(IFF_MASTER,
"MASTER")
320 INSPECT_BIT(IFF_SLAVE,
"SLAVE")
323 INSPECT_BIT(IFF_MULTICAST,
"MULTICAST")
326 INSPECT_BIT(IFF_PORTSEL,
"PORTSEL")
329 INSPECT_BIT(IFF_AUTOMEDIA,
"AUTOMEDIA")
332 INSPECT_BIT(IFF_DYNAMIC,
"DYNAMIC")
335 INSPECT_BIT(IFF_LOWER_UP,
"LOWER_UP")
338 INSPECT_BIT(IFF_DORMANT,
"DORMANT")
341 INSPECT_BIT(IFF_ECHO,
"ECHO")
345 rb_str_catf(result,
"%s%#"PRIxIFAFLAGS, sep, flags);
357ifaddr_inspect(
VALUE self)
359 struct ifaddrs *ifa = get_ifaddrs(self);
369 ifaddr_inspect_flags(ifa->
ifa_flags, result);
403#ifdef HAVE_GETIFADDRS
447 return rsock_getifaddrs();
450#define socket_s_getifaddrs rb_f_notimplement
456#ifdef HAVE_GETIFADDRS
472#ifdef HAVE_STRUCT_IF_DATA_IFI_VHID
#define offsetof(p_type, field)
VALUE rb_ary_push(VALUE ary, VALUE item)
#define rb_define_method(klass, mid, func, arity)
Defines klass#mid.
#define rb_define_singleton_method(klass, mid, func, arity)
Defines klass.mid.
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,...)
void * rb_check_typeddata(VALUE obj, const rb_data_type_t *data_type)
void rb_sys_fail(const char *mesg)
VALUE rb_cObject
Object class.
void rsock_init_sockifaddr(void)
#define socket_s_getifaddrs
VALUE rb_str_append(VALUE, VALUE)
#define rb_str_new_cstr(str)
VALUE rb_class_name(VALUE)
void rb_undef_alloc_func(VALUE)
VALUE rsock_inspect_sockaddr(struct sockaddr *sockaddr_arg, socklen_t socklen, VALUE ret)
#define RTYPEDDATA_DATA(v)
#define TypedData_Wrap_Struct(klass, data_type, sval)
VALUE rsock_sockaddr_obj(struct sockaddr *addr, socklen_t len)
socklen_t rsock_sockaddr_len(struct sockaddr *addr)
VALUE rb_str_catf(VALUE, const char *,...)
struct sockaddr * ifa_addr
struct ifaddrs * ifa_next
struct sockaddr * ifa_dstaddr
struct sockaddr * ifa_broadaddr
struct sockaddr * ifa_netmask
void freeifaddrs(struct ifaddrs *)
int getifaddrs(struct ifaddrs **)