25 static const char rcsid[] =
"$Id: ns_name.c,v 1.2 2009/10/28 04:12:29 sar Exp $";
28 #include <sys/types.h> 30 #include <netinet/in.h> 31 #include <sys/socket.h> 42 static const char digits[] =
"0123456789";
46 static int special(
int);
47 static int printable(
int);
48 static int dn_find(
const u_char *,
const u_char *,
49 const u_char *
const *,
50 const u_char *
const *);
74 while ((n = *cp++) != 0) {
91 for ((
void)NULL; n > 0; n--) {
100 }
else if (!printable(c)) {
106 *dn++ = digits[c / 100];
107 *dn++ = digits[(c % 100) / 10];
108 *dn++ = digits[c % 10];
146 u_char *label, *bp, *eom;
155 while ((c = *src++) != 0) {
157 if ((cp = strchr(digits, c)) != NULL) {
158 n = (cp - digits) * 100;
159 if ((c = *src++) == 0 ||
160 (cp = strchr(digits, c)) == NULL) {
164 n += (cp - digits) * 10;
165 if ((c = *src++) == 0 ||
166 (cp = strchr(digits, c)) == NULL) {
178 }
else if (c ==
'\\') {
181 }
else if (c ==
'.') {
182 c = (bp - label - 1);
207 if (c == 0 || *src ==
'.') {
220 c = (bp - label - 1);
268 while ((n = *cp++) != 0) {
279 for ((
void)NULL; n > 0; n--) {
299 u_char *dst,
size_t dstsiz)
301 const u_char *srcp, *dstlim;
311 dstlim = dst + dstsiz;
312 if (srcp < msg || srcp >= eom) {
317 while ((n = *srcp++) != 0) {
322 if (dstp + n + 1 >= dstlim || srcp + n >= eom) {
328 memcpy(dstp, srcp, n);
339 len = srcp - src + 1;
340 srcp = msg + (((n & 0x3f) << 8) | (*srcp & 0xff));
341 if (srcp < msg || srcp >= eom) {
351 if (checked >= eom - msg) {
387 const u_char **dnptrs,
const u_char **lastdnptr)
390 const u_char **cpp, **lpp, *eob, *msg;
399 if (dnptrs != NULL) {
400 if ((msg = *dnptrs++) != NULL) {
401 for (cpp = dnptrs; *cpp != NULL; cpp++)
429 if (n != 0 && msg != NULL) {
430 l = dn_find(srcp, msg, (
const u_char *
const *)dnptrs,
431 (
const u_char *
const *)lpp);
433 if (dstp + 1 >= eob) {
441 if (lastdnptr != NULL && cpp < lastdnptr - 1 &&
442 (dstp - msg) < 0x4000) {
451 if (dstp + 1 + n >= eob) {
454 memcpy(dstp, srcp, n + 1);
479 char *dst,
size_t dstsiz)
507 const u_char **dnptrs,
const u_char **lastdnptr)
528 while (cp < eom && (n = *cp++) != 0) {
585 return (ch > 0x20 && ch < 0x7f);
594 if (ch >= 0x41 && ch <= 0x5A)
609 dn_find(
const u_char *domain,
const u_char *msg,
610 const u_char *
const *dnptrs,
611 const u_char *
const *lastdnptr)
613 const u_char *dn, *cp, *sp;
614 const u_char *
const *cpp;
617 for (cpp = dnptrs; cpp < lastdnptr; cpp++) {
620 while ((n = *cp++) != 0) {
628 for ((
void)NULL; n > 0; n--)
629 if (mklower(*dn++) != mklower(*cp++))
632 if (*dn ==
'\0' && *cp ==
'\0')
639 cp = msg + (((n & 0x3f) << 8) | *cp);
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_pack(const u_char *src, u_char *dst, unsigned dstsiz, const u_char **dnptrs, const u_char **lastdnptr)
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)