1inet_res(3)                Erlang Module Definition                inet_res(3)
2
3
4

NAME

6       inet_res - A rudimentary DNS client.
7

DESCRIPTION

9       This module performs DNS name resolving to recursive name servers.
10
11       See  also  ERTS  User's  Guide: Inet Configuration for more information
12       about how to configure an Erlang runtime system for  IP  communication,
13       and how to enable this DNS client by defining 'dns' as a lookup method.
14       The DNS client then acts as a backend for the  resolving  functions  in
15       inet.
16
17       This DNS client can resolve DNS records even if it is not used for nor‐
18       mal name resolving in the node.
19
20       This is not a full-fledged resolver, only a DNS client that  relies  on
21       asking trusted recursive name servers.
22

NAME RESOLVING

24       UDP queries are used unless resolver option usevc is true, which forces
25       TCP queries. If the query is too large for UDP, TCP  is  used  instead.
26       For regular DNS queries, 512 bytes is the size limit.
27
28       When  EDNS  is enabled (resolver option edns is set to the EDNS version
29       (that is, 0 instead of false), resolver  option  udp_payload_size  sets
30       the  limit.  If a name server replies with the TC bit set (truncation),
31       indicating that the answer is incomplete, the query is retried to  that
32       name  server  using TCP. Resolver option udp_payload_size also sets the
33       advertised size for the maximum allowed reply size, if EDNS is enabled,
34       otherwise  the  name  server  uses the limit 512 bytes. If the reply is
35       larger, it gets truncated, forcing a TCP requery.
36
37       For UDP queries, resolver options timeout and retry control retransmis‐
38       sion. Each name server in the nameservers list is tried with a time-out
39       of timeout/retry. Then all name servers are tried again,  doubling  the
40       time-out, for a total of retry times.
41
42       But  before  all name servers are tried again, there is a (user config‐
43       urable) timeout, servfail_retry_timeout. The point of this is  to  pre‐
44       vent the new query to be handled by a server's servfail cache (a client
45       that is too eager will actually  only  get  what  is  in  the  servfail
46       cache). If there is too little time left of the resolver call's timeout
47       to do a retry, the resolver call may return before the  call's  timeout
48       has expired.
49
50       For  queries not using the search list, if the query to all nameservers
51       results in {error,nxdomain} or an empty answer, the same query is tried
52       for alt_nameservers.
53

RESOLVER TYPES

55       The following data types concern the resolver:
56

DATA TYPES

58       res_option() =
59           {alt_nameservers, [nameserver()]} |
60           {edns, 0 | false} |
61           {inet6, boolean()} |
62           {nameservers, [nameserver()]} |
63           {recurse, boolean()} |
64           {retry, integer()} |
65           {timeout, integer()} |
66           {udp_payload_size, integer()} |
67           {usevc, boolean()} |
68           {nxdomain_reply, boolean()}
69
70       nameserver() = {inet:ip_address(), Port :: 1..65535}
71
72       res_error() =
73           formerr | qfmterror | servfail | nxdomain | notimp | refused |
74           badvers | timeout
75

DNS TYPES

77       The following data types concern the DNS client:
78

DATA TYPES

