11 #define PRIxIFAFLAGS PRI_LL_PREFIX"x" 
   12 #define IFAFLAGS2NUM(flags) ULL2NUM(flags) 
   14 typedef unsigned int ifa_flags_t;
 
   15 #define PRIxIFAFLAGS "x" 
   16 #define IFAFLAGS2NUM(flags) UINT2NUM(flags) 
   21 typedef struct rb_ifaddr_tag rb_ifaddr_t;
 
   22 typedef struct rb_ifaddr_root_tag rb_ifaddr_root_t;
 
   24 struct rb_ifaddr_tag {
 
   29 struct rb_ifaddr_root_tag {
 
   35 static rb_ifaddr_root_t *
 
   36 get_root(
const rb_ifaddr_t *ifaddr)
 
   38     return (rb_ifaddr_root_t *)((
char *)&ifaddr[-ifaddr->ord] -
 
   43 ifaddr_free(
void *
ptr)
 
   45     rb_ifaddr_t *ifaddr = 
ptr;
 
   46     rb_ifaddr_root_t *root = get_root(ifaddr);
 
   48     if (root->refcount == 0) {
 
   55 ifaddr_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,},
 
   70 static inline rb_ifaddr_t *
 
   71 check_ifaddr(
VALUE self)
 
   77 get_ifaddr(
VALUE self)
 
   79     rb_ifaddr_t *rifaddr = check_ifaddr(
self);
 
   88 get_ifaddrs(
VALUE self)
 
   90     return get_ifaddr(
self)->ifaddr;
 
   94 rsock_getifaddrs(
void)
 
   99     rb_ifaddr_root_t *root;
 
  115     root = 
xmalloc(
offsetof(rb_ifaddr_root_t, ary) + numifaddrs * 
sizeof(rb_ifaddr_t));
 
  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++) {
 
  147 ifaddr_name(
VALUE self)
 
  149     struct ifaddrs *ifa = get_ifaddrs(
self);
 
  153 #ifdef HAVE_IF_NAMETOINDEX 
  162 ifaddr_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 
  183 ifaddr_flags(
VALUE self)
 
  185     struct ifaddrs *ifa = get_ifaddrs(
self);
 
  198 ifaddr_addr(
VALUE self)
 
  200     struct ifaddrs *ifa = get_ifaddrs(
self);
 
  215 ifaddr_netmask(
VALUE self)
 
  217     struct ifaddrs *ifa = get_ifaddrs(
self);
 
  232 ifaddr_broadaddr(
VALUE self)
 
  234     struct ifaddrs *ifa = get_ifaddrs(
self);
 
  249 ifaddr_dstaddr(
VALUE self)
 
  251     struct ifaddrs *ifa = get_ifaddrs(
self);
 
  257 #ifdef HAVE_STRUCT_IF_DATA_IFI_VHID 
  267 ifaddr_vhid(
VALUE self)
 
  269     struct ifaddrs *ifa = get_ifaddrs(
self);
 
  278 ifaddr_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")
 
  307 #ifdef IFF_NOTRAILERS 
  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);
 
  357 ifaddr_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