[BACK]Return to ns_print.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / nameser

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libc/nameser/ns_print.c between version 1.8 and 1.9

version 1.8, 2008/06/21 20:41:48 version 1.9, 2009/04/12 17:07:17
Line 20 
Line 20 
 #include <sys/cdefs.h>  #include <sys/cdefs.h>
 #ifndef lint  #ifndef lint
 #ifdef notdef  #ifdef notdef
 static const char rcsid[] = "Id: ns_print.c,v 1.10 2005/04/27 04:56:40 sra Exp";  static const char rcsid[] = "Id: ns_print.c,v 1.12 2009/03/03 05:29:58 each Exp";
 #else  #else
 __RCSID("$NetBSD$");  __RCSID("$NetBSD$");
 #endif  #endif
Line 74  static int addtab(size_t len, size_t tar
Line 74  static int addtab(size_t len, size_t tar
                         return (-1); \                          return (-1); \
         } while (/*CONSTCOND*/0)          } while (/*CONSTCOND*/0)
   
   static const char base32hex[] =
           "0123456789ABCDEFGHIJKLMNOPQRSTUV=0123456789abcdefghijklmnopqrstuv";
   
 /* Public. */  /* Public. */
   
 /*%  /*%
Line 257  ns_sprintrrf(const u_char *msg, size_t m
Line 260  ns_sprintrrf(const u_char *msg, size_t m
   
         case ns_t_mx:          case ns_t_mx:
         case ns_t_afsdb:          case ns_t_afsdb:
         case ns_t_rt: {          case ns_t_rt:
           case ns_t_kx: {
                 u_int t;                  u_int t;
   
                 if (rdlen < (size_t)NS_INT16SZ)                  if (rdlen < (size_t)NS_INT16SZ)
Line 305  ns_sprintrrf(const u_char *msg, size_t m
Line 309  ns_sprintrrf(const u_char *msg, size_t m
                 break;                  break;
   
         case ns_t_txt:          case ns_t_txt:
           case ns_t_spf:
                 while (rdata < edata) {                  while (rdata < edata) {
                         T(len = charstr(rdata, edata, &buf, &buflen));                          T(len = charstr(rdata, edata, &buf, &buflen));
                         if (len == 0)                          if (len == 0)
Line 451  ns_sprintrrf(const u_char *msg, size_t m
Line 456  ns_sprintrrf(const u_char *msg, size_t m
                 break;                  break;
             }              }
   
         case ns_t_key: {          case ns_t_key:
           case ns_t_dnskey: {
                 char base64_key[NS_MD5RSA_MAX_BASE64];                  char base64_key[NS_MD5RSA_MAX_BASE64];
                 u_int keyflags, protocol, algorithm, key_id;                  u_int keyflags, protocol, algorithm, key_id;
                 const char *leader;                  const char *leader;
Line 497  ns_sprintrrf(const u_char *msg, size_t m
Line 503  ns_sprintrrf(const u_char *msg, size_t m
                 break;                  break;
             }              }
   
         case ns_t_sig: {          case ns_t_sig:
           case ns_t_rrsig: {
                 char base64_key[NS_MD5RSA_MAX_BASE64];                  char base64_key[NS_MD5RSA_MAX_BASE64];
                 u_int typ, algorithm, labels, footprint;                  u_int typ, algorithm, labels, footprint;
                 const char *leader;                  const char *leader;
Line 703  ns_sprintrrf(const u_char *msg, size_t m
Line 710  ns_sprintrrf(const u_char *msg, size_t m
                 break;                  break;
             }              }
   
           case ns_t_ds:
           case ns_t_dlv:
           case ns_t_sshfp: {
                   u_int t;
   
                   if (type == ns_t_ds || type == ns_t_dlv) {
                           if (rdlen < 4U) goto formerr;
                           t = ns_get16(rdata);
                           rdata += NS_INT16SZ;
                           len = SPRINTF((tmp, "%u ", t));
                           T(addstr(tmp, len, &buf, &buflen));
                   } else
                           if (rdlen < 2U) goto formerr;
   
                   len = SPRINTF((tmp, "%u ", *rdata));
                   T(addstr(tmp, len, &buf, &buflen));
                   rdata++;
   
                   len = SPRINTF((tmp, "%u ", *rdata));
                   T(addstr(tmp, len, &buf, &buflen));
                   rdata++;
   
                   while (rdata < edata) {
                           len = SPRINTF((tmp, "%02X", *rdata));
                           T(addstr(tmp, len, &buf, &buflen));
                           rdata++;
                   }
                   break;
               }
   
           case ns_t_nsec3:
           case ns_t_nsec3param: {
                   u_int t, w, l, j, k, c;
   
                   len = SPRINTF((tmp, "%u ", *rdata));
                   T(addstr(tmp, len, &buf, &buflen));
                   rdata++;
   
                   len = SPRINTF((tmp, "%u ", *rdata));
                   T(addstr(tmp, len, &buf, &buflen));
                   rdata++;
   
                   t = ns_get16(rdata);
                   rdata += NS_INT16SZ;
                   len = SPRINTF((tmp, "%u ", t));
                   T(addstr(tmp, len, &buf, &buflen));
   
                   t = *rdata++;
                   if (t == 0) {
                           T(addstr("-", 1, &buf, &buflen));
                   } else {
                           while (t-- > 0) {
                                   len = SPRINTF((tmp, "%02X", *rdata));
                                   T(addstr(tmp, len, &buf, &buflen));
                                   rdata++;
                           }
                   }
                   if (type == ns_t_nsec3param)
                           break;
                   T(addstr(" ", 1, &buf, &buflen));
   
                   t = *rdata++;
                   while (t > 0) {
                           switch (t) {
                           case 1:
                                   tmp[0] = base32hex[((rdata[0]>>3)&0x1f)];
                                   tmp[1] = base32hex[((rdata[0]<<2)&0x1c)];
                                   tmp[2] = tmp[3] = tmp[4] = '=';
                                   tmp[5] = tmp[6] = tmp[7] = '=';
                                   break;
                           case 2:
                                   tmp[0] = base32hex[((rdata[0]>>3)&0x1f)];
                                   tmp[1] = base32hex[((rdata[0]<<2)&0x1c)|
                                                      ((rdata[1]>>6)&0x03)];
                                   tmp[2] = base32hex[((rdata[1]>>1)&0x1f)];
                                   tmp[3] = base32hex[((rdata[1]<<4)&0x10)];
                                   tmp[4] = tmp[5] = tmp[6] = tmp[7] = '=';
                                   break;
                           case 3:
                                   tmp[0] = base32hex[((rdata[0]>>3)&0x1f)];
                                   tmp[1] = base32hex[((rdata[0]<<2)&0x1c)|
                                                      ((rdata[1]>>6)&0x03)];
                                   tmp[2] = base32hex[((rdata[1]>>1)&0x1f)];
                                   tmp[3] = base32hex[((rdata[1]<<4)&0x10)|
                                                      ((rdata[2]>>4)&0x0f)];
                                   tmp[4] = base32hex[((rdata[2]<<1)&0x1e)];
                                   tmp[5] = tmp[6] = tmp[7] = '=';
                                   break;
                           case 4:
                                   tmp[0] = base32hex[((rdata[0]>>3)&0x1f)];
                                   tmp[1] = base32hex[((rdata[0]<<2)&0x1c)|
                                                      ((rdata[1]>>6)&0x03)];
                                   tmp[2] = base32hex[((rdata[1]>>1)&0x1f)];
                                   tmp[3] = base32hex[((rdata[1]<<4)&0x10)|
                                                      ((rdata[2]>>4)&0x0f)];
                                   tmp[4] = base32hex[((rdata[2]<<1)&0x1e)|
                                                      ((rdata[3]>>7)&0x01)];
                                   tmp[5] = base32hex[((rdata[3]>>2)&0x1f)];
                                   tmp[6] = base32hex[(rdata[3]<<3)&0x18];
                                   tmp[7] = '=';
                                   break;
                           default:
                                   tmp[0] = base32hex[((rdata[0]>>3)&0x1f)];
                                   tmp[1] = base32hex[((rdata[0]<<2)&0x1c)|
                                                      ((rdata[1]>>6)&0x03)];
                                   tmp[2] = base32hex[((rdata[1]>>1)&0x1f)];
                                   tmp[3] = base32hex[((rdata[1]<<4)&0x10)|
                                                      ((rdata[2]>>4)&0x0f)];
                                   tmp[4] = base32hex[((rdata[2]<<1)&0x1e)|
                                                      ((rdata[3]>>7)&0x01)];
                                   tmp[5] = base32hex[((rdata[3]>>2)&0x1f)];
                                   tmp[6] = base32hex[((rdata[3]<<3)&0x18)|
                                                      ((rdata[4]>>5)&0x07)];
                                   tmp[7] = base32hex[(rdata[4]&0x1f)];
                                   break;
                           }
                           T(addstr(tmp, 8, &buf, &buflen));
                           if (t >= 5) {
                                   rdata += 5;
                                   t -= 5;
                           } else {
                                   rdata += t;
                                   t -= t;
                           }
                   }
   
                   while (rdata < edata) {
                           w = *rdata++;
                           l = *rdata++;
                           for (j = 0; j < l; j++) {
                                   if (rdata[j] == 0)
                                           continue;
                                   for (k = 0; k < 8; k++) {
                                           if ((rdata[j] & (0x80 >> k)) == 0)
                                                   continue;
                                           c = w * 256 + j * 8 + k;
                                           len = SPRINTF((tmp, " %s", p_type(c)));
                                           T(addstr(tmp, len, &buf, &buflen));
                                   }
                           }
                           rdata += l;
                   }
                   break;
               }
   
           case ns_t_nsec: {
                   u_int w, l, j, k, c;
   
                   T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
   
                   while (rdata < edata) {
                           w = *rdata++;
                           l = *rdata++;
                           for (j = 0; j < l; j++) {
                                   if (rdata[j] == 0)
                                           continue;
                                   for (k = 0; k < 8; k++) {
                                           if ((rdata[j] & (0x80 >> k)) == 0)
                                                   continue;
                                           c = w * 256 + j * 8 + k;
                                           len = SPRINTF((tmp, " %s", p_type(c)));
                                           T(addstr(tmp, len, &buf, &buflen));
                                   }
                           }
                           rdata += l;
                   }
                   break;
               }
   
           case ns_t_dhcid: {
                   int n;
                   unsigned int siz;
                   char base64_dhcid[8192];
                   const char *leader;
   
                   siz = (edata-rdata)*4/3 + 4; /* "+4" accounts for trailing \0 */
                   if (siz > sizeof(base64_dhcid) * 3/4) {
                           const char *str = "record too long to print";
                           T(addstr(str, strlen(str), &buf, &buflen));
                   } else {
                           len = b64_ntop(rdata, edata-rdata, base64_dhcid, siz);
   
                           if (len < 0)
                                   goto formerr;
   
                           else if (len > 15) {
                                   T(addstr(" (", 2, &buf, &buflen));
                                   leader = "\n\t\t";
                                   spaced = 0;
                           }
                           else
                                   leader = " ";
   
                           for (n = 0; n < len; n += 48) {
                                   T(addstr(leader, strlen(leader),
                                            &buf, &buflen));
                                   T(addstr(base64_dhcid + n, MIN(len - n, 48),
                                            &buf, &buflen));
                           }
                           if (len > 15)
                                   T(addstr(" )", 2, &buf, &buflen));
                   }
           }
   
           case ns_t_ipseckey: {
                   int n;
                   unsigned int siz;
                   char base64_key[8192];
                   const char *leader;
   
                   if (rdlen < 2)
                           goto formerr;
   
                   switch (rdata[1]) {
                   case 0:
                   case 3:
                           if (rdlen < 3)
                                   goto formerr;
                           break;
                   case 1:
                           if (rdlen < 7)
                                   goto formerr;
                           break;
                   case 2:
                           if (rdlen < 19)
                                   goto formerr;
                           break;
                   default:
                           comment = "unknown IPSECKEY gateway type";
                           goto hexify;
                   }
   
                   len = SPRINTF((tmp, "%u ", *rdata));
                   T(addstr(tmp, len, &buf, &buflen));
                   rdata++;
   
                   len = SPRINTF((tmp, "%u ", *rdata));
                   T(addstr(tmp, len, &buf, &buflen));
                   rdata++;
   
                   len = SPRINTF((tmp, "%u ", *rdata));
                   T(addstr(tmp, len, &buf, &buflen));
                   rdata++;
   
                   switch (rdata[-2]) {
                   case 0:
                           T(addstr(".", 1, &buf, &buflen));
                           break;
                   case 1:
                           (void) inet_ntop(AF_INET, rdata, buf, buflen);
                           addlen(strlen(buf), &buf, &buflen);
                           rdata += 4;
                           break;
                   case 2:
                           (void) inet_ntop(AF_INET6, rdata, buf, buflen);
                           addlen(strlen(buf), &buf, &buflen);
                           rdata += 16;
                           break;
                   case 3:
                           T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
                           break;
                   }
   
                   if (rdata >= edata)
                           break;
   
                   siz = (edata-rdata)*4/3 + 4; /* "+4" accounts for trailing \0 */
                   if (siz > sizeof(base64_key) * 3/4) {
                           const char *str = "record too long to print";
                           T(addstr(str, strlen(str), &buf, &buflen));
                   } else {
                           len = b64_ntop(rdata, edata-rdata, base64_key, siz);
   
                           if (len < 0)
                                   goto formerr;
   
                           else if (len > 15) {
                                   T(addstr(" (", 2, &buf, &buflen));
                                   leader = "\n\t\t";
                                   spaced = 0;
                           }
                           else
                                   leader = " ";
   
                           for (n = 0; n < len; n += 48) {
                                   T(addstr(leader, strlen(leader),
                                            &buf, &buflen));
                                   T(addstr(base64_key + n, MIN(len - n, 48),
                                            &buf, &buflen));
                           }
                           if (len > 15)
                                   T(addstr(" )", 2, &buf, &buflen));
                   }
           }
   
           case ns_t_hip: {
                   unsigned int i, hip_len, algorithm, key_len;
                   char base64_key[NS_MD5RSA_MAX_BASE64];
                   unsigned int siz;
                   const char *leader = "\n\t\t\t\t\t";
   
                   hip_len = *rdata++;
                   algorithm = *rdata++;
                   key_len = ns_get16(rdata);
                   rdata += NS_INT16SZ;
   
                   siz = key_len*4/3 + 4; /* "+4" accounts for trailing \0 */
                   if (siz > sizeof(base64_key) * 3/4) {
                           const char *str = "record too long to print";
                           T(addstr(str, strlen(str), &buf, &buflen));
                   } else {
                           len = sprintf(tmp, "( %u ", algorithm);
                           T(addstr(tmp, len, &buf, &buflen));
   
                           for (i = 0; i < hip_len; i++) {
                                   len = sprintf(tmp, "%02X", *rdata);
                                   T(addstr(tmp, len, &buf, &buflen));
                                   rdata++;
                           }
                           T(addstr(leader, strlen(leader), &buf, &buflen));
   
                           len = b64_ntop(rdata, key_len, base64_key, siz);
                           if (len < 0)
                                   goto formerr;
   
                           T(addstr(base64_key, len, &buf, &buflen));
   
                           rdata += key_len;
                           while (rdata < edata) {
                                   T(addstr(leader, strlen(leader), &buf, &buflen));
                                   T(addname(msg, msglen, &rdata, origin,
                                             &buf, &buflen));
                           }
                           T(addstr(" )", 2, &buf, &buflen));
                   }
                   break;
           }
   
         default:          default:
                 comment = "unknown RR type";                  comment = "unknown RR type";
                 goto hexify;                  goto hexify;

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.9

CVSweb <webmaster@jp.NetBSD.org>