80       dns_name() = string()
81
82              A string with no adjacent dots.
83
84       dns_rr_type() =
85           a | aaaa | caa | cname | gid | hinfo | ns | mb | md | mg |
86           mf | minfo | mx | naptr | null | ptr | soa | spf | srv | txt |
87           uid | uinfo | unspec | uri | wks
88
89       dns_class() = in | chaos | hs | any
90
91       dns_msg() = term()
92
93              This  is the start of a hierarchy of opaque data structures that
94              can be examined with access functions in inet_dns, which  return
95              lists of {Field,Value} tuples. The arity 2 functions only return
96              the value for a specified field.
97
98              dns_msg() = DnsMsg
99                  inet_dns:msg(DnsMsg) ->
100                      [ {header, dns_header()}
101                      | {qdlist, dns_query()}
102                      | {anlist, dns_rr()}
103                      | {nslist, dns_rr()}
104                      | {arlist, dns_rr()} ]
105                  inet_dns:msg(DnsMsg, header) -> dns_header() % for example
106                  inet_dns:msg(DnsMsg, Field) -> Value
107
108              dns_header() = DnsHeader
109                  inet_dns:header(DnsHeader) ->
110                      [ {id, integer()}
111                      | {qr, boolean()}
112                      | {opcode, query | iquery | status | integer()}
113                      | {aa, boolean()}
114                      | {tc, boolean()}
115                      | {rd, boolean()}
116                      | {ra, boolean()}
117                      | {pr, boolean()}
118                      | {rcode, integer(0..16)} ]
119                  inet_dns:header(DnsHeader, Field) -> Value
120
121              query_type() = axfr | mailb | maila | any | dns_rr_type()
122
123              dns_query() = DnsQuery
124                  inet_dns:dns_query(DnsQuery) ->
125                      [ {domain, dns_name()}
126                      | {type, query_type()}
127                      | {class, dns_class()} ]
128                  inet_dns:dns_query(DnsQuery, Field) -> Value
129
130              dns_rr() = DnsRr
131                  inet_dns:rr(DnsRr) -> DnsRrFields | DnsRrOptFields
132                  DnsRrFields = [ {domain, dns_name()}
133                                | {type, dns_rr_type()}
134                                | {class, dns_class()}
135                                | {ttl, integer()}
136                                | {data, dns_data()} ]
137                  DnsRrOptFields = [ {domain, dns_name()}
138                                   | {type, opt}
139                                   | {udp_payload_size, integer()}
140                                   | {ext_rcode, integer()}
141                                   | {version, integer()}
142                                   | {z, integer()}
143                                   | {data, dns_data()} ]
144                  inet_dns:rr(DnsRr, Field) -> Value
145
146              There is an information function for the types above:
147
148              inet_dns:record_type(dns_msg()) -> msg;
149              inet_dns:record_type(dns_header()) -> header;
150              inet_dns:record_type(dns_query()) -> dns_query;
151              inet_dns:record_type(dns_rr()) -> rr;
152              inet_dns:record_type(_) -> undefined.
153
154              So, inet_dns:(inet_dns:record_type(X))(X) converts any of  these
155              data structures into a {Field,Value} list.
156
157       dns_data() =
158           dns_name() |
159           inet:ip4_address() |
160           inet:ip6_address() |
161           {MName :: dns_name(),
162            RName :: dns_name(),
163            Serial :: integer(),
164            Refresh :: integer(),
165            Retry :: integer(),
166            Expiry :: integer(),
167            Minimum :: integer()} |
168           {inet:ip4_address(), Proto :: integer(), BitMap :: binary()} |
169           {CpuString :: string(), OsString :: string()} |
170           {RM :: dns_name(), EM :: dns_name()} |
171           {Prio :: integer(), dns_name()} |
172           {Prio :: integer(),
173            Weight :: integer(),
174            Port :: integer(),
175            dns_name()} |
176           {Order :: integer(),
177            Preference :: integer(),
178            Flags :: string(),
179            Services :: string(),
180            Regexp :: string(),
181            dns_name()} |
182           [string()] |
183           binary()
184
185              Regexp  is  a string with characters encoded in the UTF-8 coding
186              standard.
187
188       hostent() =
189           {hostent,
190            H_name :: inet:hostname(),
191            H_aliases :: [inet:hostname()],
192            H_addrtype :: dns_rr_type(),
193            H_length :: integer() >= 0,
194            H_addr_list :: [dns_data()]}
195

EXPORTS

