aboutsummaryrefslogtreecommitdiff
path: root/src/gnunet/service/gns/dns.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/gnunet/service/gns/dns.go')
-rw-r--r--src/gnunet/service/gns/dns.go49
1 files changed, 19 insertions, 30 deletions
diff --git a/src/gnunet/service/gns/dns.go b/src/gnunet/service/gns/dns.go
index fe138b0..18e2b78 100644
--- a/src/gnunet/service/gns/dns.go
+++ b/src/gnunet/service/gns/dns.go
@@ -45,9 +45,11 @@ func DNSNameFromBytes(b []byte, offset int) (int, string) {
45 return pos + 1, str 45 return pos + 1, str
46} 46}
47 47
48// queryDNS resolves a name on a given nameserver and delivers all matching 48func QueryDNS(id int, name string, server net.IP, kind RRTypeList) *GNSRecordSet {
49// resource record (of type 'kind') to the result channel. 49 // get default nameserver if not defined.
50func queryDNS(id int, name string, server net.IP, kind RRTypeList, res chan *GNSRecordSet) { 50 if server == nil {
51 server = net.IPv4(8, 8, 8, 8)
52 }
51 logger.Printf(logger.DBG, "[dns][%d] Starting query for '%s' on '%s'...\n", id, name, server.String()) 53 logger.Printf(logger.DBG, "[dns][%d] Starting query for '%s' on '%s'...\n", id, name, server.String())
52 54
53 // assemble query 55 // assemble query
@@ -80,14 +82,13 @@ func queryDNS(id int, name string, server net.IP, kind RRTypeList, res chan *GNS
80 continue 82 continue
81 } 83 }
82 logger.Printf(logger.ERROR, "[dns][%d] Error: %s\n", id, errMsg) 84 logger.Printf(logger.ERROR, "[dns][%d] Error: %s\n", id, errMsg)
83 res <- nil 85 return nil
84 } 86 }
85 // process results 87 // process results
86 logger.Printf(logger.WARN, "[dns][%d] Response from DNS server received (%d/5).\n", id, retry+1) 88 logger.Printf(logger.WARN, "[dns][%d] Response from DNS server received (%d/5).\n", id, retry+1)
87 if in == nil { 89 if in == nil {
88 logger.Printf(logger.ERROR, "[dns][%d] No results\n", id) 90 logger.Printf(logger.ERROR, "[dns][%d] No results\n", id)
89 res <- nil 91 return nil
90 return
91 } 92 }
92 set := NewGNSRecordSet() 93 set := NewGNSRecordSet()
93 for _, record := range in.Answer { 94 for _, record := range in.Answer {
@@ -118,12 +119,11 @@ func queryDNS(id int, name string, server net.IP, kind RRTypeList, res chan *GNS
118 set.AddRecord(rr) 119 set.AddRecord(rr)
119 } 120 }
120 } 121 }
121 logger.Printf(logger.WARN, "[dns][%d] %d resource records extracted from response (%d/5).\n", id, set.Count, retry+1) 122 logger.Printf(logger.INFO, "[dns][%d] %d resource records extracted from response (%d/5).\n", id, set.Count, retry+1)
122 res <- set 123 return set
123 return
124 } 124 }
125 logger.Printf(logger.WARN, "[dns][%d] Resolution failed -- giving up...\n", id) 125 logger.Printf(logger.WARN, "[dns][%d] Resolution failed -- giving up...\n", id)
126 res <- nil 126 return nil
127} 127}
128 128
129// ResolveDNS resolves a name in DNS. Multiple DNS servers are queried in 129// ResolveDNS resolves a name in DNS. Multiple DNS servers are queried in
@@ -135,29 +135,16 @@ func (gns *GNSModule) ResolveDNS(name string, servers []string, kind RRTypeList,
135 // start DNS queries concurrently 135 // start DNS queries concurrently
136 res := make(chan *GNSRecordSet) 136 res := make(chan *GNSRecordSet)
137 running := 0 137 running := 0
138 for idx, srv := range servers { 138 for _, srv := range servers {
139 // check if srv is an IPv4/IPv6 address 139 // check if srv is an IPv4/IPv6 address
140 addr := net.ParseIP(srv) 140 addr := net.ParseIP(srv)
141 logger.Printf(logger.DBG, "ParseIP('%s', len=%d) --> %v\n", srv, len(srv), addr) 141 logger.Printf(logger.DBG, "ParseIP('%s', len=%d) --> %v\n", srv, len(srv), addr)
142 if addr == nil { 142 if addr == nil {
143 // no, it is a name... try to resolve an IP address from the name
143 query := NewRRTypeList(enums.GNS_TYPE_DNS_A, enums.GNS_TYPE_DNS_AAAA) 144 query := NewRRTypeList(enums.GNS_TYPE_DNS_A, enums.GNS_TYPE_DNS_AAAA)
144 // no; resolve server name in GNS 145 if set, err = gns.ResolveUnknown(srv, pkey, query); err != nil {
145 if strings.HasSuffix(srv, ".+") { 146 logger.Printf(logger.ERROR, "[dns] Can't resolve NS server '%s': %s\n", srv, err.Error())
146 // resolve server name relative to current zone 147 continue
147 zone := util.EncodeBinaryToString(pkey.Bytes())
148 srv = strings.TrimSuffix(srv, ".+")
149 set, err = gns.Resolve(srv, pkey, query, enums.GNS_LO_DEFAULT)
150 if err != nil {
151 logger.Printf(logger.ERROR, "[dns] Can't resolve NS server '%s' in '%s'\n", srv, zone)
152 continue
153 }
154 } else {
155 // resolve absolute GNS name (name MUST end in a PKEY)
156 set, err = gns.Resolve(srv, nil, query, enums.GNS_LO_DEFAULT)
157 if err != nil {
158 logger.Printf(logger.ERROR, "[dns] Can't resolve NS server '%s'\n", srv)
159 continue
160 }
161 } 148 }
162 // traverse resource records for 'A' and 'AAAA' records. 149 // traverse resource records for 'A' and 'AAAA' records.
163 rec_loop: 150 rec_loop:
@@ -173,12 +160,14 @@ func (gns *GNSModule) ResolveDNS(name string, servers []string, kind RRTypeList,
173 } 160 }
174 // check if we have an IP address available 161 // check if we have an IP address available
175 if addr == nil { 162 if addr == nil {
176 logger.Printf(logger.WARN, "[dns] No IP address for nameserver in GNS") 163 logger.Printf(logger.WARN, "[dns] No IP address for nameserver '%s'\n", srv)
177 continue 164 continue
178 } 165 }
179 } 166 }
180 // query DNS concurrently 167 // query DNS concurrently
181 go queryDNS(idx, name, addr, kind, res) 168 go func() {
169 res <- QueryDNS(util.NextID(), name, addr, kind)
170 }()
182 running++ 171 running++
183 } 172 }
184 // check if we started some queries at all. 173 // check if we started some queries at all.