]> granicus.if.org Git - postgresql/blobdiff - src/backend/utils/adt/inet_net_ntop.c
Move some system includes into c.h, and remove duplicates.
[postgresql] / src / backend / utils / adt / inet_net_ntop.c
index 655f8ba62e6a077a80c8e5ceeb1ac17222df18a9..c38ecc5a6f2150181052657bc7ad965ce2f3a4e7 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.1 1998/10/03 05:40:48 momjian Exp $";
+static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.8 1999/07/17 20:17:56 momjian Exp $";
 
 #endif
 
@@ -26,9 +26,9 @@ static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.1 1998/10/03 05:40:48 momj
 #include <arpa/inet.h>
 
 #include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
+
+#include "postgres.h"
+#include "utils/builtins.h"
 
 #ifdef SPRINTF_CHAR
 #define SPRINTF(x) strlen(sprintf/**/x)
@@ -37,11 +37,13 @@ static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.1 1998/10/03 05:40:48 momj
 #endif
 
 static char *inet_net_ntop_ipv4(const u_char *src, int bits,
-                                                               char *dst, size_t size);
+                                  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:
@@ -50,21 +52,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));
+                       case AF_INET:
+                       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:
@@ -76,7 +79,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;
@@ -135,3 +138,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;
+       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; bits != 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);
+}