about summary refs log tree commit diff
path: root/resolv
diff options
context:
space:
mode:
Diffstat (limited to 'resolv')
-rw-r--r--resolv/Makefile1
-rw-r--r--resolv/Versions3
-rw-r--r--resolv/ns_name.c125
-rw-r--r--resolv/ns_name_pton.c157
4 files changed, 161 insertions, 125 deletions
diff --git a/resolv/Makefile b/resolv/Makefile
index 3145ddebb7..7839e1fb3c 100644
--- a/resolv/Makefile
+++ b/resolv/Makefile
@@ -33,6 +33,7 @@ routines := \
   inet_ntop \
   inet_pton \
   ns_name_ntop \
+  ns_name_pton \
   ns_name_skip \
   ns_name_uncompress \
   ns_name_unpack \
diff --git a/resolv/Versions b/resolv/Versions
index 9e8762f984..770a2b8d6b 100644
--- a/resolv/Versions
+++ b/resolv/Versions
@@ -26,6 +26,7 @@ libc {
   }
   GLIBC_2.9 {
     ns_name_ntop;
+    ns_name_pton;
     ns_name_skip;
     ns_name_uncompress;
     ns_name_unpack;
@@ -38,6 +39,7 @@ libc {
     getaddrinfo_a;
 %endif
     ns_name_ntop;
+    ns_name_pton;
     ns_name_skip;
     ns_name_uncompress;
     ns_name_unpack;
@@ -50,6 +52,7 @@ libc {
     __inet_aton_exact;
     __inet_pton_length;
     __ns_name_ntop;
+    __ns_name_pton;
     __ns_name_skip;
     __ns_name_uncompress;
     __ns_name_unpack;
diff --git a/resolv/ns_name.c b/resolv/ns_name.c
index 35e25cbd83..9f7ca4a506 100644
--- a/resolv/ns_name.c
+++ b/resolv/ns_name.c
@@ -29,10 +29,6 @@
 
 # define SPRINTF(x) ((size_t)sprintf x)
 
-/* Data. */
-
-static const char	digits[] = "0123456789";
-
 /* Forward. */
 
 static int		dn_find(const u_char *, const u_char *,
@@ -42,127 +38,6 @@ static int		labellen(const u_char *);
 
 /* Public. */
 
-
-/*%
- *	Convert an ascii string into an encoded domain name as per RFC1035.
- *
- * return:
- *
- *\li	-1 if it fails
- *\li	1 if string was fully qualified
- *\li	0 is string was not fully qualified
- *
- * notes:
- *\li	Enforces label and domain length limits.
- */
-
-int
-ns_name_pton(const char *src, u_char *dst, size_t dstsiz)
-{
-	u_char *label, *bp, *eom;
-	int c, n, escaped;
-	char *cp;
-
-	escaped = 0;
-	bp = dst;
-	eom = dst + dstsiz;
-	label = bp++;
-
-	while ((c = *src++) != 0) {
-		if (escaped) {
-			if ((cp = strchr(digits, c)) != NULL) {
-				n = (cp - digits) * 100;
-				if ((c = *src++) == 0 ||
-				    (cp = strchr(digits, c)) == NULL) {
-					__set_errno (EMSGSIZE);
-					return (-1);
-				}
-				n += (cp - digits) * 10;
-				if ((c = *src++) == 0 ||
-				    (cp = strchr(digits, c)) == NULL) {
-					__set_errno (EMSGSIZE);
-					return (-1);
-				}
-				n += (cp - digits);
-				if (n > 255) {
-					__set_errno (EMSGSIZE);
-					return (-1);
-				}
-				c = n;
-			}
-			escaped = 0;
-		} else if (c == '\\') {
-			escaped = 1;
-			continue;
-		} else if (c == '.') {
-			c = (bp - label - 1);
-			if ((c & NS_CMPRSFLGS) != 0) {	/*%< Label too big. */
-				__set_errno (EMSGSIZE);
-				return (-1);
-			}
-			if (label >= eom) {
-				__set_errno (EMSGSIZE);
-				return (-1);
-			}
-			*label = c;
-			/* Fully qualified ? */
-			if (*src == '\0') {
-				if (c != 0) {
-					if (bp >= eom) {
-						__set_errno (EMSGSIZE);
-						return (-1);
-					}
-					*bp++ = '\0';
-				}
-				if ((bp - dst) > MAXCDNAME) {
-					__set_errno (EMSGSIZE);
-					return (-1);
-				}
-				return (1);
-			}
-			if (c == 0 || *src == '.') {
-				__set_errno (EMSGSIZE);
-				return (-1);
-			}
-			label = bp++;
-			continue;
-		}
-		if (bp >= eom) {
-			__set_errno (EMSGSIZE);
-			return (-1);
-		}
-		*bp++ = (u_char)c;
-	}
-	if (escaped) {
-		/* Trailing backslash.  */
-		__set_errno (EMSGSIZE);
-		return -1;
-	}
-	c = (bp - label - 1);
-	if ((c & NS_CMPRSFLGS) != 0) {		/*%< Label too big. */
-		__set_errno (EMSGSIZE);
-		return (-1);
-	}
-	if (label >= eom) {
-		__set_errno (EMSGSIZE);
-		return (-1);
-	}
-	*label = c;
-	if (c != 0) {
-		if (bp >= eom) {
-			__set_errno (EMSGSIZE);
-			return (-1);
-		}
-		*bp++ = 0;
-	}
-	if ((bp - dst) > MAXCDNAME) {	/*%< src too big */
-		__set_errno (EMSGSIZE);
-		return (-1);
-	}
-	return (0);
-}
-libresolv_hidden_def (ns_name_pton)
-
 /*%
  *	Convert a network strings labels into all lowercase.
  *
diff --git a/resolv/ns_name_pton.c b/resolv/ns_name_pton.c
new file mode 100644
index 0000000000..16f8ec8303
--- /dev/null
+++ b/resolv/ns_name_pton.c
@@ -0,0 +1,157 @@
+/* Convert a DNS domain name from presentation to wire format.
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <arpa/nameser.h>
+#include <errno.h>
+#include <shlib-compat.h>
+
+/* Converts an ASCII string into an encoded domain name as per
+   RFC1035.  Returns -1 if it fails, 1 if string was fully qualified,
+   0 is string was not fully qualified.  Enforces label and domain
+   length limits.  */
+int
+___ns_name_pton (const char *src, unsigned char *dst, size_t dstsiz)
+{
+  unsigned char *label, *bp, *eom;
+  int c, n, escaped;
+
+  escaped = 0;
+  bp = dst;
+  eom = dst + dstsiz;
+  label = bp++;
+
+  while ((c = *src++) != 0)
+    {
+      if (escaped)
+        {
+          if ('0' <= c && c <= '9')
+            {
+              n = (c - '0') * 100;
+              if ((c = *src++) == 0 || c < '0' || c > '9')
+                {
+                  __set_errno (EMSGSIZE);
+                  return -1;
+                }
+              n += (c - '0') * 10;
+              if ((c = *src++) == 0 || c < '0' || c > '9')
+                {
+                  __set_errno (EMSGSIZE);
+                  return -1;
+                }
+              n += c - '0';
+              if (n > 255)
+                {
+                  __set_errno (EMSGSIZE);
+                  return -1;
+                }
+              c = n;
+            }
+          escaped = 0;
+        }
+      else if (c == '\\')
+        {
+          escaped = 1;
+          continue;
+        }
+      else if (c == '.')
+        {
+          c = (bp - label - 1);
+          if ((c & NS_CMPRSFLGS) != 0) /* Label too big.  */
+            {
+              __set_errno (EMSGSIZE);
+              return -1;
+            }
+          if (label >= eom)
+            {
+              __set_errno (EMSGSIZE);
+              return -1;
+            }
+          *label = c;
+          /* Fully qualified ? */
+          if (*src == '\0')
+            {
+              if (c != 0)
+                {
+                  if (bp >= eom)
+                    {
+                      __set_errno (EMSGSIZE);
+                      return -1;
+                    }
+                  *bp++ = '\0';
+                }
+              if ((bp - dst) > MAXCDNAME)
+                {
+                  __set_errno (EMSGSIZE);
+                  return -1;
+                }
+              return 1;
+            }
+          if (c == 0 || *src == '.')
+            {
+              __set_errno (EMSGSIZE);
+              return -1;
+            }
+          label = bp++;
+          continue;
+        }
+      if (bp >= eom)
+        {
+          __set_errno (EMSGSIZE);
+          return -1;
+        }
+      *bp++ = (unsigned char) c;
+    }
+  if (escaped)                  /* Trailing backslash.  */
+    {
+      __set_errno (EMSGSIZE);
+      return -1;
+    }
+  c = (bp - label - 1);
+  if ((c & NS_CMPRSFLGS) != 0)  /* Label too big.  */
+    {
+      __set_errno (EMSGSIZE);
+      return -1;
+    }
+  if (label >= eom)
+    {
+      __set_errno (EMSGSIZE);
+      return -1;
+    }
+  *label = c;
+  if (c != 0)
+    {
+      if (bp >= eom)
+        {
+          __set_errno (EMSGSIZE);
+          return -1;
+        }
+      *bp++ = 0;
+    }
+  if ((bp - dst) > MAXCDNAME)   /* src too big.  */
+    {
+      __set_errno (EMSGSIZE);
+      return -1;
+    }
+  return 0;
+}
+versioned_symbol (libc, ___ns_name_pton, ns_name_pton, GLIBC_2_34);
+versioned_symbol (libc, ___ns_name_pton, __ns_name_pton, GLIBC_PRIVATE);
+libc_hidden_ver (___ns_name_pton, __ns_name_pton)
+
+#if OTHER_SHLIB_COMPAT (libresolv, GLIBC_2_9, GLIBC_2_34)
+compat_symbol (libresolv, ___ns_name_pton, ns_name_pton, GLIBC_2_9);
+#endif