diff options
Diffstat (limited to 'src/gnunet/service/gns/dns.go')
-rw-r--r-- | src/gnunet/service/gns/dns.go | 49 |
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 | 48 | func 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. |
50 | func 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. |