summaryrefslogtreecommitdiff
path: root/man/dns.3
diff options
context:
space:
mode:
Diffstat (limited to 'man/dns.3')
-rw-r--r--man/dns.3249
1 files changed, 249 insertions, 0 deletions
diff --git a/man/dns.3 b/man/dns.3
new file mode 100644
index 0000000..837450c
--- /dev/null
+++ b/man/dns.3
@@ -0,0 +1,249 @@
+.TH qlibs: dnsresolv
+.SH NAME
+dns \- dns resolver routines
+.SH SYNTAX
+.B #include \(dqdnsresolv.h\(dq
+
+int \fBdns_ip4_packet\fP(stralloc *\fIout\fR,const char *\fIbuf\fR,unsigned int \fIlen\fR);
+.br
+int \fBdns_ip4\fP(stralloc *\fIout\fR,stralloc *\fIfqdn\fR);
+
+int \fBdns_ip6_packet\fP(stralloc *\fIout\fR,const char *\fIbuf\fR,unsigned int \fIlen\fR);
+.br
+int \fBdns_ip6\fP(stralloc *\fIout\fR,stralloc *\fIfqdn\fR);
+
+int \fBdns_mx\fP(stralloc *\fIout\fR,stralloc *\fIfqdn\fR);
+.br
+int \fBdns_mx_packet\fP(stralloc *\fIout\fR,const char *\fIbuf\fR,unsigned int \fIlen\fR);
+
+void \fBdns_name4_domain\fP(char \fIq\fR[DNS_NAME4_DOMAIN],const char *\fIip\fR[4]);
+.br
+int \fBdns_name4\fP(stralloc *\fIout\fR,const char *\fIip\fR[4]);
+
+void \fBdns_name6_domain\fP(char \fIq\fR[DNS_NAME6_DOMAIN],const char *\fIip\fR[16]);
+.br
+int \fBdns_name6\fP(stralloc *\fIout\fR,const char *\fIip\fR[16]);
+
+int \fBdns_name\fP(stralloc *\fIout\fR,const char *\fIip\fR[16]);
+.br
+int \fBdns_name_packet\fP(stralloc *\fIout\fR,const char *\fIbuf\fR,unsigned int \fIlen\fR);
+
+int \fBdns_txt\fP(stralloc *\fIout\fR,stralloc *\fIfqdn\fR);
+.br
+int \fBdns_txt_packet\fP(stralloc *\fIout\fR,const char *\fIbuf\fR,unsigned int \fIlen\fR);
+
+int \fBdns_cname\fP(stralloc *\fIout\fR,stralloc *\fIfqdn\fR);
+.br
+int \fBdns_cname_packet\fP(stralloc *\fIout\fR,const char *\fIbuf\fR,unsigned int \fIlen\fR);
+
+int \fBdns_ip4_qualify\fP(stralloc *\fIout\fR,stralloc *\fIfqdn\fR,const stralloc *\fIudn\fR);
+.br
+int \fBdns_ip6_qualify\fP(stralloc *\fIout\fR,stralloc *\fIfqdn\fR,const stralloc *\fIudn\fR);
+.br
+int \fBdns_ip_qualify\fP(stralloc *\fIout\fR,stralloc *\fIfqdn\fR,const stralloc *\fIudn\fR);
+.SH DESCRIPTION
+.B dns_ip[4|6]_packet
+is a low-level component of
+.BR dns_ip[4|6] ,
+designed to support asynchronous DNS lookups.
+It reads a DNS packet of length \fIlen\fR from
+\fIbuf\fR, extracts the IP(4|6) addresses from the answer section of the packet and
+puts the addresses into \fIout\fR.
+
+.B dns_ip[4|6]
+looks up 4/16-byte IPv6 addresses for the fully qualified domain name of
+\fIfqdn\fR. It puts the concatenation of the IPv[4|6] addresses into \fIout\fR and
+returns the number of received answers for \fIfqdn\fR or \fI0\fR if none are replied.
+If the domain does not exist in DNS, or has no IP addresses,
+\fIout\fR will be empty. More generally, if \fIfqdn\fR is considered by
+.B dns_ip4
+to be a dotted-decimal IPv4 address, it is provissioned as \fIout\fR
+without checking the DNS while returning \fI1\fR.
+Brackets may enclose the dotted-decimal IP address; they are ignored.
+
+.B dns_name[4|6]_packet
+is a low-level component of
+.B dns_name[4|6]
+designed to support asynchronous DNS lookups.
+It reads a DNS packet of length \fIlen\fR from \fIbuf\fR,
+
+.B dns_name[4|6]_domain
+is a low-level component of
+.BR dns_name[4|6] .
+It converts an IP address such as
+.I 1.2.3.4
+or
+.I 4321:0:1:2:3:4:567:89ab
+into a domain name such as
+.I 4.3.2.1.in-addr.arpa
+or
+.I b.a.9.8.7.6.5.0.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.1.2.3.4.ip6.arpa
+and places the packet-encoded domain name into \fIq\fR.
+.I q
+is zero terminated.
+.I q
+must have space for DNS_NAME[4|6]_DOMAIN bytes.
+
+.B dns_mx_packet
+is a low-level component of
+.BR dns_mx ,
+designed to support asynchronous DNS lookups.
+It reads a DNS packet of length \fIlen\fR from \fIbuf\fR,
+extracts the MX records from the answer section of the packet, puts the
+result into \fIout\fR, and returns the number of replies received
+or \fI-1\fR the same way as
+.BR dns_mx .
+
+.B dns_mx
+looks up MX records for the fully-qualified domain name in
+\fIfqdn\fR. It puts the MX records into \fIout\fR and returns the number of
+received records or \fI0\fR.
+Each MX record is a two-byte MX distance (big endian) followed by a
+\\0-terminated dot-encoded domain name. If the domain does not exist in
+DNS, or has no MX records, \fIout\fR will be empty.
+
+.B dns_txt_packet
+is a low-level component of
+.BR dns_txt ,
+designed to support
+asynchronous DNS lookups. It reads a DNS packet of length \fIlen\fR from \fIbuf\fR,
+extracts the TXT records from the answer section of the packet, puts the
+result into \fIout\fR, and returns the number of replies
+or \fI-1\fR the same way as \fBdns_txt\fR.
+
+.B dns_txt
+looks up TXT records for the fully-qualified domain name in
+\fIfqdn\fR. It puts the concatenation of the TXT records into \fIout\fR
+and returns the number of replies received.
+If the domain does not exist in DNS, or has no TXT records, \fIout\fR will be empty.
+
+.B dns_cname_packet
+is a low-level component of
+.BR dns_cname ,
+designed to support
+asynchronous DNS lookups. It reads a DNS packet of length \fIlen\fR from \fIbuf\fR,
+extracts the TXT records from the answer section of the packet, puts the
+result into \fIout\fR, and returns the number of replies received or
+\fI-1\fR the same way as \fBdns_cname\fR.
+
+.B dns_cname
+looks up the canonical name for a given
+.IR fqdn .
+
+.B dns_ip[4|6]_qualify
+feeds the name \fIudn\fR through qualification and looks up their
+4-byte/16-byte IP addresses. It puts the fully qualified domain name
+into \fIfqdn\fR and the concatenation of the IP addresses into \fIout\fR,
+while returning the number of encountered IP addresses.
+.B dns_ip[4|6]_qualify
+evaluates the environment variables
+.I $DNSREWRITEFILE
+pointing to
+.I /etc/dnsrewrite
+and
+.I $LOCALDOMAIN
+and finally reading
+.I /etc/resolv.conf
+to build the
+.I Full Qualified Domain Name (FQDN)
+using the
+.I domain suffix
+for
+.IR hostname .
+.B dns_ip_qualify
+returns
+.I out
+as
+.I IP[4|6]
+and
+.IR FQDN .
+If the domain does not exist in DNS, or has no IP addresses,
+\fIout\fR will be empty and the return code is \fI0\fR.
+
+In case
+.B dns_ip[4|6]_qualify
+is fed with an
+.I IP[4|6]
+addresses instead of domain names,
+it recognizes those not to be subject of
+.IR qualification .
+The particular names
+.IR localhost ,
+.I ip4-loopback
+and
+.I ip6-loopback
+are treated locally and mapped to
+the respective
+.I IP[4|6]
+addresses (and vice versa)
+without facilitating a DNS lookup.
+.SH "INPUT"
+For the high-level routines
+.BR dns_ip[4|6] ,
+.BR dns_ip_qualify[4|6] ,
+.BR dns_name[4|6] ,
+.BR dns_mx ,
+.BR dns_name ,
+.BR dns_txt
+and
+.BR dns_cname
+the provided input variable
+.I stralloc \*\fqdn
+needs to be un-terminated, thus the given
+string length is identitical to the number of
+.I fqdn
+characters.
+.SH "OUTPUT"
+The returned IP addresses are given as character (byte) strings
+with 4 or 16 bytes:
+.B dns_ip4
+and
+.B dns_ip4_qualifiy
+return 4 byte IPv4 addresses, where as
+.B dns_ip6
+and
+.B dns_ip
+as well as
+.B dns_ip6_qualify
+and
+.B dns_ip_qualify
+return sets of 16 byte IPv6 addresses, where
+the potential IPv4 addresses are given in their
+IPv6-mapped-IPv4 representation.
+.SH "RETURN CODES"
+The dns routines
+.BR dns_cname* ,
+.BR dns_ip* ,
+.BR dns_mx* ,
+.B dns_name*
+and
+.BR dns_txt*
+return the number of answers received, which may be
+.I 0
+and potentially
+.I -1
+in case of a memory failure. The full set of return codes:
+
+.EX
+Value | Macro | Explaination
+------+----------+-------------------------------------
+ n>0 | | n = number of answers reeceived
+ 0 | DNS_NXD | either NXDOMAIN or NODATA
+ -1 | DNS_MEM | out of memory (fatal)
+ -2 | DNS_ERR | parsing errors
+ -3 | DNS_COM | socket communicaton errror; SERVFAIL
+ -4 | DNS_INT | internal error
+ -5 | DNS_SOFT | DNS_ERR or DNS_COM
+ -6 | DNS_HARD | DNS loop problem (CNAME)
+.EE
+
+.I errno
+is set appropriately.
+In case of a failure, the respective output variables like
+\fIout\fR and \fIfqdn\fR may or may not change.
+Since a received reply may be empty, always check the length of the
+received output additionally.
+.SH "SEE ALSO"
+ip4(3),
+ip6(3),
+dnsstub(3)