*/\r
\r
/*\r
- * Portions copyright (c) 1999, 2000\r
+ * Portions copyright (c) 1999, 2000 - 2014\r
* Intel Corporation.\r
* All rights reserved.\r
- * \r
+ *\r
* Redistribution and use in source and binary forms, with or without\r
* modification, are permitted provided that the following conditions\r
* are met:\r
- * \r
+ *\r
* 1. Redistributions of source code must retain the above copyright\r
* notice, this list of conditions and the following disclaimer.\r
- * \r
+ *\r
* 2. Redistributions in binary form must reproduce the above copyright\r
* notice, this list of conditions and the following disclaimer in the\r
* documentation and/or other materials provided with the distribution.\r
- * \r
+ *\r
* 3. All advertising materials mentioning features or use of this software\r
* must display the following acknowledgement:\r
- * \r
+ *\r
* This product includes software developed by Intel Corporation and\r
* its contributors.\r
- * \r
+ *\r
* 4. Neither the name of Intel Corporation or its contributors may be\r
* used to endorse or promote products derived from this software\r
* without specific prior written permission.\r
- * \r
+ *\r
* THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS''\r
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r
* THE POSSIBILITY OF SUCH DAMAGE.\r
- * \r
+ *\r
*/\r
\r
/* Import. */\r
\r
/* Forward. */\r
\r
-static size_t prune_origin(const char *name, const char *origin);\r
-static int charstr(const u_char *rdata, const u_char *edata,\r
- char **buf, size_t *buflen);\r
-static int addname(const u_char *msg, size_t msglen,\r
- const u_char **p, const char *origin,\r
- char **buf, size_t *buflen);\r
-static void addlen(size_t len, char **buf, size_t *buflen);\r
-static int addstr(const char *src, size_t len,\r
- char **buf, size_t *buflen);\r
-static int addtab(size_t len, size_t target, int spaced,\r
- char **buf, size_t *buflen);\r
+static size_t prune_origin(const char *name, const char *origin);\r
+static int charstr(const u_char *rdata, const u_char *edata,\r
+ char **buf, size_t *buflen);\r
+static int addname(const u_char *msg, size_t msglen,\r
+ const u_char **p, const char *origin,\r
+ char **buf, size_t *buflen);\r
+static void addlen(size_t len, char **buf, size_t *buflen);\r
+static int addstr(const char *src, size_t len,\r
+ char **buf, size_t *buflen);\r
+static int addtab(size_t len, size_t target, int spaced,\r
+ char **buf, size_t *buflen);\r
\r
/* Macros. */\r
\r
-#define T(x) \\r
- do { \\r
- if ((ssize_t)(x) < 0) \\r
- return (-1); \\r
- } while (0)\r
+#define T(x) \\r
+ do { \\r
+ if ((ssize_t)(x) < 0) \\r
+ return (-1); \\r
+ } while (0)\r
\r
/* Public. */\r
\r
/*\r
* int\r
* ns_sprintrr(handle, rr, name_ctx, origin, buf, buflen)\r
- * Convert an RR to presentation format.\r
+ * Convert an RR to presentation format.\r
* return:\r
- * Number of characters written to buf, or -1 (check errno).\r
+ * Number of characters written to buf, or -1 (check errno).\r
*/\r
int\r
ns_sprintrr(const ns_msg *handle, const ns_rr *rr,\r
- const char *name_ctx, const char *origin,\r
- char *buf, size_t buflen)\r
+ const char *name_ctx, const char *origin,\r
+ char *buf, size_t buflen)\r
{\r
- int n;\r
+ int n;\r
\r
- n = ns_sprintrrf(ns_msg_base(*handle), ns_msg_size(*handle),\r
- ns_rr_name(*rr), ns_rr_class(*rr), ns_rr_type(*rr),\r
- ns_rr_ttl(*rr), ns_rr_rdata(*rr), ns_rr_rdlen(*rr),\r
- name_ctx, origin, buf, buflen);\r
- return (n);\r
+ n = ns_sprintrrf(ns_msg_base(*handle), ns_msg_size(*handle),\r
+ ns_rr_name(*rr), ns_rr_class(*rr), ns_rr_type(*rr),\r
+ ns_rr_ttl(*rr), ns_rr_rdata(*rr), ns_rr_rdlen(*rr),\r
+ name_ctx, origin, buf, buflen);\r
+ return (n);\r
}\r
\r
/*\r
* int\r
* ns_sprintrrf(msg, msglen, name, class, type, ttl, rdata, rdlen,\r
- * name_ctx, origin, buf, buflen)\r
- * Convert the fields of an RR into presentation format.\r
+ * name_ctx, origin, buf, buflen)\r
+ * Convert the fields of an RR into presentation format.\r
* return:\r
- * Number of characters written to buf, or -1 (check errno).\r
+ * Number of characters written to buf, or -1 (check errno).\r
*/\r
int\r
ns_sprintrrf(const u_char *msg, size_t msglen,\r
- const char *name, ns_class class, ns_type type,\r
- u_long ttl, const u_char *rdata, size_t rdlen,\r
- const char *name_ctx, const char *origin,\r
- char *buf, size_t buflen)\r
+ const char *name, ns_class class, ns_type type,\r
+ u_long ttl, const u_char *rdata, size_t rdlen,\r
+ const char *name_ctx, const char *origin,\r
+ char *buf, size_t buflen)\r
{\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", 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 ", 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 ", 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 ", order, 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 ", priority, weight, 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
- keyflags, protocol, 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), 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 ", 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
formerr:\r
- comment = "RR format error";\r
+ comment = "RR format error";\r
hexify: {\r
- int n, m;\r
- char *p;\r
-\r
- len = SPRINTF((tmp, "\\#(\t\t; %s", comment));\r
- T(addstr(tmp, len, &buf, &buflen));\r
- while (rdata < edata) {\r
- p = tmp;\r
- p += SPRINTF((p, "\n\t"));\r
- spaced = 0;\r
- n = MIN(16, (int)(edata - rdata));\r
- for (m = 0; m < n; m++)\r
- p += SPRINTF((p, "%02x ", rdata[m]));\r
- T(addstr(tmp, (u_int)(p - tmp), &buf, &buflen));\r
- if (n < 16) {\r
- T(addstr(")", 1, &buf, &buflen));\r
- T(addtab((u_int)(p - tmp) + 1, 48, spaced, &buf, &buflen));\r
- }\r
- p = tmp;\r
- p += SPRINTF((p, "; "));\r
- for (m = 0; m < n; m++)\r
- *p++ = (isascii(rdata[m]) && isprint(rdata[m]))\r
- ? rdata[m]\r
- : '.';\r
- T(addstr(tmp, (u_int)(p - tmp), &buf, &buflen));\r
- rdata += n;\r
- }\r
- return ((int)(buf - obuf));\r
+ int n, m;\r
+ char *p;\r
+\r
+ len = SPRINTF((tmp, "\\#(\t\t; %s", comment));\r
+ T(addstr(tmp, len, &buf, &buflen));\r
+ while (rdata < edata) {\r
+ p = tmp;\r
+ p += SPRINTF((p, "\n\t"));\r
+ spaced = 0;\r
+ n = MIN(16, (int)(edata - rdata));\r
+ for (m = 0; m < n; m++)\r
+ p += SPRINTF((p, "%02x ", rdata[m]));\r
+ T(addstr(tmp, (u_int)(p - tmp), &buf, &buflen));\r
+ if (n < 16) {\r
+ T(addstr(")", 1, &buf, &buflen));\r
+ T(addtab((u_int)(p - tmp) + 1, 48, spaced, &buf, &buflen));\r
+ }\r
+ p = tmp;\r
+ p += SPRINTF((p, "; "));\r
+ for (m = 0; m < n; m++)\r
+ *p++ = (isascii(rdata[m]) && isprint(rdata[m]))\r
+ ? rdata[m]\r
+ : '.';\r
+ T(addstr(tmp, (u_int)(p - tmp), &buf, &buflen));\r
+ rdata += n;\r
+ }\r
+ return ((int)(buf - obuf));\r
}\r
}\r
\r
/*\r
* size_t\r
* prune_origin(name, origin)\r
- * Find out if the name is at or under the current origin.\r
+ * Find out if the name is at or under the current origin.\r
* return:\r
- * Number of characters in name before start of origin,\r
- * or length of name if origin does not match.\r
+ * Number of characters in name before start of origin,\r
+ * or length of name if origin does not match.\r
* notes:\r
- * This function should share code with samedomain().\r
+ * This function should share code with samedomain().\r
*/\r
static size_t\r
prune_origin(const char *name, const char *origin) {\r
- const char *oname = name;\r
-\r
- while (*name != '\0') {\r
- if (origin != NULL && strcasecmp(name, origin) == 0)\r
- return ((size_t)(name - oname) - (name > oname));\r
- while (*name != '\0') {\r
- if (*name == '\\') {\r
- name++;\r
- /* XXX need to handle \nnn form. */\r
- if (*name == '\0')\r
- break;\r
- } else if (*name == '.') {\r
- name++;\r
- break;\r
- }\r
- name++;\r
- }\r
- }\r
- return ((size_t)(name - oname));\r
+ const char *oname = name;\r
+\r
+ while (*name != '\0') {\r
+ if (origin != NULL && strcasecmp(name, origin) == 0)\r
+ return ((size_t)(name - oname) - (name > oname));\r
+ while (*name != '\0') {\r
+ if (*name == '\\') {\r
+ name++;\r
+ /* XXX need to handle \nnn form. */\r
+ if (*name == '\0')\r
+ break;\r
+ } else if (*name == '.') {\r
+ name++;\r
+ break;\r
+ }\r
+ name++;\r
+ }\r
+ }\r
+ return ((size_t)(name - oname));\r
}\r
\r
/*\r
* int\r
* charstr(rdata, edata, buf, buflen)\r
- * Format a <character-string> into the presentation buffer.\r
+ * Format a <character-string> into the presentation buffer.\r
* return:\r
- * Number of rdata octets consumed\r
- * 0 for protocol format error\r
- * -1 for output buffer error\r
+ * Number of rdata octets consumed\r
+ * 0 for protocol format error\r
+ * -1 for output buffer error\r
* side effects:\r
- * buffer is advanced on success.\r
+ * buffer is advanced on success.\r
*/\r
static int\r
charstr(const u_char *rdata, const u_char *edata, char **buf, size_t *buflen) {\r
- const u_char *odata = rdata;\r
- size_t save_buflen = *buflen;\r
- char *save_buf = *buf;\r
-\r
- if (addstr("\"", 1, buf, buflen) < 0)\r
- goto enospc;\r
- if (rdata < edata) {\r
- int n = *rdata;\r
-\r
- if (rdata + 1 + n <= edata) {\r
- rdata++;\r
- while (n-- > 0) {\r
- if (strchr("\n\"\\", *rdata) != NULL)\r
- if (addstr("\\", 1, buf, buflen) < 0)\r
- goto enospc;\r
- if (addstr((const char *)rdata, 1,\r
- buf, buflen) < 0)\r
- goto enospc;\r
- rdata++;\r
- }\r
- }\r
- }\r
- if (addstr("\"", 1, buf, buflen) < 0)\r
- goto enospc;\r
- return ((int)(rdata - odata));\r
+ const u_char *odata = rdata;\r
+ size_t save_buflen = *buflen;\r
+ char *save_buf = *buf;\r
+\r
+ if (addstr("\"", 1, buf, buflen) < 0)\r
+ goto enospc;\r
+ if (rdata < edata) {\r
+ int n = *rdata;\r
+\r
+ if (rdata + 1 + n <= edata) {\r
+ rdata++;\r
+ while (n-- > 0) {\r
+ if (strchr("\n\"\\", *rdata) != NULL)\r
+ if (addstr("\\", 1, buf, buflen) < 0)\r
+ goto enospc;\r
+ if (addstr((const char *)rdata, 1,\r
+ buf, buflen) < 0)\r
+ goto enospc;\r
+ rdata++;\r
+ }\r
+ }\r
+ }\r
+ if (addstr("\"", 1, buf, buflen) < 0)\r
+ goto enospc;\r
+ return ((int)(rdata - odata));\r
enospc:\r
- errno = ENOSPC;\r
- *buf = save_buf;\r
- *buflen = save_buflen;\r
- return (-1);\r
+ errno = ENOSPC;\r
+ *buf = save_buf;\r
+ *buflen = save_buflen;\r
+ return (-1);\r
}\r
\r
static int\r
addname(const u_char *msg, size_t msglen,\r
- const u_char **pp, const char *origin,\r
- char **buf, size_t *buflen)\r
+ const u_char **pp, const char *origin,\r
+ char **buf, size_t *buflen)\r
{\r
- size_t newlen, save_buflen = *buflen;\r
- char *save_buf = *buf;\r
- int n;\r
-\r
- n = dn_expand(msg, msg + msglen, *pp, *buf, (int)(*buflen));\r
- if (n < 0)\r
- goto enospc; /* Guess. */\r
- newlen = prune_origin(*buf, origin);\r
- if ((origin == NULL || origin[0] == '\0' || (*buf)[newlen] == '\0') &&\r
- (newlen == 0 || (*buf)[newlen - 1] != '.')) {\r
- /* No trailing dot. */\r
- if (newlen + 2 > *buflen)\r
- goto enospc; /* No room for ".\0". */\r
- (*buf)[newlen++] = '.';\r
- (*buf)[newlen] = '\0';\r
- }\r
- if (newlen == 0) {\r
- /* Use "@" instead of name. */\r
- if (newlen + 2 > *buflen)\r
- goto enospc; /* No room for "@\0". */\r
- (*buf)[newlen++] = '@';\r
- (*buf)[newlen] = '\0';\r
- }\r
- *pp += n;\r
- addlen(newlen, buf, buflen);\r
- **buf = '\0';\r
- return ((int)newlen);\r
+ size_t newlen, save_buflen = *buflen;\r
+ char *save_buf = *buf;\r
+ int n;\r
+\r
+ n = dn_expand(msg, msg + msglen, *pp, *buf, (int)(*buflen));\r
+ if (n < 0)\r
+ goto enospc; /* Guess. */\r
+ newlen = prune_origin(*buf, origin);\r
+ if ((origin == NULL || origin[0] == '\0' || (*buf)[newlen] == '\0') &&\r
+ (newlen == 0 || (*buf)[newlen - 1] != '.')) {\r
+ /* No trailing dot. */\r
+ if (newlen + 2 > *buflen)\r
+ goto enospc; /* No room for ".\0". */\r
+ (*buf)[newlen++] = '.';\r
+ (*buf)[newlen] = '\0';\r
+ }\r
+ if (newlen == 0) {\r
+ /* Use "@" instead of name. */\r
+ if (newlen + 2 > *buflen)\r
+ goto enospc; /* No room for "@\0". */\r
+ (*buf)[newlen++] = '@';\r
+ (*buf)[newlen] = '\0';\r
+ }\r
+ *pp += n;\r
+ addlen(newlen, buf, buflen);\r
+ **buf = '\0';\r
+ return ((int)newlen);\r
enospc:\r
- errno = ENOSPC;\r
- *buf = save_buf;\r
- *buflen = save_buflen;\r
- return (-1);\r
+ errno = ENOSPC;\r
+ *buf = save_buf;\r
+ *buflen = save_buflen;\r
+ return (-1);\r
}\r
\r
static void\r
addlen(size_t len, char **buf, size_t *buflen) {\r
- assert(len <= *buflen);\r
- *buf += len;\r
- *buflen -= len;\r
+ assert(len <= *buflen);\r
+ *buf += len;\r
+ *buflen -= len;\r
}\r
\r
static int\r
addstr(const char *src, size_t len, char **buf, size_t *buflen) {\r
- if (len > *buflen) {\r
- errno = ENOSPC;\r
- return (-1);\r
- }\r
- memcpy(*buf, src, len);\r
- addlen(len, buf, buflen);\r
- **buf = '\0';\r
- return (0);\r
+ if (len > *buflen) {\r
+ errno = ENOSPC;\r
+ return (-1);\r
+ }\r
+ memcpy(*buf, src, len);\r
+ addlen(len, buf, buflen);\r
+ **buf = '\0';\r
+ return (0);\r
}\r
\r
static int\r
addtab(size_t len, size_t target, int spaced, char **buf, size_t *buflen) {\r
- size_t save_buflen = *buflen;\r
- char *save_buf = *buf;\r
- int t;\r
-\r
- if (spaced || len >= target - 1) {\r
- T(addstr(" ", 2, buf, buflen));\r
- spaced = 1;\r
- } else {\r
- for (t = (int)(target - len - 1) / 8; t >= 0; t--)\r
- if (addstr("\t", 1, buf, buflen) < 0) {\r
- *buflen = save_buflen;\r
- *buf = save_buf;\r
- return (-1);\r
- }\r
- spaced = 0;\r
- }\r
- return (spaced);\r
+ size_t save_buflen = *buflen;\r
+ char *save_buf = *buf;\r
+ int t;\r
+\r
+ if (spaced || len >= target - 1) {\r
+ T(addstr(" ", 2, buf, buflen));\r
+ spaced = 1;\r
+ } else {\r
+ for (t = (int)(target - len - 1) / 8; t >= 0; t--)\r
+ if (addstr("\t", 1, buf, buflen) < 0) {\r
+ *buflen = save_buflen;\r
+ *buf = save_buf;\r
+ return (-1);\r
+ }\r
+ spaced = 0;\r
+ }\r
+ return (spaced);\r
}\r