X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=include%2Fres.h;h=1029af09043087bb152559f11d130e218927a0a1;hb=0b0c08bc68c523b72bbd94f23f7e080f287d5623;hp=9f5533517249205c95ba8a310a500af842630eef;hpb=1260ad59bb7b6aefd322c66ced710c51d5933bd3;p=ircu2.10.12-pk.git diff --git a/include/res.h b/include/res.h index 9f55335..1029af0 100644 --- a/include/res.h +++ b/include/res.h @@ -126,9 +126,30 @@ extern void report_dns_servers(struct Client *source_p, const struct StatDesc *s extern void gethost_byname(const char *name, const struct DNSQuery *query); extern void gethost_byaddr(const struct irc_in_addr *addr, const struct DNSQuery *query); -extern int irc_in_addr_valid(const struct irc_in_addr *addr); -extern int irc_in_addr_cmp(const struct irc_in_addr *a, const struct irc_in_addr *b); -extern int irc_in_addr_is_ipv4(const struct irc_in_addr *addr); -extern int irc_in_addr_is_loopback(const struct irc_in_addr *addr); +/** Evaluate to non-zero if \a ADDR is a valid address (not all 0s and not all 1s). */ +#define irc_in_addr_valid(ADDR) (((ADDR)->in6_16[0] && ~(ADDR)->in6_16[0]) \ + || (ADDR)->in6_16[1] != (ADDR)->in6_16[0] \ + || (ADDR)->in6_16[2] != (ADDR)->in6_16[0] \ + || (ADDR)->in6_16[3] != (ADDR)->in6_16[0] \ + || (ADDR)->in6_16[4] != (ADDR)->in6_16[0] \ + || (ADDR)->in6_16[5] != (ADDR)->in6_16[0] \ + || (ADDR)->in6_16[6] != (ADDR)->in6_16[0] \ + || (ADDR)->in6_16[7] != (ADDR)->in6_16[0]) +/** Evaluate to non-zero if \a ADDR (of type struct irc_in_addr) is an IPv4 address. */ +#define irc_in_addr_is_ipv4(ADDR) (!(ADDR)->in6_16[0] && !(ADDR)->in6_16[1] && !(ADDR)->in6_16[2] \ + && !(ADDR)->in6_16[3] && !(ADDR)->in6_16[4] && (ADDR)->in6_16[6] \ + && (!(ADDR)->in6_16[5] || (ADDR)->in6_16[5] == 65535)) +/** Evaluate to non-zero if \a A is a different IP than \a B. */ +#define irc_in_addr_cmp(A,B) (irc_in_addr_is_ipv4(A) ? ((A)->in6_16[6] != (B)->in6_16[6] \ + || (A)->in6_16[7] != (B)->in6_16[7] || !irc_in_addr_is_ipv4(B)) \ + : memcmp((A), (B), sizeof(struct irc_in_addr))) +/** Evaluate to non-zero if \a ADDR is a loopback address. */ +#define irc_in_addr_is_loopback(ADDR) (!(ADDR)->in6_16[0] && !(ADDR)->in6_16[1] && !(ADDR)->in6_16[2] \ + && !(ADDR)->in6_16[3] && !(ADDR)->in6_16[4] \ + && ((!(ADDR)->in6_16[5] \ + && ((!(ADDR)->in6_16[6] && (ADDR)->in6_16[7] == htons(1)) \ + || (ntohs((ADDR)->in6_16[6]) & 0xff00) == 0x7f00)) \ + || (((ADDR)->in6_16[5] == 65535) \ + && (ntohs((ADDR)->in6_16[6]) & 0xff00) == 0x7f00))) #endif