diff --git a/src/ChangeLog b/src/ChangeLog index d4959915..60debe4f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2003-11-03 Hrvoje Niksic + + * host.h (ADDRESS_IPV4_DATA): Don't take the address of in.s_addr, + because that doesn't work on some machines. + 2003-11-03 Hrvoje Niksic * connect.c (select_fd): Generalize the third argument into WAIT, diff --git a/src/host.c b/src/host.c index 3a08deeb..65556804 100644 --- a/src/host.c +++ b/src/host.c @@ -163,7 +163,8 @@ address_list_match_all (const struct address_list *al1, { case IPV4_ADDRESS: if (ADDRESS_IPV4_IN_ADDR (ip1).s_addr - != ADDRESS_IPV4_IN_ADDR (ip2).s_addr) + != + ADDRESS_IPV4_IN_ADDR (ip2).s_addr) return 0; break; case IPV6_ADDRESS: diff --git a/src/host.h b/src/host.h index c5e1fd7e..24e98014 100644 --- a/src/host.h +++ b/src/host.h @@ -56,7 +56,7 @@ typedef struct { } type; /* Address data union: ipv6 contains IPv6-related data (address and - scope), and ipv4 contains IPv4 address. */ + scope), and ipv4 contains the IPv4 address. */ union { #ifdef ENABLE_IPV6 struct { @@ -73,14 +73,23 @@ typedef struct { } ip_address; /* Because C doesn't support anonymous unions, access to ip_address - elements is clunky. Hence the accessors. */ + elements is unwieldy. Hence the accessors. -#define ADDRESS_IPV6_IN6_ADDR(x) ((x)->u.ipv6.addr) -#define ADDRESS_IPV6_DATA(x) ((void *)&(x)->u.ipv6.addr.s6_addr) -#define ADDRESS_IPV6_SCOPE(x) ((x)->u.ipv6.scope_id) + The _ADDR accessors return the address as the struct in_addr or + in6_addr. The _DATA accessor returns a pointer to the address data + -- pretty much the same as the above, but cast to void*. The + _SCOPE accessor returns the address's scope_id, and makes sense + only when IPv6 and HAVE_SOCKADDR_IN6_SCOPE_ID are both defined. */ #define ADDRESS_IPV4_IN_ADDR(x) ((x)->u.ipv4.addr) -#define ADDRESS_IPV4_DATA(x) ((void *)&(x)->u.ipv4.addr.s_addr) +/* Don't use &x->u.ipv4.addr.s_addr because it can be #defined to a + bitfield, which you can't take an address of. */ +#define ADDRESS_IPV4_DATA(x) ((void *)&(x)->u.ipv4.addr) + +#define ADDRESS_IPV6_IN6_ADDR(x) ((x)->u.ipv6.addr) +#define ADDRESS_IPV6_DATA(x) ((void *)&(x)->u.ipv6.addr) +#define ADDRESS_IPV6_SCOPE(x) ((x)->u.ipv6.scope_id) + /* Flags for lookup_host */ #define LH_SILENT 0x0001