{"size": 4482, "ext": "scrbl", "max_stars_repo_path": "pkgs/net-doc/net/scribblings/dns.scrbl", "max_stars_repo_name": "lkh01/racket", "max_stars_repo_stars_event_min_datetime": "2018-07-29T04:13:52.000Z", "max_stars_repo_stars_event_max_datetime": "2022-02-14T16:11:17.000Z", "max_issues_repo_path": "pkgs/net-doc/net/scribblings/dns.scrbl", "max_issues_repo_name": "lkh01/racket", "max_issues_repo_issues_event_min_datetime": "2017-08-25T20:26:37.000Z", "max_issues_repo_issues_event_max_datetime": "2022-02-26T17:48:40.000Z", "max_forks_repo_path": "pkgs/net-doc/net/scribblings/dns.scrbl", "max_forks_repo_name": "lkh01/racket", "max_forks_repo_forks_event_min_datetime": "2016-04-25T11:47:57.000Z", "max_forks_repo_forks_event_max_datetime": "2017-05-09T14:52:48.000Z"}
{"max_stars_count": 10, "max_issues_count": 15, "max_forks_count": 3, "avg_line_length": 33.2, "max_line_length": 90, "alphanum_fraction": 0.6827309237}
#lang scribble/doc
@(require "common.rkt" scribble/eval (for-label net/dns net/dns-unit net/dns-sig))

@(define dns-evaluator (make-base-eval))
@(dns-evaluator '(require net/dns))

@title[#:tag "dns"]{DNS: Domain Name Service Queries}

@defmodule[net/dns]{The @racketmodname[net/dns] library provides
utilities for looking up hostnames.

Thanks to Eduardo Cavazos and Jason Crowe for repairs and
improvements.}

@; ----------------------------------------

@section[#:tag "dns-proc"]{Functions}

@defproc[(dns-get-address [nameserver string?]
                          [address string?]
                          [#:ipv6? ipv6? any/c #f])
         string?]{

Consults the specified nameserver (normally a numerical address like
@racket["128.42.1.30"]) to obtain a numerical address for the given
Internet address.

The query record sent to the DNS server includes the "recursive" bit,
but @racket[dns-get-address] also implements a recursive search itself
in case the server does not provide this optional feature.

If @racket[ipv6?] is a true value, then the numerical address
that is returned will be an IPv6 address. If no AAAA record exists,
an error will be raised.
}


@deftogether[(
@defproc[(dns-get-srv [nameserver string?]
		      [name string?]
		      [service string?]
		      [proto string? "tcp"])
         (listof srv-rr?)]
@defstruct*[srv-rr ([priority (integer-in 0 65535)]
		    [weight (integer-in 0 65535)]
		    [port (integer-in 0 65535)]
		    [target string?]) #:prefab]
)]{

@margin-note{An SRV record is a particular kind of DNS resource record
that maps an abstract service name onto a hostname and port
combination. For more information, see
@hyperlink["https://en.wikipedia.org/wiki/SRV_record"]{the Wikipedia
page on SRV records}.}

Consults the specified nameserver (normally a numerical address like
@racket["128.42.1.30"]) to retrieve the SRV records corresponding to
the given name, service, and protocol. Returns a list of
@racket[srv-rr] structs if any corresponding SRV records are found;
otherwise, returns @racket['()].

If @racket[service] is @racket["X"], @racket[proto] is @racket["Y"],
and @racket[name] is @racket["example.com"], then this will retrieve
any SRV records at the domain name @tt{_X._Y.example.com}.

The query record sent to the DNS server includes the "recursive" bit,
but @racket[dns-get-srv] also implements a recursive search itself
in case the server does not provide this optional feature.

@examples[#:eval dns-evaluator
	  (eval:alts (dns-get-srv (dns-find-nameserver) "racket-lang.org" "xmpp-client")
		     (list (srv-rr 0 0 5222 "xmpp.racket-lang.org")))
	  (eval:alts (dns-get-srv (dns-find-nameserver) "racket-lang.org" "nonexistent-protocol")
		     (list))
	  (eval:alts (dns-get-srv (dns-find-nameserver) "racket-lang.org" "xmpp-client" "tcp")
		     (list (srv-rr 0 0 5222 "xmpp.racket-lang.org")))
	  (eval:alts (dns-get-srv (dns-find-nameserver) "racket-lang.org" "xmpp-client" "udp")
		     (list))
	  ]

@history[#:added "6.4.0.8"]
}


@defproc[(dns-get-name [nameserver string?]
                       [address string?])
         string?]{

Consults the specified nameserver (normally a numerical address like
@racket["128.42.1.30"]) to obtain a name for the given numerical
address.}


@defproc[(dns-get-mail-exchanger [nameserver string?]
                                 [address string?])
         string?]{

Consults the specified nameserver to obtain the address for a mail
exchanger the given mail host address. For example, the mail exchanger
for @racket["ollie.cs.rice.edu"] might be @racket["cs.rice.edu"].}



@defproc[(dns-find-nameserver) (or/c string? false/c)]{

Attempts to find the address of a nameserver on the present system.
On Unix and Mac OS, this procedure parses @filepath{/etc/resolv.conf} to
extract the first nameserver address. On Windows, it runs
@exec{nslookup.exe}.}

@; ----------------------------------------

@section{DNS Unit}

@margin-note{@racket[dns@] and @racket[dns^] are deprecated.
They exist for backward-compatibility and will likely be removed in
the future. New code should use the @racketmodname[net/dns] module.}

@defmodule[net/dns-unit]

@defthing[dns@ unit?]{

Imports nothing, exports @racket[dns^].}

@; ----------------------------------------

@section{DNS Signature}

@defmodule[net/dns-sig]

@defsignature[dns^ ()]{}

Includes @racket[dns-get-address], @racket[dns-get-name],
@racket[dns-get-mail-exchanger] and @racket[dns-find-nameserver].
