- const char *obuf = buf;\r
- const u_char *edata = rdata + rdlen;\r
- int spaced = 0;\r
-\r
- const char *comment;\r
- char tmp[100];\r
- int x;\r
- size_t len;\r
-\r
- static char base64_key[NS_MD5RSA_MAX_BASE64];\r
- static char t[255*3];\r
-\r
- /*\r
- * Owner.\r
- */\r
- if (name_ctx != NULL && strcasecmp(name_ctx, name) == 0) {\r
- T(addstr("\t\t\t", 3, &buf, &buflen));\r
- } else {\r
- len = prune_origin(name, origin);\r
- if (len == 0) {\r
- T(addstr("@\t\t\t", 4, &buf, &buflen));\r
- } else {\r
- T(addstr(name, len, &buf, &buflen));\r
- /* Origin not used and no trailing dot? */\r
- if ((!origin || !origin[0] || name[len] == '\0') &&\r
- name[len - 1] != '.') {\r
- T(addstr(".", 1, &buf, &buflen));\r
- len++;\r
- }\r
- T(spaced = addtab(len, 24, spaced, &buf, &buflen));\r
- }\r
- }\r
-\r
- /*\r
- * TTL, Class, Type.\r
- */\r
- T(x = ns_format_ttl(ttl, buf, buflen));\r
- addlen(x, &buf, &buflen);\r
- len = SPRINTF((tmp, " %s %s", p_class(class), p_type(type)));\r
- T(addstr(tmp, len, &buf, &buflen));\r
- T(spaced = addtab(x + len, 16, spaced, &buf, &buflen));\r
-\r
- /*\r
- * RData.\r
- */\r
- switch (type) {\r
- case ns_t_a:\r
- if (rdlen != NS_INADDRSZ)\r
- goto formerr;\r
- (void) inet_ntop(AF_INET, rdata, buf, (socklen_t)buflen);\r
- addlen(strlen(buf), &buf, &buflen);\r
- break;\r
-\r
- case ns_t_cname:\r
- case ns_t_mb:\r
- case ns_t_mg:\r
- case ns_t_mr:\r
- case ns_t_ns:\r
- case ns_t_ptr:\r
- T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
- break;\r
-\r
- case ns_t_hinfo:\r
- case ns_t_isdn:\r
- /* First word. */\r
- T(len = charstr(rdata, edata, &buf, &buflen));\r
- if (len == 0)\r
- goto formerr;\r
- rdata += len;\r
- T(addstr(" ", 1, &buf, &buflen));\r
-\r
- /* Second word. */\r
- T(len = charstr(rdata, edata, &buf, &buflen));\r
- if (len == 0)\r
- goto formerr;\r
- rdata += len;\r
- break;\r
-\r
- case ns_t_soa: {\r
- u_long t;\r
-\r
- /* Server name. */\r
- T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
- T(addstr(" ", 1, &buf, &buflen));\r
-\r
- /* Administrator name. */\r
- T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
- T(addstr(" (\n", 3, &buf, &buflen));\r
- spaced = 0;\r
-\r
- if ((edata - rdata) != 5*NS_INT32SZ)\r
- goto formerr;\r
-\r
- /* Serial number. */\r
- t = ns_get32(rdata); rdata += NS_INT32SZ;\r
- T(addstr("\t\t\t\t\t", 5, &buf, &buflen));\r
- len = SPRINTF((tmp, "%Lu", t));\r
- T(addstr(tmp, len, &buf, &buflen));\r
- T(spaced = addtab(len, 16, spaced, &buf, &buflen));\r
- T(addstr("; serial\n", 9, &buf, &buflen));\r
- spaced = 0;\r
-\r
- /* Refresh interval. */\r
- t = ns_get32(rdata); rdata += NS_INT32SZ;\r
- T(addstr("\t\t\t\t\t", 5, &buf, &buflen));\r
- T(len = ns_format_ttl(t, buf, buflen));\r
- addlen(len, &buf, &buflen);\r
- T(spaced = addtab(len, 16, spaced, &buf, &buflen));\r
- T(addstr("; refresh\n", 10, &buf, &buflen));\r
- spaced = 0;\r
-\r
- /* Retry interval. */\r
- t = ns_get32(rdata); rdata += NS_INT32SZ;\r
- T(addstr("\t\t\t\t\t", 5, &buf, &buflen));\r
- T(len = ns_format_ttl(t, buf, buflen));\r
- addlen(len, &buf, &buflen);\r
- T(spaced = addtab(len, 16, spaced, &buf, &buflen));\r
- T(addstr("; retry\n", 8, &buf, &buflen));\r
- spaced = 0;\r
-\r
- /* Expiry. */\r
- t = ns_get32(rdata); rdata += NS_INT32SZ;\r
- T(addstr("\t\t\t\t\t", 5, &buf, &buflen));\r
- T(len = ns_format_ttl(t, buf, buflen));\r
- addlen(len, &buf, &buflen);\r
- T(spaced = addtab(len, 16, spaced, &buf, &buflen));\r
- T(addstr("; expiry\n", 9, &buf, &buflen));\r
- spaced = 0;\r
-\r
- /* Minimum TTL. */\r
- t = ns_get32(rdata); rdata += NS_INT32SZ;\r
- T(addstr("\t\t\t\t\t", 5, &buf, &buflen));\r
- T(len = ns_format_ttl(t, buf, buflen));\r
- addlen(len, &buf, &buflen);\r
- T(addstr(" )", 2, &buf, &buflen));\r
- T(spaced = addtab(len, 16, spaced, &buf, &buflen));\r
- T(addstr("; minimum\n", 10, &buf, &buflen));\r
-\r
- break;\r
- }\r
-\r
- case ns_t_mx:\r
- case ns_t_afsdb:\r
- case ns_t_rt: {\r
- u_int t;\r
-\r
- if (rdlen < NS_INT16SZ)\r
- goto formerr;\r
-\r
- /* Priority. */\r
- t = ns_get16(rdata);\r
- rdata += NS_INT16SZ;\r
- len = SPRINTF((tmp, "%u ", (unsigned int)t));\r
- T(addstr(tmp, len, &buf, &buflen));\r
-\r
- /* Target. */\r
- T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
-\r
- break;\r
- }\r
-\r
- case ns_t_px: {\r
- u_int t;\r
-\r
- if (rdlen < NS_INT16SZ)\r
- goto formerr;\r
-\r
- /* Priority. */\r
- t = ns_get16(rdata);\r
- rdata += NS_INT16SZ;\r
- len = SPRINTF((tmp, "%u ", (unsigned int)t));\r
- T(addstr(tmp, len, &buf, &buflen));\r
-\r
- /* Name1. */\r
- T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
- T(addstr(" ", 1, &buf, &buflen));\r
-\r
- /* Name2. */\r
- T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
-\r
- break;\r
- }\r
-\r
- case ns_t_x25:\r
- T(len = charstr(rdata, edata, &buf, &buflen));\r
- if (len == 0)\r
- goto formerr;\r
- rdata += len;\r
- break;\r
-\r
- case ns_t_txt:\r
- while (rdata < edata) {\r
- T(len = charstr(rdata, edata, &buf, &buflen));\r
- if (len == 0)\r
- goto formerr;\r
- rdata += len;\r
- if (rdata < edata)\r
- T(addstr(" ", 1, &buf, &buflen));\r
- }\r
- break;\r
-\r
- case ns_t_nsap: {\r
-\r
- (void) inet_nsap_ntoa((int)rdlen, rdata, t);\r
- T(addstr(t, strlen(t), &buf, &buflen));\r
- break;\r
- }\r
-\r
- case ns_t_aaaa:\r
- if (rdlen != NS_IN6ADDRSZ)\r
- goto formerr;\r
- (void) inet_ntop(AF_INET6, rdata, buf, (socklen_t)buflen);\r
- addlen(strlen(buf), &buf, &buflen);\r
- break;\r
-\r
- case ns_t_loc: {\r
- /* XXX protocol format checking? */\r
- (void) loc_ntoa(rdata, t);\r
- T(addstr(t, strlen(t), &buf, &buflen));\r
- break;\r
- }\r
-\r
- case ns_t_naptr: {\r
- u_int order, preference;\r
-\r
- if (rdlen < 2*NS_INT16SZ)\r
- goto formerr;\r
-\r
- /* Order, Precedence. */\r
- order = ns_get16(rdata); rdata += NS_INT16SZ;\r
- preference = ns_get16(rdata); rdata += NS_INT16SZ;\r
- len = SPRINTF((t, "%u %u ", (unsigned int)order, (unsigned int)preference));\r
- T(addstr(t, len, &buf, &buflen));\r
-\r
- /* Flags. */\r
- T(len = charstr(rdata, edata, &buf, &buflen));\r
- if (len == 0)\r
- goto formerr;\r
- rdata += len;\r
- T(addstr(" ", 1, &buf, &buflen));\r
-\r
- /* Service. */\r
- T(len = charstr(rdata, edata, &buf, &buflen));\r
- if (len == 0)\r
- goto formerr;\r
- rdata += len;\r
- T(addstr(" ", 1, &buf, &buflen));\r
-\r
- /* Regexp. */\r
- T(len = charstr(rdata, edata, &buf, &buflen));\r
- if ((ssize_t)len < 0)\r
- return (-1);\r
- if (len == 0)\r
- goto formerr;\r
- rdata += len;\r
- T(addstr(" ", 1, &buf, &buflen));\r
-\r
- /* Server. */\r
- T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
- break;\r
- }\r
-\r
- case ns_t_srv: {\r
- u_int priority, weight, port;\r
-\r
- if (rdlen < NS_INT16SZ*3)\r
- goto formerr;\r
-\r
- /* Priority, Weight, Port. */\r
- priority = ns_get16(rdata); rdata += NS_INT16SZ;\r
- weight = ns_get16(rdata); rdata += NS_INT16SZ;\r
- port = ns_get16(rdata); rdata += NS_INT16SZ;\r
- len = SPRINTF((t, "%u %u %u ", (unsigned int)priority, (unsigned int)weight, (unsigned int)port));\r
- T(addstr(t, len, &buf, &buflen));\r
-\r
- /* Server. */\r
- T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
- break;\r
- }\r
-\r
- case ns_t_minfo:\r
- case ns_t_rp:\r
- /* Name1. */\r
- T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
- T(addstr(" ", 1, &buf, &buflen));\r
-\r
- /* Name2. */\r
- T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
-\r
- break;\r
-\r
- case ns_t_wks: {\r
- int n, lcnt;\r
-\r
- if (rdlen < NS_INT32SZ + 1)\r
- goto formerr;\r
-\r
- /* Address. */\r
- (void) inet_ntop(AF_INET, rdata, buf, (socklen_t)buflen);\r
- addlen(strlen(buf), &buf, &buflen);\r
- rdata += NS_INADDRSZ;\r
-\r
- /* Protocol. */\r
- len = SPRINTF((tmp, " %u ( ", *rdata));\r
- T(addstr(tmp, len, &buf, &buflen));\r
- rdata += NS_INT8SZ;\r
-\r
- /* Bit map. */\r
- n = 0;\r
- lcnt = 0;\r
- while (rdata < edata) {\r
- u_int c = *rdata++;\r
- do {\r
- if (c & 0200) {\r
- if (lcnt == 0) {\r
- T(addstr("\n\t\t\t\t", 5,\r
- &buf, &buflen));\r
- lcnt = 10;\r
- spaced = 0;\r
- }\r
- len = SPRINTF((tmp, "%d ", n));\r
- T(addstr(tmp, len, &buf, &buflen));\r
- lcnt--;\r
- }\r
- c <<= 1;\r
- } while (++n & 07);\r
- }\r
- T(addstr(")", 1, &buf, &buflen));\r
-\r
- break;\r
- }\r
-\r
- case ns_t_key: {\r
- u_int keyflags, protocol, algorithm;\r
- const char *leader;\r
- int n;\r
-\r
- if (rdlen < NS_INT16SZ + NS_INT8SZ + NS_INT8SZ)\r
- goto formerr;\r
-\r
- /* Key flags, Protocol, Algorithm. */\r
- keyflags = ns_get16(rdata); rdata += NS_INT16SZ;\r
- protocol = *rdata++;\r
- algorithm = *rdata++;\r
- len = SPRINTF((tmp, "0x%04x %u %u",\r
- (unsigned int)keyflags, (unsigned int)protocol, (unsigned int)algorithm));\r
- T(addstr(tmp, len, &buf, &buflen));\r
-\r
- /* Public key data. */\r
- len = b64_ntop(rdata, edata - rdata,\r
- base64_key, sizeof base64_key);\r
- if ((ssize_t)len < 0)\r
- goto formerr;\r
- if (len > 15) {\r
- T(addstr(" (", 2, &buf, &buflen));\r
- leader = "\n\t\t";\r
- spaced = 0;\r
- } else\r
- leader = " ";\r
- for (n = 0; n < (int)len; n += 48) {\r
- T(addstr(leader, strlen(leader), &buf, &buflen));\r
- T(addstr(base64_key + n, MIN(len - n, 48),\r
- &buf, &buflen));\r
- }\r
- if (len > 15)\r
- T(addstr(" )", 2, &buf, &buflen));\r
-\r
- break;\r
- }\r
-\r
- case ns_t_sig: {\r
- u_int type, algorithm, labels, footprint;\r
- const char *leader;\r
- u_long t;\r
- int n;\r
-\r
- if (rdlen < 22)\r
- goto formerr;\r
-\r
- /* Type covered, Algorithm, Label count, Original TTL. */\r
- type = ns_get16(rdata); rdata += NS_INT16SZ;\r
- algorithm = *rdata++;\r
- labels = *rdata++;\r
- t = ns_get32(rdata); rdata += NS_INT32SZ;\r
- len = SPRINTF((tmp, " %s %d %Lu ",\r
- p_type((int)type), (int)algorithm, t));\r
- T(addstr(tmp, len, &buf, &buflen));\r
- if (labels != (u_int)dn_count_labels(name))\r
- goto formerr;\r
-\r
- /* Signature expiry. */\r
- t = ns_get32(rdata); rdata += NS_INT32SZ;\r
- len = SPRINTF((tmp, "%s ", p_secstodate(t)));\r
- T(addstr(tmp, len, &buf, &buflen));\r
-\r
- /* Time signed. */\r
- t = ns_get32(rdata); rdata += NS_INT32SZ;\r
- len = SPRINTF((tmp, "%s ", p_secstodate(t)));\r
- T(addstr(tmp, len, &buf, &buflen));\r
-\r
- /* Signature Footprint. */\r
- footprint = ns_get16(rdata); rdata += NS_INT16SZ;\r
- len = SPRINTF((tmp, "%u ", (unsigned int)footprint));\r
- T(addstr(tmp, len, &buf, &buflen));\r
-\r
- /* Signer's name. */\r
- T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
-\r
- /* Signature. */\r
- len = b64_ntop(rdata, edata - rdata,\r
- base64_key, sizeof base64_key);\r
- if (len > 15) {\r
- T(addstr(" (", 2, &buf, &buflen));\r
- leader = "\n\t\t";\r
- spaced = 0;\r
- } else\r
- leader = " ";\r
- if ((ssize_t)len < 0)\r
- goto formerr;\r
- for (n = 0; n < (int)len; n += 48) {\r
- T(addstr(leader, strlen(leader), &buf, &buflen));\r
- T(addstr(base64_key + n, MIN(len - n, 48),\r
- &buf, &buflen));\r
- }\r
- if (len > 15)\r
- T(addstr(" )", 2, &buf, &buflen));\r
-\r
- break;\r
- }\r
-\r
- case ns_t_nxt: {\r
- int n, c;\r
-\r
- /* Next domain name. */\r
- T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
-\r
- /* Type bit map. */\r
- n = (int)(edata - rdata);\r
- for (c = 0; c < n*8; c++)\r
- if (NS_NXT_BIT_ISSET(c, rdata)) {\r
- len = SPRINTF((tmp, " %s", p_type(c)));\r
- T(addstr(tmp, len, &buf, &buflen));\r
- }\r
- break;\r
- }\r
-\r
- default:\r
- comment = "unknown RR type";\r
- goto hexify;\r
- }\r
- return ((int)(buf - obuf));\r
+ const char *obuf = buf;\r
+ const u_char *edata = rdata + rdlen;\r
+ int spaced = 0;\r
+\r
+ const char *comment;\r
+ char tmp[100];\r
+ int x;\r
+ size_t len;\r
+\r
+ static char base64_key[NS_MD5RSA_MAX_BASE64];\r
+ static char t[255*3];\r
+\r
+ /*\r
+ * Owner.\r
+ */\r
+ if (name_ctx != NULL && strcasecmp(name_ctx, name) == 0) {\r
+ T(addstr("\t\t\t", 3, &buf, &buflen));\r
+ } else {\r
+ len = prune_origin(name, origin);\r
+ if (len == 0) {\r
+ T(addstr("@\t\t\t", 4, &buf, &buflen));\r
+ } else {\r
+ T(addstr(name, len, &buf, &buflen));\r
+ /* Origin not used and no trailing dot? */\r
+ if ((!origin || !origin[0] || name[len] == '\0') &&\r
+ name[len - 1] != '.') {\r
+ T(addstr(".", 1, &buf, &buflen));\r
+ len++;\r
+ }\r
+ T(spaced = addtab(len, 24, spaced, &buf, &buflen));\r
+ }\r
+ }\r
+\r
+ /*\r
+ * TTL, Class, Type.\r
+ */\r
+ T(x = ns_format_ttl(ttl, buf, buflen));\r
+ addlen(x, &buf, &buflen);\r
+ len = SPRINTF((tmp, " %s %s", p_class(class), p_type(type)));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+ T(spaced = addtab(x + len, 16, spaced, &buf, &buflen));\r
+\r
+ /*\r
+ * RData.\r
+ */\r
+ switch (type) {\r
+ case ns_t_a:\r
+ if (rdlen != NS_INADDRSZ)\r
+ goto formerr;\r
+ (void) inet_ntop(AF_INET, rdata, buf, (socklen_t)buflen);\r
+ addlen(strlen(buf), &buf, &buflen);\r
+ break;\r
+\r
+ case ns_t_cname:\r
+ case ns_t_mb:\r
+ case ns_t_mg:\r
+ case ns_t_mr:\r
+ case ns_t_ns:\r
+ case ns_t_ptr:\r
+ T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
+ break;\r
+\r
+ case ns_t_hinfo:\r
+ case ns_t_isdn:\r
+ /* First word. */\r
+ T(len = charstr(rdata, edata, &buf, &buflen));\r
+ if (len == 0)\r
+ goto formerr;\r
+ rdata += len;\r
+ T(addstr(" ", 1, &buf, &buflen));\r
+\r
+ /* Second word. */\r
+ T(len = charstr(rdata, edata, &buf, &buflen));\r
+ if (len == 0)\r
+ goto formerr;\r
+ rdata += len;\r
+ break;\r
+\r
+ case ns_t_soa: {\r
+ u_long t;\r
+\r
+ /* Server name. */\r
+ T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
+ T(addstr(" ", 1, &buf, &buflen));\r
+\r
+ /* Administrator name. */\r
+ T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
+ T(addstr(" (\n", 3, &buf, &buflen));\r
+ spaced = 0;\r
+\r
+ if ((edata - rdata) != 5*NS_INT32SZ)\r
+ goto formerr;\r
+\r
+ /* Serial number. */\r
+ t = ns_get32(rdata); rdata += NS_INT32SZ;\r
+ T(addstr("\t\t\t\t\t", 5, &buf, &buflen));\r
+ len = SPRINTF((tmp, "%lu", (unsigned long)t));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+ T(spaced = addtab(len, 16, spaced, &buf, &buflen));\r
+ T(addstr("; serial\n", 9, &buf, &buflen));\r
+ spaced = 0;\r
+\r
+ /* Refresh interval. */\r
+ t = ns_get32(rdata); rdata += NS_INT32SZ;\r
+ T(addstr("\t\t\t\t\t", 5, &buf, &buflen));\r
+ T(len = ns_format_ttl(t, buf, buflen));\r
+ addlen(len, &buf, &buflen);\r
+ T(spaced = addtab(len, 16, spaced, &buf, &buflen));\r
+ T(addstr("; refresh\n", 10, &buf, &buflen));\r
+ spaced = 0;\r
+\r
+ /* Retry interval. */\r
+ t = ns_get32(rdata); rdata += NS_INT32SZ;\r
+ T(addstr("\t\t\t\t\t", 5, &buf, &buflen));\r
+ T(len = ns_format_ttl(t, buf, buflen));\r
+ addlen(len, &buf, &buflen);\r
+ T(spaced = addtab(len, 16, spaced, &buf, &buflen));\r
+ T(addstr("; retry\n", 8, &buf, &buflen));\r
+ spaced = 0;\r
+\r
+ /* Expiry. */\r
+ t = ns_get32(rdata); rdata += NS_INT32SZ;\r
+ T(addstr("\t\t\t\t\t", 5, &buf, &buflen));\r
+ T(len = ns_format_ttl(t, buf, buflen));\r
+ addlen(len, &buf, &buflen);\r
+ T(spaced = addtab(len, 16, spaced, &buf, &buflen));\r
+ T(addstr("; expiry\n", 9, &buf, &buflen));\r
+ spaced = 0;\r
+\r
+ /* Minimum TTL. */\r
+ t = ns_get32(rdata); rdata += NS_INT32SZ;\r
+ T(addstr("\t\t\t\t\t", 5, &buf, &buflen));\r
+ T(len = ns_format_ttl(t, buf, buflen));\r
+ addlen(len, &buf, &buflen);\r
+ T(addstr(" )", 2, &buf, &buflen));\r
+ T(spaced = addtab(len, 16, spaced, &buf, &buflen));\r
+ T(addstr("; minimum\n", 10, &buf, &buflen));\r
+\r
+ break;\r
+ }\r
+\r
+ case ns_t_mx:\r
+ case ns_t_afsdb:\r
+ case ns_t_rt: {\r
+ u_int t;\r
+\r
+ if (rdlen < NS_INT16SZ)\r
+ goto formerr;\r
+\r
+ /* Priority. */\r
+ t = ns_get16(rdata);\r
+ rdata += NS_INT16SZ;\r
+ len = SPRINTF((tmp, "%u ", (unsigned int)t));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+\r
+ /* Target. */\r
+ T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
+\r
+ break;\r
+ }\r
+\r
+ case ns_t_px: {\r
+ u_int t;\r
+\r
+ if (rdlen < NS_INT16SZ)\r
+ goto formerr;\r
+\r
+ /* Priority. */\r
+ t = ns_get16(rdata);\r
+ rdata += NS_INT16SZ;\r
+ len = SPRINTF((tmp, "%u ", (unsigned int)t));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+\r
+ /* Name1. */\r
+ T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
+ T(addstr(" ", 1, &buf, &buflen));\r
+\r
+ /* Name2. */\r
+ T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
+\r
+ break;\r
+ }\r
+\r
+ case ns_t_x25:\r
+ T(len = charstr(rdata, edata, &buf, &buflen));\r
+ if (len == 0)\r
+ goto formerr;\r
+ rdata += len;\r
+ break;\r
+\r
+ case ns_t_txt:\r
+ while (rdata < edata) {\r
+ T(len = charstr(rdata, edata, &buf, &buflen));\r
+ if (len == 0)\r
+ goto formerr;\r
+ rdata += len;\r
+ if (rdata < edata)\r
+ T(addstr(" ", 1, &buf, &buflen));\r
+ }\r
+ break;\r
+\r
+ case ns_t_nsap: {\r
+\r
+ (void) inet_nsap_ntoa((int)rdlen, rdata, t);\r
+ T(addstr(t, strlen(t), &buf, &buflen));\r
+ break;\r
+ }\r
+\r
+ case ns_t_aaaa:\r
+ if (rdlen != NS_IN6ADDRSZ)\r
+ goto formerr;\r
+ (void) inet_ntop(AF_INET6, rdata, buf, (socklen_t)buflen);\r
+ addlen(strlen(buf), &buf, &buflen);\r
+ break;\r
+\r
+ case ns_t_loc: {\r
+ /* XXX protocol format checking? */\r
+ (void) loc_ntoa(rdata, t);\r
+ T(addstr(t, strlen(t), &buf, &buflen));\r
+ break;\r
+ }\r
+\r
+ case ns_t_naptr: {\r
+ u_int order, preference;\r
+\r
+ if (rdlen < 2*NS_INT16SZ)\r
+ goto formerr;\r
+\r
+ /* Order, Precedence. */\r
+ order = ns_get16(rdata); rdata += NS_INT16SZ;\r
+ preference = ns_get16(rdata); rdata += NS_INT16SZ;\r
+ len = SPRINTF((t, "%u %u ", (unsigned int)order, (unsigned int)preference));\r
+ T(addstr(t, len, &buf, &buflen));\r
+\r
+ /* Flags. */\r
+ T(len = charstr(rdata, edata, &buf, &buflen));\r
+ if (len == 0)\r
+ goto formerr;\r
+ rdata += len;\r
+ T(addstr(" ", 1, &buf, &buflen));\r
+\r
+ /* Service. */\r
+ T(len = charstr(rdata, edata, &buf, &buflen));\r
+ if (len == 0)\r
+ goto formerr;\r
+ rdata += len;\r
+ T(addstr(" ", 1, &buf, &buflen));\r
+\r
+ /* Regexp. */\r
+ T(len = charstr(rdata, edata, &buf, &buflen));\r
+ if ((ssize_t)len < 0)\r
+ return (-1);\r
+ if (len == 0)\r
+ goto formerr;\r
+ rdata += len;\r
+ T(addstr(" ", 1, &buf, &buflen));\r
+\r
+ /* Server. */\r
+ T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
+ break;\r
+ }\r
+\r
+ case ns_t_srv: {\r
+ u_int priority, weight, port;\r
+\r
+ if (rdlen < NS_INT16SZ*3)\r
+ goto formerr;\r
+\r
+ /* Priority, Weight, Port. */\r
+ priority = ns_get16(rdata); rdata += NS_INT16SZ;\r
+ weight = ns_get16(rdata); rdata += NS_INT16SZ;\r
+ port = ns_get16(rdata); rdata += NS_INT16SZ;\r
+ len = SPRINTF((t, "%u %u %u ", (unsigned int)priority, (unsigned int)weight, (unsigned int)port));\r
+ T(addstr(t, len, &buf, &buflen));\r
+\r
+ /* Server. */\r
+ T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
+ break;\r
+ }\r
+\r
+ case ns_t_minfo:\r
+ case ns_t_rp:\r
+ /* Name1. */\r
+ T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
+ T(addstr(" ", 1, &buf, &buflen));\r
+\r
+ /* Name2. */\r
+ T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
+\r
+ break;\r
+\r
+ case ns_t_wks: {\r
+ int n, lcnt;\r
+\r
+ if (rdlen < NS_INT32SZ + 1)\r
+ goto formerr;\r
+\r
+ /* Address. */\r
+ (void) inet_ntop(AF_INET, rdata, buf, (socklen_t)buflen);\r
+ addlen(strlen(buf), &buf, &buflen);\r
+ rdata += NS_INADDRSZ;\r
+\r
+ /* Protocol. */\r
+ len = SPRINTF((tmp, " %u ( ", (unsigned int)*rdata));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+ rdata += NS_INT8SZ;\r
+\r
+ /* Bit map. */\r
+ n = 0;\r
+ lcnt = 0;\r
+ while (rdata < edata) {\r
+ u_int c = *rdata++;\r
+ do {\r
+ if (c & 0200) {\r
+ if (lcnt == 0) {\r
+ T(addstr("\n\t\t\t\t", 5,\r
+ &buf, &buflen));\r
+ lcnt = 10;\r
+ spaced = 0;\r
+ }\r
+ len = SPRINTF((tmp, "%d ", n));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+ lcnt--;\r
+ }\r
+ c <<= 1;\r
+ } while (++n & 07);\r
+ }\r
+ T(addstr(")", 1, &buf, &buflen));\r
+\r
+ break;\r
+ }\r
+\r
+ case ns_t_key: {\r
+ u_int keyflags, protocol, algorithm;\r
+ const char *leader;\r
+ int n;\r
+\r
+ if (rdlen < NS_INT16SZ + NS_INT8SZ + NS_INT8SZ)\r
+ goto formerr;\r
+\r
+ /* Key flags, Protocol, Algorithm. */\r
+ keyflags = ns_get16(rdata); rdata += NS_INT16SZ;\r
+ protocol = *rdata++;\r
+ algorithm = *rdata++;\r
+ len = SPRINTF((tmp, "0x%04x %u %u",\r
+ (unsigned int)keyflags, (unsigned int)protocol, (unsigned int)algorithm));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+\r
+ /* Public key data. */\r
+ len = b64_ntop(rdata, edata - rdata,\r
+ base64_key, sizeof base64_key);\r
+ if ((ssize_t)len < 0)\r
+ goto formerr;\r
+ if (len > 15) {\r
+ T(addstr(" (", 2, &buf, &buflen));\r
+ leader = "\n\t\t";\r
+ spaced = 0;\r
+ } else\r
+ leader = " ";\r
+ for (n = 0; n < (int)len; n += 48) {\r
+ T(addstr(leader, strlen(leader), &buf, &buflen));\r
+ T(addstr(base64_key + n, MIN(len - n, 48),\r
+ &buf, &buflen));\r
+ }\r
+ if (len > 15)\r
+ T(addstr(" )", 2, &buf, &buflen));\r
+\r
+ break;\r
+ }\r
+\r
+ case ns_t_sig: {\r
+ u_int type, algorithm, labels, footprint;\r
+ const char *leader;\r
+ u_long t;\r
+ int n;\r
+\r
+ if (rdlen < 22)\r
+ goto formerr;\r
+\r
+ /* Type covered, Algorithm, Label count, Original TTL. */\r
+ type = ns_get16(rdata); rdata += NS_INT16SZ;\r
+ algorithm = *rdata++;\r
+ labels = *rdata++;\r
+ t = ns_get32(rdata); rdata += NS_INT32SZ;\r
+ len = SPRINTF((tmp, " %s %d %lu ",\r
+ p_type((int)type), (int)algorithm, (unsigned long)t));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+ if (labels != (u_int)dn_count_labels(name))\r
+ goto formerr;\r
+\r
+ /* Signature expiry. */\r
+ t = ns_get32(rdata); rdata += NS_INT32SZ;\r
+ len = SPRINTF((tmp, "%s ", p_secstodate(t)));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+\r
+ /* Time signed. */\r
+ t = ns_get32(rdata); rdata += NS_INT32SZ;\r
+ len = SPRINTF((tmp, "%s ", p_secstodate(t)));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+\r
+ /* Signature Footprint. */\r
+ footprint = ns_get16(rdata); rdata += NS_INT16SZ;\r
+ len = SPRINTF((tmp, "%u ", (unsigned int)footprint));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+\r
+ /* Signer's name. */\r
+ T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
+\r
+ /* Signature. */\r
+ len = b64_ntop(rdata, edata - rdata,\r
+ base64_key, sizeof base64_key);\r
+ if (len > 15) {\r
+ T(addstr(" (", 2, &buf, &buflen));\r
+ leader = "\n\t\t";\r
+ spaced = 0;\r
+ } else\r
+ leader = " ";\r
+ if ((ssize_t)len < 0)\r
+ goto formerr;\r
+ for (n = 0; n < (int)len; n += 48) {\r
+ T(addstr(leader, strlen(leader), &buf, &buflen));\r
+ T(addstr(base64_key + n, MIN(len - n, 48),\r
+ &buf, &buflen));\r
+ }\r
+ if (len > 15)\r
+ T(addstr(" )", 2, &buf, &buflen));\r
+\r
+ break;\r
+ }\r
+\r
+ case ns_t_nxt: {\r
+ int n, c;\r
+\r
+ /* Next domain name. */\r
+ T(addname(msg, msglen, &rdata, origin, &buf, &buflen));\r
+\r
+ /* Type bit map. */\r
+ n = (int)(edata - rdata);\r
+ for (c = 0; c < n*8; c++)\r
+ if (NS_NXT_BIT_ISSET(c, rdata)) {\r
+ len = SPRINTF((tmp, " %s", p_type(c)));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+ }\r
+ break;\r
+ }\r
+\r
+ default:\r
+ comment = "unknown RR type";\r
+ goto hexify;\r
+ }\r
+ return ((int)(buf - obuf));\r