diff options
Diffstat (limited to 'src/backend/utils/adt/inet_net_ntop.c')
-rw-r--r-- | src/backend/utils/adt/inet_net_ntop.c | 111 |
1 files changed, 105 insertions, 6 deletions
diff --git a/src/backend/utils/adt/inet_net_ntop.c b/src/backend/utils/adt/inet_net_ntop.c index 6d835df0c07..87f14dec944 100644 --- a/src/backend/utils/adt/inet_net_ntop.c +++ b/src/backend/utils/adt/inet_net_ntop.c @@ -16,7 +16,7 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.2 1998/10/04 15:35:08 momjian Exp $"; +static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.3 1998/10/22 13:16:25 momjian Exp $"; #endif @@ -41,10 +41,12 @@ static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.2 1998/10/04 15:35:08 momj static char *inet_net_ntop_ipv4(const u_char *src, int bits, char *dst, size_t size); +static char *inet_cidr_ntop_ipv4(const u_char *src, int bits, + char *dst, size_t size); /* * char * - * inet_net_ntop(af, src, bits, dst, size) + * inet_cidr_ntop(af, src, bits, dst, size) * convert network number from network to presentation format. * generates CIDR style result always. * return: @@ -53,21 +55,22 @@ static char *inet_net_ntop_ipv4(const u_char *src, int bits, * Paul Vixie (ISC), July 1996 */ char * -inet_net_ntop(int af, const void *src, int bits, char *dst, size_t size) +inet_cidr_ntop(int af, const void *src, int bits, char *dst, size_t size) { switch (af) { case AF_INET: - return (inet_net_ntop_ipv4(src, bits, dst, size)); + return (inet_cidr_ntop_ipv4(src, bits, dst, size)); default: errno = EAFNOSUPPORT; return (NULL); } } + /* * static char * - * inet_net_ntop_ipv4(src, bits, dst, size) + * inet_cidr_ntop_ipv4(src, bits, dst, size) * convert IPv4 network number from network to presentation format. * generates CIDR style result always. * return: @@ -79,7 +82,7 @@ inet_net_ntop(int af, const void *src, int bits, char *dst, size_t size) * Paul Vixie (ISC), July 1996 */ static char * -inet_net_ntop_ipv4(const u_char *src, int bits, char *dst, size_t size) +inet_cidr_ntop_ipv4(const u_char *src, int bits, char *dst, size_t size) { char *odst = dst; char *t; @@ -138,3 +141,99 @@ emsgsize: errno = EMSGSIZE; return (NULL); } + + +/* + * char * + * inet_net_ntop(af, src, bits, dst, size) + * convert host/network address from network to presentation format. + * "src"'s size is determined from its "af". + * return: + * pointer to dst, or NULL if an error occurred (check errno). + * note: + * 192.5.5.1/28 has a nonzero host part, which means it isn't a network + * as called for by inet_net_pton() but it can be a host address with + * an included netmask. + * author: + * Paul Vixie (ISC), October 1998 + */ +char * +inet_net_ntop(int af, const void *src, int bits, char *dst, size_t size) +{ + switch (af) + { + case AF_INET: + return (inet_net_ntop_ipv4(src, bits, dst, size)); + default: + errno = EAFNOSUPPORT; + return (NULL); + } +} + +/* + * static char * + * inet_net_ntop_ipv4(src, bits, dst, size) + * convert IPv4 network address from network to presentation format. + * "src"'s size is determined from its "af". + * return: + * pointer to dst, or NULL if an error occurred (check errno). + * note: + * network byte order assumed. this means 192.5.5.240/28 has + * 0b11110000 in its fourth octet. + * author: + * Paul Vixie (ISC), October 1998 + */ +static char * +inet_net_ntop_ipv4(const u_char *src, int bits, char *dst, size_t size) +{ + char *odst = dst; + char *t; + size_t len = 4; + u_int m; + int b, tb; + + if (bits < 0 || bits > 32) + { + errno = EINVAL; + return (NULL); + } + if (bits == 0) + { + if (size < sizeof "0") + goto emsgsize; + *dst++ = '0'; + size--; + *dst = '\0'; + } + + /* Format whole octets plus nonzero trailing octets. */ + tb = (bits == 32) ? 31 : bits; + for (b = 0; b <= (tb / 8) || (b < len && *src != 0); b++) + { + if (size < sizeof "255.") + goto emsgsize; + t = dst; + dst += SPRINTF((dst, "%u", *src++)); + if (b + 1 <= (tb / 8) || (b + 1 < len && *src != 0)) + { + *dst++ = '.'; + *dst = '\0'; + } + size -= (size_t)(dst - t); + } + + /* don't print masklen if 32 bits */ + if (bits == 32) + return odst; + + /* Format CIDR /width. */ + if (size < sizeof "/32") + goto emsgsize; + dst += SPRINTF((dst, "/%u", bits)); + + return (odst); + + emsgsize: + errno = EMSGSIZE; + return (NULL); +} |