From bcedad47088a004ea860f7f0edfd21cea91a0914 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 1 May 2005 11:30:26 +0000 Subject: [PATCH] Add debugging for CNAME records. Allow routines to be called by nmb.c --- src/include/dns.h | 15 +++++++++++++-- src/proto/dns.c | 28 +++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/include/dns.h b/src/include/dns.h index 075a9413..5b8b81f1 100644 --- a/src/include/dns.h +++ b/src/include/dns.h @@ -2,8 +2,9 @@ #define DNS_RESOLVER_H #include "stdint.h" -#include "nic.h" #include "in.h" +#include "ip.h" +#include "udp.h" /* * Constants @@ -76,6 +77,16 @@ struct dns_rr_info_a { struct dns_rr_info_cname { struct dns_rr_info; char cname[0]; -}; +} __attribute__ (( packed )); + +/* + * Functions in dns.c (used by nmb.c) + * + */ +extern struct dns_header * dns_query ( struct dns_query *query, + unsigned int query_len, + struct sockaddr_in *nameserver ); +extern struct dns_rr_info * dns_find_rr ( struct dns_query *query, + struct dns_header *reply ); #endif /* DNS_RESOLVER_H */ diff --git a/src/proto/dns.c b/src/proto/dns.c index 347df9cc..b2f258bf 100644 --- a/src/proto/dns.c +++ b/src/proto/dns.c @@ -145,8 +145,8 @@ static inline const char * dns_skip_name ( const char *name ) { * query. Returns a pointer to the RR, or NULL if no answer found. * */ -static struct dns_rr_info * dns_find_rr ( struct dns_query *query, - struct dns_header *reply ) { +struct dns_rr_info * dns_find_rr ( struct dns_query *query, + struct dns_header *reply ) { int i, cmp; const char *p = ( ( char * ) reply ) + sizeof ( struct dns_header ); @@ -192,6 +192,23 @@ static inline char * dns_make_name ( char *dest, const char *name ) { return dest; } +/* + * Produce a printable version of a DNS name. Used only for debugging. + * + */ +static inline char * dns_unmake_name ( char *name ) { + char *p; + unsigned int len; + + p = name; + while ( ( len = *p ) ) { + *(p++) = '.'; + p += len; + } + + return name + 1; +} + /* * Decompress a DNS name. * @@ -281,10 +298,15 @@ static int dns_resolv ( struct in_addr *addr, const char *name ) { ( struct dns_rr_info_cname * ) rr_info; char *cname = rr_info_cname->cname; - DBG ( "DNS found CNAME\n" ); query_info = ( void * ) dns_decompress_name ( query.payload, cname, reply ); + DBG ( "DNS found CNAME %s\n", + dns_unmake_name ( query.payload ) ); + DBG ( "", /* Reconstruct name */ + dns_make_name ( query.payload, + query.payload + 1 ) ); + query_info->qtype = htons ( DNS_TYPE_A ); query_info->qclass = htons ( DNS_CLASS_IN );