]> jfr.im git - irc/quakenet/newserv.git/blob - lib/irc_ipv6.h
Add jupe support
[irc/quakenet/newserv.git] / lib / irc_ipv6.h
1 /* IPv6 helper prototypes */
2
3 #ifndef __irc_ipv6_H
4 #define __irc_ipv6_H
5
6 /* from res.h */
7
8 /** Structure to store an IP address. */
9 struct irc_in_addr
10 {
11 unsigned short in6_16[8]; /**< IPv6 encoded parts, little-endian. */
12 };
13
14 /** Structure to store an IP address and port number. */
15 struct irc_sockaddr
16 {
17 struct irc_in_addr addr; /**< IP address. */
18 unsigned short port; /**< Port number, host-endian. */
19 };
20
21 /** Evaluate to non-zero if \a ADDR is a valid address (not all 0s and not all 1s). */
22 #define irc_in_addr_valid(ADDR) (((ADDR)->in6_16[0] && ~(ADDR)->in6_16[0]) \
23 || (ADDR)->in6_16[1] != (ADDR)->in6_16[0] \
24 || (ADDR)->in6_16[2] != (ADDR)->in6_16[0] \
25 || (ADDR)->in6_16[3] != (ADDR)->in6_16[0] \
26 || (ADDR)->in6_16[4] != (ADDR)->in6_16[0] \
27 || (ADDR)->in6_16[5] != (ADDR)->in6_16[0] \
28 || (ADDR)->in6_16[6] != (ADDR)->in6_16[0] \
29 || (ADDR)->in6_16[7] != (ADDR)->in6_16[0])
30 /** Evaluate to non-zero if \a ADDR (of type struct irc_in_addr) is an IPv4 address. */
31 #define irc_in_addr_is_ipv4(ADDR) (!(ADDR)->in6_16[0] && !(ADDR)->in6_16[1] && !(ADDR)->in6_16[2] \
32 && !(ADDR)->in6_16[3] && !(ADDR)->in6_16[4] && (ADDR)->in6_16[6] \
33 && (!(ADDR)->in6_16[5] || (ADDR)->in6_16[5] == 65535))
34 /** Evaluate to non-zero if \a A is a different IP than \a B. */
35 #define irc_in_addr_cmp(A,B) (irc_in_addr_is_ipv4(A) ? ((A)->in6_16[6] != (B)->in6_16[6] \
36 || (A)->in6_16[7] != (B)->in6_16[7] || !irc_in_addr_is_ipv4(B)) \
37 : memcmp((A), (B), sizeof(struct irc_in_addr)))
38 /** Evaluate to non-zero if \a ADDR is a loopback address. */
39 #define irc_in_addr_is_loopback(ADDR) (!(ADDR)->in6_16[0] && !(ADDR)->in6_16[1] && !(ADDR)->in6_16[2] \
40 && !(ADDR)->in6_16[3] && !(ADDR)->in6_16[4] \
41 && ((!(ADDR)->in6_16[5] \
42 && ((!(ADDR)->in6_16[6] && (ADDR)->in6_16[7] == htons(1)) \
43 || (ntohs((ADDR)->in6_16[6]) & 0xff00) == 0x7f00)) \
44 || (((ADDR)->in6_16[5] == 65535) \
45 && (ntohs((ADDR)->in6_16[6]) & 0xff00) == 0x7f00)))
46
47
48 /* from ircd_defs.h */
49
50 /** Maximum length of a numeric IP (v4 or v6) address.
51 * "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"
52 */
53 #define SOCKIPLEN 45
54
55 /* from ircd_string.h */
56
57 extern const char* ircd_ntoa(const struct irc_in_addr* addr);
58 extern const char* ircd_ntoa_r(char* buf, const struct irc_in_addr* addr);
59 #define ircd_aton(ADDR, STR) ipmask_parse((STR), (ADDR), NULL)
60 extern int ipmask_parse(const char *in, struct irc_in_addr *mask, unsigned char *bits_ptr);
61
62 #define IPtostr(ipaddr) ircd_ntoa(&(ipaddr))
63
64 /* from numnicks.h */
65
66 extern const char* iptobase64(char* buf, const struct irc_in_addr* addr, unsigned int count, int v6_ok);
67 extern void base64toip(const char* s, struct irc_in_addr* addr);
68
69 /* from ircd_chattr.h */
70
71 /** Array mapping characters to attribute bitmasks. */
72 extern const unsigned int IRCD_CharAttrTab[];
73
74 #define NTL_DIGIT 0x0008 /**< 0123456789 */
75
76 /** Test whether a character is a digit. */
77 #define IsDigit(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_DIGIT)
78
79 #endif /* __irc_ipv6_H */