26#include <netinet/in.h>
27#include <sys/socket.h>
38static const char digits[] =
"0123456789";
43static int printable(
int);
44static int dn_find(
const u_char *,
const u_char *,
45 const u_char *
const *,
46 const u_char *
const *);
70 while ((n = *srcp++) != 0) {
72 if (srcp + n >= eom) {
103 while ((n = *cp++) != 0) {
120 for ((
void)NULL; n > 0; n--) {
129 }
else if (!printable(c)) {
135 *dn++ = digits[c / 100];
136 *dn++ = digits[(c % 100) / 10];
137 *dn++ = digits[c % 10];
175 u_char *label, *bp, *eom;
184 while ((c = *src++) != 0) {
186 if ((cp = strchr(digits, c)) != NULL) {
187 n = (cp - digits) * 100;
188 if ((c = *src++) == 0 ||
189 (cp = strchr(digits, c)) == NULL) {
193 n += (cp - digits) * 10;
194 if ((c = *src++) == 0 ||
195 (cp = strchr(digits, c)) == NULL) {
207 }
else if (c ==
'\\') {
210 }
else if (c ==
'.') {
211 c = (bp - label - 1);
236 if (c == 0 || *src ==
'.') {
249 c = (bp - label - 1);
297 while ((n = *cp++) != 0) {
308 for ((
void)NULL; n > 0; n--) {
328 u_char *dst,
size_t dstsiz)
330 const u_char *srcp, *dstlim;
340 dstlim = dst + dstsiz;
341 if (srcp < msg || srcp >= eom) {
346 while ((n = *srcp++) != 0) {
351 if (dstp + n + 1 >= dstlim || srcp + n >= eom) {
357 memcpy(dstp, srcp, n);
368 len = srcp - src + 1;
369 srcp = msg + (((n & 0x3f) << 8) | (*srcp & 0xff));
370 if (srcp < msg || srcp >= eom) {
380 if (checked >= eom - msg) {
416 const u_char **dnptrs,
const u_char **lastdnptr)
419 const u_char **cpp, **lpp, *eob, *msg;
428 if (dnptrs != NULL) {
429 if ((msg = *dnptrs++) != NULL) {
430 for (cpp = dnptrs; *cpp != NULL; cpp++)
458 if (n != 0 && msg != NULL) {
459 l = dn_find(srcp, msg, (
const u_char *
const *)dnptrs,
460 (
const u_char *
const *)lpp);
462 if (dstp + 1 >= eob) {
470 if (lastdnptr != NULL && cpp < lastdnptr - 1 &&
471 (dstp - msg) < 0x4000) {
480 if (dstp + 1 + n >= eob) {
483 memcpy(dstp, srcp, n + 1);
508 char *dst,
size_t dstsiz)
536 const u_char **dnptrs,
const u_char **lastdnptr)
557 while (cp < eom && (n = *cp++) != 0) {
614 return (ch > 0x20 && ch < 0x7f);
623 if (ch >= 0x41 && ch <= 0x5A)
638dn_find(
const u_char *domain,
const u_char *msg,
639 const u_char *
const *dnptrs,
640 const u_char *
const *lastdnptr)
642 const u_char *dn, *cp, *sp;
643 const u_char *
const *cpp;
646 for (cpp = dnptrs; cpp < lastdnptr; cpp++) {
649 while ((n = *cp++) != 0) {
657 for ((
void)NULL; n > 0; n--)
658 if (mklower(*dn++) != mklower(*cp++))
661 if (*dn ==
'\0' && *cp ==
'\0')
668 cp = msg + (((n & 0x3f) << 8) | *cp);
712 char* dst_buf,
size_t dst_size)
714 const unsigned char* src = buf;
717 int dst_remaining = dst_size;
721 if (!buf || buflen == 0 || *buf == 0x00) {
727 while ((consumed > 0) && (src < (buf + buflen)))
729 if (dst_remaining <= 0) {
747 added_len = strlen(dst);
748 dst_remaining -= added_len;
755 return (strlen(dst_buf));
781 unsigned char* compbuf,
size_t compbuf_size)
784 const unsigned char *dnptrs[256], **lastdnptr;
790 memset(compbuf, 0, compbuf_size);
791 memset(dnptrs, 0,
sizeof(dnptrs));
793 lastdnptr = &dnptrs[255];
796 src_end = buf + buflen;
797 while (src < src_end) {
798 char *comma = strchr(src,
',');
799 int copylen = ((comma != NULL) ? comma - src : strlen(src));
800 if (copylen > (
sizeof(cur_name) - 1)) {
805 memcpy(cur_name, src, copylen);
806 cur_name[copylen] =
'\0';
int MRns_name_ntop(const u_char *src, char *dst, size_t dstsiz)
int MRns_name_ntol(const u_char *src, u_char *dst, size_t dstsiz)
int MRns_name_pack(const u_char *src, u_char *dst, unsigned dstsiz, const u_char **dnptrs, const u_char **lastdnptr)
int MRns_name_len(const u_char *eom, const u_char *src)
int MRns_name_compress(const char *src, u_char *dst, size_t dstsiz, const u_char **dnptrs, const u_char **lastdnptr)
int MRns_name_unpack(const u_char *msg, const u_char *eom, const u_char *src, u_char *dst, size_t dstsiz)
int MRns_name_uncompress_list(const unsigned char *buf, int buflen, char *dst_buf, size_t dst_size)
Creates a string of comma-separated domain-names from a compressed list.
int MRns_name_skip(const u_char **ptrptr, const u_char *eom)
int MRns_name_uncompress(const u_char *msg, const u_char *eom, const u_char *src, char *dst, size_t dstsiz)
int MRns_name_compress_list(const char *buf, int buflen, unsigned char *compbuf, size_t compbuf_size)
Creates a compressed list from a string of comma-separated domain-names.
int MRns_name_pton(const char *src, u_char *dst, size_t dstsiz)