diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ext/socket/ifaddr.c | 23 |
2 files changed, 24 insertions, 4 deletions
@@ -1,3 +1,8 @@ +Fri May 17 22:02:15 2013 Tanaka Akira <akr@fsij.org> + + * ext/socket/ifaddr.c: Use unsigned LONG_LONG to represent flags + because SunOS 5.11 (OpenIndiana) defines ifa_flags as uint64_t. + Fri May 17 21:47:00 2013 Zachary Scott <zachary@zacharyscott.net> * cont.c: Typo in constant MAX_MACHINE_STACK_CACHE from '..MAHINE..' diff --git a/ext/socket/ifaddr.c b/ext/socket/ifaddr.c index 2e9d35475b..5783dfc869 100644 --- a/ext/socket/ifaddr.c +++ b/ext/socket/ifaddr.c @@ -1,6 +1,21 @@ #include "rubysocket.h" #ifdef HAVE_GETIFADDRS + +/* + * ifa_flags is usually unsigned int. + * However it is uint64_t on SunOS 5.11 (OpenIndiana). + */ +#ifdef HAVE_LONG_LONG +typedef unsigned LONG_LONG ifa_flags_t; +#define PRIxIFAFLAGS PRI_LL_PREFIX"x" +#define IFAFLAGS2NUM(flags) ULL2NUM(flags) +#else +typedef unsigned int ifa_flags_t; +#define PRIxIFAFLAGS "x" +#define IFAFLAGS2NUM(flags) UINT2NUM(flags) +#endif + VALUE rb_cSockIfaddr; typedef struct rb_ifaddr_tag rb_ifaddr_t; @@ -163,7 +178,7 @@ ifaddr_flags(VALUE self) { rb_ifaddr_t *rifaddr = get_ifaddr(self); struct ifaddrs *ifa = rifaddr->ifaddr; - return UINT2NUM(ifa->ifa_flags); + return IFAFLAGS2NUM(ifa->ifa_flags); } /* @@ -239,11 +254,11 @@ ifaddr_dstaddr(VALUE self) } static void -ifaddr_inspect_flags(unsigned int flags, VALUE result) +ifaddr_inspect_flags(ifa_flags_t flags, VALUE result) { const char *sep = " "; #define INSPECT_BIT(bit, name) \ - if (flags & (bit)) { rb_str_catf(result, "%s" name, sep); flags &= ~(bit); sep = ","; } + if (flags & (bit)) { rb_str_catf(result, "%s" name, sep); flags &= ~(ifa_flags_t)(bit); sep = ","; } #ifdef IFF_UP INSPECT_BIT(IFF_UP, "UP") #endif @@ -303,7 +318,7 @@ ifaddr_inspect_flags(unsigned int flags, VALUE result) #endif #undef INSPECT_BIT if (flags) { - rb_str_catf(result, "%s%#x", sep, flags); + rb_str_catf(result, "%s%#"PRIxIFAFLAGS, sep, flags); } } |