197       getbyname(Name, Type) -> {ok, Hostent} | {error, Reason}
198
199       getbyname(Name, Type, Timeout) -> {ok, Hostent} | {error, Reason}
200
201              Types:
202
203                 Name = dns_name()
204                 Type = dns_rr_type()
205                 Timeout = timeout()
206                 Hostent = inet:hostent() | hostent()
207                 Reason = inet:posix() | res_error()
208
209              Resolves a DNS record of the specified Type  for  the  specified
210              host,  of class in. Returns, on success, when resolving a Type =
211              a|aaaa DNS record, a #hostent{} record with  #hostent.h_addrtype
212              = inet|inet6, respectively; see inet:hostent().
213
214              When  resolving other Type = dns_rr_type():s (of class in), also
215              returns a #hostent{} record  but  with  dns_rr_type()  in  #hos‐
216              tent.h_addrtype,   and   the   resolved   dns_data()   in  #hos‐
217              tent.h_addr_list; see hostent().
218
219              This function uses resolver option search that is a list of  do‐
220              main  names.  If  the  name  to  resolve contains no dots, it is
221              prepended to each domain name in the search list, and  they  are
222              tried  in order. If the name contains dots, it is first tried as
223              an absolute name and if that fails, the search list is used.  If
224              the  name  has  a trailing dot, it is supposed to be an absolute
225              name and the search list is not used.
226
227       gethostbyaddr(Address) -> {ok, Hostent} | {error, Reason}
228
229       gethostbyaddr(Address, Timeout) -> {ok, Hostent} | {error, Reason}
230
231              Types:
232
233                 Address = inet:ip_address()
234                 Timeout = timeout()
235                 Hostent = inet:hostent()
236                 Reason = inet:posix() | res_error()
237
238              Backend functions used by inet:gethostbyaddr/1.
239
240       gethostbyname(Name) -> {ok, Hostent} | {error, Reason}
241
242       gethostbyname(Name, Family) -> {ok, Hostent} | {error, Reason}
243
244       gethostbyname(Name, Family, Timeout) ->
245                        {ok, Hostent} | {error, Reason}
246
247              Types:
248
249                 Name = dns_name()
250                 Hostent = inet:hostent()
251                 Timeout = timeout()
252                 Family = inet:address_family()
253                 Reason = inet:posix() | res_error()
254
255              Backend functions used by inet:gethostbyname/1,2.
256
257              This function uses  resolver  option  search  just  like  getby‐
258              name/2,3.
259
260              If resolver option inet6 is true, an IPv6 address is looked up.
261
262       lookup(Name, Class, Type) -> [dns_data()]
263
264       lookup(Name, Class, Type, Opts) -> [dns_data()]
265
266       lookup(Name, Class, Type, Opts, Timeout) -> [dns_data()]
267
268              Types:
269
270                 Name = dns_name() | inet:ip_address()
271                 Class = dns_class()
272                 Type = dns_rr_type()
273                 Opts = [res_option() | verbose]
274                 Timeout = timeout()
275
276              Resolves  the  DNS data for the record of the specified type and
277              class for the specified name. On success, filters out the answer
278              records  with  the correct Class and Type, and returns a list of
279              their data fields. So, a lookup for type any gives an empty  an‐
280              swer,  as  the  answer  records have specific types that are not
281              any. An empty answer or a failed lookup returns an empty list.
282
283              Calls resolve/* with the same arguments and filters the  result,
284              so Opts is described for those functions.
285
286       resolve(Name, Class, Type) -> {ok, dns_msg()} | Error
287
288       resolve(Name, Class, Type, Opts) -> {ok, dns_msg()} | Error
289
290       resolve(Name, Class, Type, Opts, Timeout) ->
291                  {ok, dns_msg()} | Error
292
293              Types:
294
295                 Name = dns_name() | inet:ip_address()
296                 Class = dns_class()
297                 Type = dns_rr_type()
298                 Opts = [Opt]
299                 Opt = res_option() | verbose | atom()
300                 Timeout = timeout()
301                 Error = {error, Reason} | {error, {Reason, dns_msg()}}
302                 Reason = inet:posix() | res_error()
303
304              Resolves  a  DNS  record of the specified type and class for the
305              specified name. The returned dns_msg() can be examined using ac‐
306              cess functions in inet_db, as described in section in DNS Types.
307
308              If Name is an ip_address(), the domain name to query for is gen‐
309              erated as the standard reverse ".IN-ADDR.ARPA." name for an IPv4
310              address,  or  the ".IP6.ARPA." name for an IPv6 address. In this
311              case, you most probably want to use Class = in and Type  =  ptr,
312              but it is not done automatically.
313
314              Opts  overrides  the  corresponding  resolver options. If option
315              nameservers is specified, it is assumed that it is the  complete
316              list  of  name  serves, so resolver option alt_nameserves is ig‐
317              nored. However, if option alt_nameserves is  also  specified  to
318              this function, it is used.
319
320              Option  verbose  (or  rather  {verbose,true}) causes diagnostics
321              printout through io:format/2  of  queries,  replies  retransmis‐
322              sions,  and  so  on,  similar to from utilities, such as dig and
323              nslookup.
324
325              Option nxdomain_reply (or rather  {nxdomain_reply,true})  causes
326              nxdomain  errors from DNS servers to be returned as {error, {nx‐
327              domain, dns_msg()}}. dns_msg() contains the additional  sections
328              that where included by the answering server. This is mainly use‐
329              ful to inspect the SOA  record  to  get  the  TTL  for  negative
330              caching.
331
332              If  Opt  is any atom, it is interpreted as {Opt,true} unless the
333              atom  string  starts  with  "no",  making   the   interpretation
334              {Opt,false}. For example, usevc is an alias for {usevc,true} and
335              nousevc is an alias for {usevc,false}.
336
337              Option inet6 has no effect on this function. You  probably  want
338              to use Type = a | aaaa instead.
339

EXAMPLE

341       This access functions example shows how lookup/3 can be implemented us‐
342       ing resolve/3 from outside the module:
343
344       example_lookup(Name, Class, Type) ->
345           case inet_res:resolve(Name, Class, Type) of
346               {ok,Msg} ->
347                   [inet_dns:rr(RR, data)
348                    || RR <- inet_dns:msg(Msg, anlist),
349                        inet_dns:rr(RR, type) =:= Type,
350                        inet_dns:rr(RR, class) =:= Class];
351               {error,_} ->
352                   []
353            end.
354

LEGACY FUNCTIONS

356       These are deprecated because the annoying double meaning  of  the  name
357       servers/time-out  argument, and because they have no decent place for a
358       resolver options list.
359

EXPORTS

361       nslookup(Name, Class, Type) -> {ok, dns_msg()} | {error, Reason}
362
363       nslookup(Name, Class, Type, Timeout) ->
364                   {ok, dns_msg()} | {error, Reason}
365
366       nslookup(Name, Class, Type, Nameservers) ->
367                   {ok, dns_msg()} | {error, Reason}
368
369              Types:
370
371                 Name = dns_name() | inet:ip_address()
372                 Class = dns_class()
373                 Type = dns_rr_type()
374                 Timeout = timeout()
375                 Nameservers = [nameserver()]
376                 Reason = inet:posix() | res_error()
377
378              Resolves a DNS record of the specified type and  class  for  the
379              specified name.
380
381       nnslookup(Name, Class, Type, Nameservers) ->
382                    {ok, dns_msg()} | {error, Reason}
383
384       nnslookup(Name, Class, Type, Nameservers, Timeout) ->
385                    {ok, dns_msg()} | {error, Reason}
386
387              Types:
388
389                 Name = dns_name() | inet:ip_address()
390                 Class = dns_class()
391                 Type = dns_rr_type()
392                 Timeout = timeout()
393                 Nameservers = [nameserver()]
394                 Reason = inet:posix()
395
396              Resolves  a  DNS  record of the specified type and class for the
397              specified name.
398
399
400
401Ericsson AB                      kernel 8.5.3                      inet_res(3)
Impressum