24 #include <sys/types.h> 26 #include <netinet/in.h> 27 #include <sys/socket.h> 38 static const char digits[] =
"0123456789";
42 static int special(
int);
43 static int printable(
int);
44 static int dn_find(
const u_char *,
const u_char *,
45 const u_char *
const *,
46 const u_char *
const *);
70 while ((n = *cp++) != 0) {
87 for ((
void)NULL; n > 0; n--) {
96 }
else if (!printable(c)) {
102 *dn++ = digits[c / 100];
103 *dn++ = digits[(c % 100) / 10];
104 *dn++ = digits[c % 10];
142 u_char *label, *bp, *eom;
151 while ((c = *src++) != 0) {
153 if ((cp = strchr(digits, c)) != NULL) {
154 n = (cp - digits) * 100;
155 if ((c = *src++) == 0 ||
156 (cp = strchr(digits, c)) == NULL) {
160 n += (cp - digits) * 10;
161 if ((c = *src++) == 0 ||
162 (cp = strchr(digits, c)) == NULL) {
174 }
else if (c ==
'\\') {
177 }
else if (c ==
'.') {
178 c = (bp - label - 1);
203 if (c == 0 || *src ==
'.') {
216 c = (bp - label - 1);
264 while ((n = *cp++) != 0) {
275 for ((
void)NULL; n > 0; n--) {
295 u_char *dst,
size_t dstsiz)
297 const u_char *srcp, *dstlim;
307 dstlim = dst + dstsiz;
308 if (srcp < msg || srcp >= eom) {
313 while ((n = *srcp++) != 0) {
318 if (dstp + n + 1 >= dstlim || srcp + n >= eom) {
324 memcpy(dstp, srcp, n);
335 len = srcp - src + 1;
336 srcp = msg + (((n & 0x3f) << 8) | (*srcp & 0xff));
337 if (srcp < msg || srcp >= eom) {
347 if (checked >= eom - msg) {
383 const u_char **dnptrs,
const u_char **lastdnptr)
386 const u_char **cpp, **lpp, *eob, *msg;
395 if (dnptrs != NULL) {
396 if ((msg = *dnptrs++) != NULL) {
397 for (cpp = dnptrs; *cpp != NULL; cpp++)
425 if (n != 0 && msg != NULL) {
426 l = dn_find(srcp, msg, (
const u_char *
const *)dnptrs,
427 (
const u_char *
const *)lpp);
429 if (dstp + 1 >= eob) {
437 if (lastdnptr != NULL && cpp < lastdnptr - 1 &&
438 (dstp - msg) < 0x4000) {
447 if (dstp + 1 + n >= eob) {
450 memcpy(dstp, srcp, n + 1);
475 char *dst,
size_t dstsiz)
503 const u_char **dnptrs,
const u_char **lastdnptr)
524 while (cp < eom && (n = *cp++) != 0) {
581 return (ch > 0x20 && ch < 0x7f);
590 if (ch >= 0x41 && ch <= 0x5A)
605 dn_find(
const u_char *domain,
const u_char *msg,
606 const u_char *
const *dnptrs,
607 const u_char *
const *lastdnptr)
609 const u_char *dn, *cp, *sp;
610 const u_char *
const *cpp;
613 for (cpp = dnptrs; cpp < lastdnptr; cpp++) {
616 while ((n = *cp++) != 0) {
624 for ((
void)NULL; n > 0; n--)
625 if (mklower(*dn++) != mklower(*cp++))
628 if (*dn ==
'\0' && *cp ==
'\0')
635 cp = msg + (((n & 0x3f) << 8) | *cp);
679 char* dst_buf,
size_t dst_size)
681 const unsigned char* src = buf;
684 int dst_remaining = dst_size;
688 if (!buf || buflen == 0 || *buf == 0x00) {
694 while ((consumed > 0) && (src < (buf + buflen)))
696 if (dst_remaining <= 0) {
714 added_len = strlen(dst);
715 dst_remaining -= added_len;
722 return (strlen(dst_buf));
748 unsigned char* compbuf,
size_t compbuf_size)
751 const unsigned char *dnptrs[256], **lastdnptr;
757 memset(compbuf, 0, compbuf_size);
758 memset(dnptrs, 0,
sizeof(dnptrs));
760 lastdnptr = &dnptrs[255];
763 src_end = buf + buflen;
764 while (src < src_end) {
765 char *comma = strchr(src,
',');
766 int copylen = ((comma != NULL) ? comma - src : strlen(src));
767 if (copylen > (
sizeof(cur_name) - 1)) {
772 memcpy(cur_name, src, copylen);
773 cur_name[copylen] =
'\0';
int MRns_name_ntop(const u_char *src, char *dst, size_t dstsiz)
int MRns_name_skip(const u_char **ptrptr, const u_char *eom)
int MRns_name_compress(const char *src, u_char *dst, size_t dstsiz, const u_char **dnptrs, const u_char **lastdnptr)
int MRns_name_ntol(const u_char *src, u_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_pack(const u_char *src, u_char *dst, unsigned dstsiz, const u_char **dnptrs, const u_char **lastdnptr)
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_uncompress(const u_char *msg, const u_char *eom, const u_char *src, char *dst, size_t dstsiz)
struct interface_info * next
int MRns_name_pton(const char *src, u_char *dst, size_t dstsiz)
int MRns_name_unpack(const u_char *msg, const u_char *eom, const u_char *src, u_char *dst, size_t dstsiz)