client.c revision 92384667ff3bc059237849b3afd4c715c9164435
e676a596869d8a80a644c99a848afb53d1c5975eMark Andrews * Copyright (C) 2009-2014 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * Permission to use, copy, modify, and/or distribute this software for any
ec5347e2c775f027573ce5648b910361aa926c01Automatic Updater * purpose with or without fee is hereby granted, provided that the above
c3c6770e537ea916265c78d0294ad108233e17c1Michael Sawyer * copyright notice and this permission notice appear in all copies.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * PERFORMANCE OF THIS SOFTWARE.
c3c6770e537ea916265c78d0294ad108233e17c1Michael Sawyer/* $Id: client.c,v 1.14 2011/03/12 04:59:47 tbox Exp $ */
9069215eac23e32f4ef1c8e44ad7ff2865cfcdacEvan Hunt#define DNS_CLIENT_MAGIC ISC_MAGIC('D', 'N', 'S', 'c')
9069215eac23e32f4ef1c8e44ad7ff2865cfcdacEvan Hunt#define DNS_CLIENT_VALID(c) ISC_MAGIC_VALID(c, DNS_CLIENT_MAGIC)
35f6a21f5f8114542c050bfcb484b39ce513d4bdEvan Hunt#define RCTX_VALID(c) ISC_MAGIC_VALID(c, RCTX_MAGIC)
35f6a21f5f8114542c050bfcb484b39ce513d4bdEvan Hunt#define REQCTX_VALID(c) ISC_MAGIC_VALID(c, REQCTX_MAGIC)
35f6a21f5f8114542c050bfcb484b39ce513d4bdEvan Hunt#define UCTX_VALID(c) ISC_MAGIC_VALID(c, UCTX_MAGIC)
222d38735f97f771054e223b03f84c5858252332Evan Hunt#endif /* TUNE_LARGE */
c5272fb3303425f794dab68f734f6a2a45dce01eMichael Sawyer * DNS client object
2c089bf6d24936de631a57b4958ba6b8b5e3b23dMark Andrews /* Unlocked */
ac21f918f23ce95fd5be807428ee9e2c42319878Evan Hunt unsigned int magic;
ac21f918f23ce95fd5be807428ee9e2c42319878Evan Hunt unsigned int attributes;
a69070d8fab55dbc63ba9f96c9d3e34f0ea9119aMark Andrews /* Locked */
7318bbc26262a66a0d740ceefed769961ef7e476Evan Hunt unsigned int references;
7318bbc26262a66a0d740ceefed769961ef7e476Evan Hunt * Timeout/retry constants for dynamic update borrowed from nsupdate
2c089bf6d24936de631a57b4958ba6b8b5e3b23dMark Andrews * Internal state for a single name resolution procedure
2c089bf6d24936de631a57b4958ba6b8b5e3b23dMark Andrewstypedef struct resctx {
2c089bf6d24936de631a57b4958ba6b8b5e3b23dMark Andrews /* Unlocked */
de5890da9b87cb4b91aca033db0e25b1fdb68c77Evan Hunt unsigned int magic;
unsigned int restarts;
} resctx_t;
typedef struct resarg {
} resarg_t;
typedef struct reqctx {
unsigned int magic;
unsigned int parseoptions;
} reqctx_t;
typedef struct reqarg {
} reqarg_t;
typedef struct updatearg {
} updatearg_t;
typedef struct updatectx {
unsigned int magic;
unsigned int nservers;
} updatectx_t;
static isc_result_t
attrs = 0;
switch (family) {
case AF_INET:
case AF_INET6:
INSIST(0);
attrmask = 0;
return (result);
static isc_result_t
const char *dbtype;
return (result);
return (result);
return (result);
return (result);
return (ISC_R_SUCCESS);
unsigned int logdebuglevel = 0;
return (result);
goto cleanup;
goto cleanup;
goto cleanup;
goto cleanup;
goto cleanup;
goto cleanup;
goto cleanup;
goto cleanup;
return (ISC_R_SUCCESS);
return (result);
return (result);
return (ISC_R_NOMEMORY);
return (result);
goto cleanup;
goto cleanup;
goto cleanup;
goto cleanup;
return (ISC_R_SUCCESS);
return (result);
if (destroyok)
return (result);
return (result);
return (result);
return (result);
const char *dlvname)
isc_buffer_t b;
goto cleanup;
goto cleanup;
return (result);
static isc_result_t
return (ISC_R_NOMEMORY);
return (ISC_R_SUCCESS);
static inline isc_result_t
int fopts = 0;
return (result);
static isc_result_t
return (result);
unsigned int nlabels;
int order;
goto done;
sizeof(*ansname));
switch (result) {
case ISC_R_SUCCESS:
case DNS_R_CNAME:
goto done;
goto done;
goto done;
case DNS_R_DNAME:
&nlabels);
goto done;
goto done;
goto done;
case DNS_R_NCACHENXDOMAIN:
case DNS_R_NCACHENXRRSET:
goto done;
goto done;
&rdsiter);
goto done;
link);
goto done;
done:
!= NULL) {
if (want_restart) {
} while (want_restart);
if (send_event) {
return (ISC_R_NOMEMORY);
return (result);
return (result);
return (result);
return (result);
goto cleanup;
goto cleanup;
goto cleanup;
if (want_dnssec) {
goto cleanup;
goto cleanup;
return (ISC_R_SUCCESS);
return (result);
if (need_destroyclient)
goto cleanup;
goto cleanup;
&dstkey);
goto cleanup;
return (result);
return (ISC_R_NOMEMORY);
return (result);
return (result);
return (result);
unsigned int reqoptions;
return (result);
reqoptions = 0;
goto cleanup;
goto cleanup;
return (ISC_R_SUCCESS);
return (result);
if (need_destroyclient)
static isc_result_t
switch (rcode) {
case dns_rcode_formerr:
return (DNS_R_FORMERR);
case dns_rcode_servfail:
return (DNS_R_SERVFAIL);
case dns_rcode_nxdomain:
return (DNS_R_NXDOMAIN);
case dns_rcode_notimp:
return (DNS_R_NOTIMP);
case dns_rcode_refused:
return (DNS_R_REFUSED);
case dns_rcode_yxdomain:
return (DNS_R_YXDOMAIN);
case dns_rcode_yxrrset:
return (DNS_R_YXRRSET);
case dns_rcode_nxrrset:
return (DNS_R_NXRRSET);
case dns_rcode_notauth:
return (DNS_R_NOTAUTH);
case dns_rcode_notzone:
return (DNS_R_NOTZONE);
case dns_rcode_badvers:
return (DNS_R_BADVERS);
return (ISC_R_FAILURE);
goto out;
&answer);
goto out;
out:
reqoptions = 0;
NULL,
static isc_result_t
return (result);
return (result);
return (result);
reqoptions = 0;
return (result);
int family;
goto done;
sizeof(*sa));
goto done;
switch (family) {
case AF_INET:
NULL);
case AF_INET6:
NULL);
done:
if (completed) {
static isc_result_t
unsigned int resoptions;
return (result);
return (result);
goto out;
resoptions = 0;
&primary,
out:
return (result);
int pass = 0;
goto out;
goto out;
reqoptions = 0;
&newrequest);
goto out;
goto out;
if (pass == 0)
goto out;
pass++;
goto lookforsoa;
&soaset);
pass++;
goto lookforsoa;
if (seencname) {
goto out;
out:
if (droplabel) {
&tname);
reqoptions = 0;
static isc_result_t
unsigned int reqoptions;
&soaquery);
return (result);
goto fail;
goto fail;
reqoptions = 0;
return (ISC_R_SUCCESS);
fail:
return (result);
goto out;
goto out;
&tname);
resoptions = 0;
out:
static isc_result_t
isc_region_t r;
return (result);
goto fail;
goto fail;
goto fail;
goto fail;
r.length);
goto fail;
goto fail;
return (ISC_R_SUCCESS);
fail:
return (result);
return (ISC_R_NOMEMORY);
return (result);
return (result);
return (result);
unsigned int resoptions;
return (result);
return (ISC_R_NOMEMORY);
return (ISC_R_NOMEMORY);
goto fail;
goto fail;
goto fail;
goto fail;
&newname);
goto fail;
goto fail;
goto fail;
goto fail;
resoptions = 0;
if (want_tcp)
goto fail;
return (ISC_R_SUCCESS);
fail:
return (result);
if (need_destroyclient)
return (ISC_R_NOMEMORY);
(size -
isc_region_t r;
switch (op) {
case updateop_add:
case updateop_delete:
ttl = 0;
case updateop_notexist:
case updateop_exist:
ttl = 0;
case updateop_none:
INSIST(0);
return (ISC_R_SUCCESS);