20 #if defined(LIBC_SCCS) && !defined(lint) 21 static const char rcsid[] =
"Id: inet_net_ntop.c,v 1.1.2.2 2004/03/09 09:17:27 marka Exp $";
42 #define PGSQL_AF_INET (AF_INET + 0) 43 #define PGSQL_AF_INET6 (AF_INET + 1) 47 #define NS_IN6ADDRSZ 16 51 #define SPRINTF(x) strlen(sprintfx) 53 #define SPRINTF(x) ((size_t)sprintf x) 57 char *dst,
size_t size);
59 char *dst,
size_t size);
91 #if defined(AF_INET6) && AF_INET6 != PGSQL_AF_INET6 122 if (bits < 0 || bits > 32)
129 for (b = len; b > 0; b--)
131 if (size <=
sizeof ".255")
136 dst +=
SPRINTF((dst,
"%u", *src++));
137 size -= (size_t) (dst - t);
143 if (size <=
sizeof "/32")
145 dst +=
SPRINTF((dst,
"/%u", bits));
162 for (b = 1; b <=
bytes; b++)
164 if (size <=
sizeof "255.")
167 dst +=
SPRINTF((dst,
"%u", *src++));
173 size -= (size_t) (dst - t);
188 char tmp[
sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255/128"];
198 if ((bits < -1) || (bits > 128))
208 memset(words,
'\0',
sizeof words);
210 words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
215 for (i = 0; i < (NS_IN6ADDRSZ /
NS_INT16SZ); i++)
220 cur.base =
i, cur.len = 1;
228 if (best.base == -1 || cur.len > best.len)
236 if (best.base == -1 || cur.len > best.len)
239 if (best.base != -1 && best.len < 2)
246 for (i = 0; i < (NS_IN6ADDRSZ /
NS_INT16SZ); i++)
249 if (best.base != -1 && i >= best.base &&
250 i < (best.base + best.len))
260 if (i == 6 && best.base == 0 && (best.len == 6 ||
261 (best.len == 7 && words[7] != 0x0001) ||
262 (best.len == 5 && words[5] == 0xffff)))
266 n =
decoct(src + 12, 4, tp,
sizeof tmp - (tp - tmp));
275 tp +=
SPRINTF((tp,
"%x", words[i]));
279 if (best.base != -1 && (best.base + best.len) ==
284 if (bits != -1 && bits != 128)
285 tp +=
SPRINTF((tp,
"/%u", bits));
290 if ((
size_t) (tp - tmp) > size)
def bytes(source, encoding='ascii', errors='strict')
static int decoct(const u_char *src, int bytes, char *dst, size_t size)
static char * inet_net_ntop_ipv6(const u_char *src, int bits, char *dst, size_t size)
char * pg_inet_net_ntop(int af, const void *src, int bits, char *dst, size_t size)
static char * inet_net_ntop_ipv4(const u_char *src, int bits, char *dst, size_t size)