OSDN Git Service

inet/resolv: add dn_skipname and ns_name_skip
authorDaniel Mack <zonque@gmail.com>
Tue, 12 Jul 2011 22:30:51 +0000 (00:30 +0200)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Fri, 26 Aug 2011 07:29:53 +0000 (09:29 +0200)
One uses the other, so add them in one go.

Signed-off-by: Daniel Mack <zonque@gmail.com>
include/resolv.h
libc/inet/resolv.c

index 0afb375..6556365 100644 (file)
@@ -336,8 +336,8 @@ __END_DECLS
 #endif
 #define dn_comp                        __dn_comp
 #define dn_expand              __dn_expand
-#if 0
 #define dn_skipname            __dn_skipname
+#if 0
 #define fp_resstat             __fp_resstat
 #define loc_aton               __loc_aton
 #define loc_ntoa               __loc_ntoa
@@ -388,7 +388,6 @@ int         b64_ntop (u_char const *, size_t, char *, size_t) __THROW;
 int            b64_pton (char const *, u_char *, size_t) __THROW;
 int            loc_aton (const char *ascii, u_char *binary) __THROW;
 const char *   loc_ntoa (const u_char *binary, char *ascii) __THROW;
-int            dn_skipname (const u_char *, const u_char *) __THROW;
 void           putlong (u_int32_t, u_char *) __THROW;
 void           putshort (u_int16_t, u_char *) __THROW;
 const char *   p_class (int) __THROW;
@@ -405,6 +404,7 @@ const char *        p_option (u_long option) __THROW;
 char *         p_secstodate (u_long) __THROW;
 int            dn_count_labels (const char *) __THROW;
 #endif
+int            dn_skipname (const u_char *, const u_char *) __THROW;
 int            dn_comp (const char *, u_char *, int, u_char **, u_char **)
      __THROW;
 int            dn_expand (const u_char *, const u_char *, const u_char *,
index a74ab30..6bfe52c 100644 (file)
@@ -3348,6 +3348,58 @@ int ns_name_compress(const char *src,
 
        return ns_name_pack(tmp, dst, dstsiz, dnptrs, lastdnptr);
 }
+
+int ns_name_skip(const unsigned char **ptrptr,
+                                const unsigned char *eom)
+{
+       const unsigned char *cp;
+       u_int n;
+       int l;
+
+       cp = *ptrptr;
+       while (cp < eom && (n = *cp++) != 0) {
+               /* Check for indirection. */
+               switch (n & NS_CMPRSFLGS) {
+               case 0:          /*%< normal case, n == len */
+                       cp += n;
+                       continue;
+               case NS_TYPE_ELT: /*%< EDNS0 extended label */
+                       if ((l = labellen(cp - 1)) < 0) {
+                               errno = EMSGSIZE; /*%< XXX */
+                               return -1;
+                       }
+                       cp += l;
+                       continue;
+               case NS_CMPRSFLGS:      /*%< indirection */
+                       cp++;
+                       break;
+               default:                /*%< illegal type */
+                       errno = EMSGSIZE;
+                       return -1;
+               }
+
+               break;
+       }
+
+       if (cp > eom) {
+               errno = EMSGSIZE;
+               return -1;
+       }
+
+       *ptrptr = cp;
+
+       return 0;
+}
+
+int dn_skipname(const unsigned char *ptr, const unsigned char *eom)
+{
+       const unsigned char *saveptr = ptr;
+
+       if (ns_name_skip(&ptr, eom) == -1)
+               return -1;
+
+       return ptr - saveptr;
+}
 #endif /* L_ns_name */