Add debugging for CNAME records.
authorMichael Brown <mcb30@etherboot.org>
Sun, 1 May 2005 11:30:26 +0000 (11:30 +0000)
committerMichael Brown <mcb30@etherboot.org>
Sun, 1 May 2005 11:30:26 +0000 (11:30 +0000)
Allow routines to be called by nmb.c

src/include/dns.h
src/proto/dns.c

index 075a941..5b8b81f 100644 (file)
@@ -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 */
index 347df9c..b2f258b 100644 (file)
@@ -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 );