summaryrefslogtreecommitdiff
path: root/minires
diff options
context:
space:
mode:
authorTed Lemon <source@isc.org>2001-01-16 22:34:47 +0000
committerTed Lemon <source@isc.org>2001-01-16 22:34:47 +0000
commit5abf0a44199693867fc2eb278dd9298364cc46f6 (patch)
treec7fcb801a7a6ee628ed6840a1b7f5f5b0a8e866e /minires
parent948274cfe71b1fb709018a2b4b7ed892b49e5547 (diff)
downloadisc-dhcp-5abf0a44199693867fc2eb278dd9298364cc46f6.tar.gz
Use ISC result codes instead of NS rcodes to report update errors.
Diffstat (limited to 'minires')
-rw-r--r--minires/Makefile.dist6
-rw-r--r--minires/ns_parse.c14
-rw-r--r--minires/ns_samedomain.c17
-rw-r--r--minires/ns_sign.c51
-rw-r--r--minires/ns_verify.c82
-rw-r--r--minires/res_findzonecut.c168
-rw-r--r--minires/res_mkquery.c22
-rw-r--r--minires/res_query.c95
-rw-r--r--minires/res_send.c49
-rw-r--r--minires/res_sendsigned.c60
-rw-r--r--minires/res_update.c35
11 files changed, 313 insertions, 286 deletions
diff --git a/minires/Makefile.dist b/minires/Makefile.dist
index c0525f19..bd785b67 100644
--- a/minires/Makefile.dist
+++ b/minires/Makefile.dist
@@ -23,11 +23,13 @@ MAN = dhcpctl.3
SRC = res_mkupdate.c res_init.c res_update.c res_send.c res_comp.c \
res_sendsigned.c res_findzonecut.c res_query.c res_mkquery.c \
ns_date.c ns_parse.c ns_sign.c ns_name.c ns_samedomain.c ns_verify.c \
- dst_api.c hmac_link.c md5_dgst.c prandom.c support.c base64.c
+ dst_api.c hmac_link.c md5_dgst.c prandom.c support.c base64.c \
+ toisc.c
OBJ = res_mkupdate.o res_init.o res_update.o res_send.o res_comp.o \
res_sendsigned.o res_findzonecut.o res_query.o res_mkquery.o \
ns_date.o ns_parse.o ns_sign.o ns_name.o ns_samedomain.o ns_verify.o \
- dst_api.o hmac_link.o md5_dgst.o prandom.o support.o base64.o
+ dst_api.o hmac_link.o md5_dgst.o prandom.o support.o base64.o \
+ toisc.o
HDRS = dst_internal.h md5.h md5_locl.h
DEBUG = -g
diff --git a/minires/ns_parse.c b/minires/ns_parse.c
index 2eb98992..27b06a1a 100644
--- a/minires/ns_parse.c
+++ b/minires/ns_parse.c
@@ -16,7 +16,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$Id: ns_parse.c,v 1.1 2000/02/02 07:28:15 mellon Exp $";
+static const char rcsid[] = "$Id: ns_parse.c,v 1.2 2001/01/16 22:33:08 mellon Exp $";
#endif
/* Import. */
@@ -127,13 +127,13 @@ ns_initparse(const u_char *msg, unsigned msglen, ns_msg *handle) {
return (0);
}
-int
+isc_result_t
ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) {
int b;
/* Make section right. */
if (section < 0 || section >= ns_s_max)
- RETERR(ENODEV);
+ return ISC_R_NOTIMPLEMENTED;
if (section != handle->_sect)
setsection(handle, section);
@@ -161,7 +161,7 @@ ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) {
return (-1);
handle->_ptr += b;
if (handle->_ptr + NS_INT16SZ + NS_INT16SZ > handle->_eom)
- RETERR(EMSGSIZE);
+ return ISC_R_NOSPACE;
rr->type = getUShort (handle->_ptr);
handle -> _ptr += 2;
rr->rr_class = getUShort (handle->_ptr);
@@ -172,13 +172,13 @@ ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) {
rr->rdata = NULL;
} else {
if (handle->_ptr + NS_INT32SZ + NS_INT16SZ > handle->_eom)
- RETERR(EMSGSIZE);
+ return ISC_R_NOSPACE;
rr->ttl = getULong (handle->_ptr);
handle -> _ptr += 4;
rr->rdlength = getUShort (handle->_ptr);
handle -> _ptr += 2;
if (handle->_ptr + rr->rdlength > handle->_eom)
- RETERR(EMSGSIZE);
+ return ISC_R_NOSPACE;
rr->rdata = handle->_ptr;
handle->_ptr += rr->rdlength;
}
@@ -186,7 +186,7 @@ ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) {
setsection(handle, (ns_sect)((int)section + 1));
/* All done. */
- return (0);
+ return ISC_R_SUCCESS;
}
/* Private. */
diff --git a/minires/ns_samedomain.c b/minires/ns_samedomain.c
index cc689a36..ac17a523 100644
--- a/minires/ns_samedomain.c
+++ b/minires/ns_samedomain.c
@@ -16,7 +16,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$Id: ns_samedomain.c,v 1.2 2000/02/02 19:59:15 mellon Exp $";
+static const char rcsid[] = "$Id: ns_samedomain.c,v 1.3 2001/01/16 22:33:09 mellon Exp $";
#endif
#include <sys/types.h>
@@ -163,13 +163,12 @@ ns_subdomain(const char *a, const char *b) {
* foo\\. -> foo\\.
*/
-int
+isc_result_t
ns_makecanon(const char *src, char *dst, size_t dstsize) {
size_t n = strlen(src);
if (n + sizeof "." > dstsize) {
- errno = EMSGSIZE;
- return (-1);
+ ISC_R_NOSPACE;
}
strcpy(dst, src);
while (n > 0 && dst[n - 1] == '.') /* Ends in "." */
@@ -180,7 +179,7 @@ ns_makecanon(const char *src, char *dst, size_t dstsize) {
dst[--n] = '\0';
dst[n++] = '.';
dst[n] = '\0';
- return (0);
+ return ISC_R_SUCCESS;
}
/*
@@ -196,9 +195,13 @@ ns_makecanon(const char *src, char *dst, size_t dstsize) {
int
ns_samename(const char *a, const char *b) {
char ta[NS_MAXDNAME], tb[NS_MAXDNAME];
+ isc_result_t status;
- if (ns_makecanon(a, ta, sizeof ta) < 0 ||
- ns_makecanon(b, tb, sizeof tb) < 0)
+ status = ns_makecanon(a, ta, sizeof ta);
+ if (status != ISC_R_SUCCESS)
+ return status;
+ status = ns_makecanon(b, tb, sizeof tb);
+ if (status != ISC_R_SUCCESS)
return (-1);
if (strcasecmp(ta, tb) == 0)
return (1);
diff --git a/minires/ns_sign.c b/minires/ns_sign.c
index 60d9693d..641751f5 100644
--- a/minires/ns_sign.c
+++ b/minires/ns_sign.c
@@ -16,7 +16,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$Id: ns_sign.c,v 1.2 2000/02/02 19:59:15 mellon Exp $";
+static const char rcsid[] = "$Id: ns_sign.c,v 1.3 2001/01/16 22:33:10 mellon Exp $";
#endif
/* Import. */
@@ -44,8 +44,7 @@ static const char rcsid[] = "$Id: ns_sign.c,v 1.2 2000/02/02 19:59:15 mellon Exp
#define BOUNDS_CHECK(ptr, count) \
do { \
if ((ptr) + (count) > eob) { \
- errno = EMSGSIZE; \
- return(NS_TSIG_ERROR_NO_SPACE); \
+ return ISC_R_NOSPACE; \
} \
} while (0)
@@ -68,7 +67,7 @@ static const char rcsid[] = "$Id: ns_sign.c,v 1.2 2000/02/02 19:59:15 mellon Exp
* - bad key / sign failed (-BADKEY)
* - not enough space (NS_TSIG_ERROR_NO_SPACE)
*/
-int
+isc_result_t
ns_sign(u_char *msg, unsigned *msglen, unsigned msgsize, int error, void *k,
const u_char *querysig, unsigned querysiglen, u_char *sig,
unsigned *siglen, time_t in_timesigned)
@@ -83,7 +82,7 @@ ns_sign(u_char *msg, unsigned *msglen, unsigned msgsize, int error, void *k,
dst_init();
if (msg == NULL || msglen == NULL || sig == NULL || siglen == NULL)
- return (-1);
+ ISC_R_INVALIDARG;
/* Name. */
if (key != NULL && error != ns_r_badsig && error != ns_r_badkey)
@@ -92,7 +91,7 @@ ns_sign(u_char *msg, unsigned *msglen, unsigned msgsize, int error, void *k,
else
n = dn_comp("", cp, (unsigned)(eob - cp), NULL, NULL);
if (n < 0)
- return (NS_TSIG_ERROR_NO_SPACE);
+ return ISC_R_NOSPACE;
name = cp;
cp += n;
@@ -107,14 +106,14 @@ ns_sign(u_char *msg, unsigned *msglen, unsigned msgsize, int error, void *k,
/* Alg. */
if (key != NULL && error != ns_r_badsig && error != ns_r_badkey) {
if (key->dk_alg != KEY_HMAC_MD5)
- return (-ns_r_badkey);
+ return ISC_R_BADKEY;
n = dn_comp(NS_TSIG_ALG_HMAC_MD5,
cp, (unsigned)(eob - cp), NULL, NULL);
}
else
n = dn_comp("", cp, (unsigned)(eob - cp), NULL, NULL);
if (n < 0)
- return (NS_TSIG_ERROR_NO_SPACE);
+ ISC_R_NOSPACE;
alg = cp;
cp += n;
@@ -186,7 +185,7 @@ ns_sign(u_char *msg, unsigned *msglen, unsigned msgsize, int error, void *k,
n = dst_sign_data(SIG_MODE_FINAL, key, &ctx, NULL, 0,
sig, *siglen);
if (n < 0)
- return (-ns_r_badkey);
+ ISC_R_BADKEY;
*siglen = n;
} else
*siglen = 0;
@@ -218,28 +217,29 @@ ns_sign(u_char *msg, unsigned *msglen, unsigned msgsize, int error, void *k,
hp->arcount = htons(ntohs(hp->arcount) + 1);
*msglen = (cp - msg);
- return (0);
+ return ISC_R_SUCCESS;
}
-int
+#if 0
+isc_result_t
ns_sign_tcp_init(void *k, const u_char *querysig, unsigned querysiglen,
ns_tcp_tsig_state *state)
{
dst_init();
if (state == NULL || k == NULL || querysig == NULL || querysiglen < 0)
- return (-1);
+ return ISC_R_INVALIDARG;
state->counter = -1;
state->key = k;
if (state->key->dk_alg != KEY_HMAC_MD5)
- return (-ns_r_badkey);
+ return ISC_R_BADKEY;
if (querysiglen > sizeof(state->sig))
- return (-1);
+ return ISC_R_NOSPACE;
memcpy(state->sig, querysig, querysiglen);
state->siglen = querysiglen;
- return (0);
+ return ISC_R_SUCCESS;
}
-int
+isc_result_t
ns_sign_tcp(u_char *msg, unsigned *msglen, unsigned msgsize, int error,
ns_tcp_tsig_state *state, int done)
{
@@ -250,13 +250,13 @@ ns_sign_tcp(u_char *msg, unsigned *msglen, unsigned msgsize, int error,
int n;
if (msg == NULL || msglen == NULL || state == NULL)
- return (-1);
+ return ISC_R_INVALIDARG;
state->counter++;
if (state->counter == 0)
- return (ns_sign(msg, msglen, msgsize, error, state->key,
- state->sig, state->siglen,
- state->sig, &state->siglen, 0));
+ return ns_sign(msg, msglen, msgsize, error, state->key,
+ state->sig, state->siglen,
+ state->sig, &state->siglen, 0);
if (state->siglen > 0) {
u_int16_t siglen_n = htons(state->siglen);
@@ -273,7 +273,7 @@ ns_sign_tcp(u_char *msg, unsigned *msglen, unsigned msgsize, int error,
NULL, 0);
if (done == 0 && (state->counter % 100 != 0))
- return (0);
+ return ISC_R_SUCCESS;
cp = msg + *msglen;
eob = msg + msgsize;
@@ -282,7 +282,7 @@ ns_sign_tcp(u_char *msg, unsigned *msglen, unsigned msgsize, int error,
n = dn_comp(state->key->dk_key_name,
cp, (unsigned)(eob - cp), NULL, NULL);
if (n < 0)
- return (NS_TSIG_ERROR_NO_SPACE);
+ return ISC_R_NOSPACE;
cp += n;
/* Type, class, ttl, length (not filled in yet). */
@@ -297,7 +297,7 @@ ns_sign_tcp(u_char *msg, unsigned *msglen, unsigned msgsize, int error,
n = dn_comp(NS_TSIG_ALG_HMAC_MD5,
cp, (unsigned)(eob - cp), NULL, NULL);
if (n < 0)
- return (NS_TSIG_ERROR_NO_SPACE);
+ return ISC_R_NOSPACE;
cp += n;
/* Time. */
@@ -323,7 +323,7 @@ ns_sign_tcp(u_char *msg, unsigned *msglen, unsigned msgsize, int error,
n = dst_sign_data(SIG_MODE_FINAL, state->key, &state->ctx, NULL, 0,
state->sig, sizeof(state->sig));
if (n < 0)
- return (-ns_r_badkey);
+ return ISC_R_BADKEY;
state->siglen = n;
/* Add the signature. */
@@ -346,5 +346,6 @@ ns_sign_tcp(u_char *msg, unsigned *msglen, unsigned msgsize, int error,
hp->arcount = htons(ntohs(hp->arcount) + 1);
*msglen = (cp - msg);
- return (0);
+ return ISC_R_SUCCESS;
}
+#endif
diff --git a/minires/ns_verify.c b/minires/ns_verify.c
index 31bbc5b7..b6ce6897 100644
--- a/minires/ns_verify.c
+++ b/minires/ns_verify.c
@@ -16,7 +16,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$Id: ns_verify.c,v 1.2 2000/02/02 19:59:16 mellon Exp $";
+static const char rcsid[] = "$Id: ns_verify.c,v 1.3 2001/01/16 22:33:11 mellon Exp $";
#endif
/* Import. */
@@ -126,7 +126,7 @@ ns_find_tsig(u_char *msg, u_char *eom) {
* - TSIG verification succeeds, error set to BADSIG (ns_r_badsig)
* - TSIG verification succeeds, error set to BADTIME (ns_r_badtime)
*/
-int
+isc_result_t
ns_verify(u_char *msg, unsigned *msglen, void *k,
const u_char *querysig, unsigned querysiglen,
u_char *sig, unsigned *siglen, time_t *timesigned, int nostrip)
@@ -144,41 +144,41 @@ ns_verify(u_char *msg, unsigned *msglen, void *k,
dst_init();
if (msg == NULL || msglen == NULL || *msglen < 0)
- return (-1);
+ return ISC_R_INVALIDARG;
eom = msg + *msglen;
recstart = ns_find_tsig(msg, eom);
if (recstart == NULL)
- return (NS_TSIG_ERROR_NO_TSIG);
+ return ISC_R_NO_TSIG;
cp = recstart;
/* Read the key name. */
n = dn_expand(msg, eom, cp, name, MAXDNAME);
if (n < 0)
- return (NS_TSIG_ERROR_FORMERR);
+ return ISC_R_FORMERR;
cp += n;
/* Read the type. */
BOUNDS_CHECK(cp, 2*INT16SZ + INT32SZ + INT16SZ);
GETSHORT(type, cp);
if (type != ns_t_tsig)
- return (NS_TSIG_ERROR_NO_TSIG);
+ return ISC_R_NO_TSIG;
/* Skip the class and TTL, save the length. */
cp += INT16SZ + INT32SZ;
GETSHORT(length, cp);
if (eom - cp != length)
- return (NS_TSIG_ERROR_FORMERR);
+ return ISC_R_FORMERR;
/* Read the algorithm name. */
rdatastart = cp;
n = dn_expand(msg, eom, cp, alg, MAXDNAME);
if (n < 0)
- return (NS_TSIG_ERROR_FORMERR);
+ return ISC_R_FORMERR;
if (ns_samename(alg, NS_TSIG_ALG_HMAC_MD5) != 1)
- return (-ns_r_badkey);
+ return ISC_R_INVALIDKEY;
cp += n;
/* Read the time signed and fudge. */
@@ -207,15 +207,15 @@ ns_verify(u_char *msg, unsigned *msglen, void *k,
cp += otherfieldlen;
if (cp != eom)
- return (NS_TSIG_ERROR_FORMERR);
+ return ISC_R_FORMERR;
/* Verify that the key used is OK. */
if (key != NULL) {
if (key->dk_alg != KEY_HMAC_MD5)
- return (-ns_r_badkey);
+ return ISC_R_INVALIDKEY;
if (error != ns_r_badsig && error != ns_r_badkey) {
if (ns_samename(key->dk_key_name, name) != 1)
- return (-ns_r_badkey);
+ return ISC_R_INVALIDKEY;
}
}
@@ -271,17 +271,17 @@ ns_verify(u_char *msg, unsigned *msglen, void *k,
sigstart, sigfieldlen);
if (n < 0)
- return (-ns_r_badsig);
+ return ISC_R_BADSIG;
if (sig != NULL && siglen != NULL) {
if (*siglen < sigfieldlen)
- return (NS_TSIG_ERROR_NO_SPACE);
+ return ISC_R_NOSPACE;
memcpy(sig, sigstart, sigfieldlen);
*siglen = sigfieldlen;
}
} else {
if (sigfieldlen > 0)
- return (NS_TSIG_ERROR_FORMERR);
+ return ISC_R_FORMERR;
if (sig != NULL && siglen != NULL)
*siglen = 0;
}
@@ -291,7 +291,7 @@ ns_verify(u_char *msg, unsigned *msglen, void *k,
/* Verify the time. */
if (abs((*timesigned) - time(NULL)) > fudge)
- return (-ns_r_badtime);
+ return ISC_R_BADTIME;
if (nostrip == 0) {
*msglen = recstart - msg;
@@ -299,30 +299,31 @@ ns_verify(u_char *msg, unsigned *msglen, void *k,
}
if (error != NOERROR)
- return (error);
+ return ns_rcode_to_isc (error);
- return (0);
+ return ISC_R_SUCCESS;
}
-int
+#if 0
+isc_result_t
ns_verify_tcp_init(void *k, const u_char *querysig, unsigned querysiglen,
ns_tcp_tsig_state *state)
{
dst_init();
if (state == NULL || k == NULL || querysig == NULL || querysiglen < 0)
- return (-1);
+ return ISC_R_INVALIDARG;
state->counter = -1;
state->key = k;
if (state->key->dk_alg != KEY_HMAC_MD5)
- return (-ns_r_badkey);
+ return ISC_R_BADKEY;
if (querysiglen > sizeof(state->sig))
- return (-1);
+ return ISC_R_NOSPACE;
memcpy(state->sig, querysig, querysiglen);
state->siglen = querysiglen;
- return (0);
+ return ISC_R_SUCCESS;
}
-int
+isc_result_t
ns_verify_tcp(u_char *msg, unsigned *msglen, ns_tcp_tsig_state *state,
int required)
{
@@ -336,7 +337,7 @@ ns_verify_tcp(u_char *msg, unsigned *msglen, ns_tcp_tsig_state *state,
time_t timesigned;
if (msg == NULL || msglen == NULL || state == NULL)
- return (-1);
+ return ISC_R_INVALIDARG;
state->counter++;
if (state->counter == 0)
@@ -360,10 +361,10 @@ ns_verify_tcp(u_char *msg, unsigned *msglen, ns_tcp_tsig_state *state,
if (recstart == NULL) {
if (required)
- return (NS_TSIG_ERROR_NO_TSIG);
+ return ISC_R_NO_TSIG;
dst_verify_data(SIG_MODE_UPDATE, state->key, &state->ctx,
msg, *msglen, NULL, 0);
- return (0);
+ return ISC_R_SUCCESS;
}
hp->arcount = htons(ntohs(hp->arcount) - 1);
@@ -373,34 +374,34 @@ ns_verify_tcp(u_char *msg, unsigned *msglen, ns_tcp_tsig_state *state,
/* Read the key name. */
n = dn_expand(msg, eom, cp, name, MAXDNAME);
if (n < 0)
- return (NS_TSIG_ERROR_FORMERR);
+ return ISC_R_FORMERR;
cp += n;
/* Read the type. */
BOUNDS_CHECK(cp, 2*INT16SZ + INT32SZ + INT16SZ);
GETSHORT(type, cp);
if (type != ns_t_tsig)
- return (NS_TSIG_ERROR_NO_TSIG);
+ return ISC_R_NO_TSIG;
/* Skip the class and TTL, save the length. */
cp += INT16SZ + INT32SZ;
GETSHORT(length, cp);
if (eom - cp != length)
- return (NS_TSIG_ERROR_FORMERR);
+ return ISC_R_FORMERR;
/* Read the algorithm name. */
rdatastart = cp;
n = dn_expand(msg, eom, cp, alg, MAXDNAME);
if (n < 0)
- return (NS_TSIG_ERROR_FORMERR);
+ return ISC_R_FORMERR;
if (ns_samename(alg, NS_TSIG_ALG_HMAC_MD5) != 1)
- return (-ns_r_badkey);
+ return ISC_R_BADKEY;
cp += n;
/* Verify that the key used is OK. */
if ((ns_samename(state->key->dk_key_name, name) != 1 ||
state->key->dk_alg != KEY_HMAC_MD5))
- return (-ns_r_badkey);
+ return ISC_R_BADKEY;
/* Read the time signed and fudge. */
BOUNDS_CHECK(cp, INT16SZ + INT32SZ + INT16SZ);
@@ -427,7 +428,7 @@ ns_verify_tcp(u_char *msg, unsigned *msglen, ns_tcp_tsig_state *state,
cp += otherfieldlen;
if (cp != eom)
- return (NS_TSIG_ERROR_FORMERR);
+ return ISC_R_FORMERR;
/*
* Do the verification.
@@ -445,25 +446,26 @@ ns_verify_tcp(u_char *msg, unsigned *msglen, ns_tcp_tsig_state *state,
n = dst_verify_data(SIG_MODE_FINAL, state->key, &state->ctx, NULL, 0,
sigstart, sigfieldlen);
if (n < 0)
- return (-ns_r_badsig);
+ return ISC_R_BADSIG;
if (sigfieldlen > sizeof(state->sig))
- return (ns_r_badsig);
+ return ISC_R_BADSIG;
if (sigfieldlen > sizeof(state->sig))
- return (NS_TSIG_ERROR_NO_SPACE);
+ return ISC_R_NOSPACE;
memcpy(state->sig, sigstart, sigfieldlen);
state->siglen = sigfieldlen;
/* Verify the time. */
if (abs(timesigned - time(NULL)) > fudge)
- return (-ns_r_badtime);
+ return ISC_R_BADTIME;
*msglen = recstart - msg;
if (error != NOERROR)
- return (error);
+ return ns_rcode_to_isc (error);
- return (0);
+ return ISC_R_SUCCESS;
}
+#endif
diff --git a/minires/res_findzonecut.c b/minires/res_findzonecut.c
index aae8b236..d56c8bab 100644
--- a/minires/res_findzonecut.c
+++ b/minires/res_findzonecut.c
@@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
-static const char rcsid[] = "$Id: res_findzonecut.c,v 1.10 2000/10/12 09:04:24 mellon Exp $";
+static const char rcsid[] = "$Id: res_findzonecut.c,v 1.11 2001/01/16 22:33:13 mellon Exp $";
#endif /* not lint */
/*
@@ -64,12 +64,12 @@ static int add_addrs(res_state, rr_ns *, struct in_addr *, int);
static ns_rcode get_soa(res_state, const char *, ns_class,
char *, size_t, char *, size_t,
rrset_ns *);
-static int get_ns(res_state, const char *, ns_class, rrset_ns *);
-static ns_rcode get_glue(res_state, ns_class, rrset_ns *);
-static int save_ns(res_state, ns_msg *, ns_sect,
- const char *, ns_class, rrset_ns *);
-static int save_a(res_state, ns_msg *, ns_sect,
- const char *, ns_class, rrset_a *);
+static isc_result_t get_ns(res_state, const char *, ns_class, rrset_ns *);
+static isc_result_t get_glue(res_state, ns_class, rrset_ns *);
+static isc_result_t save_ns(res_state, ns_msg *, ns_sect,
+ const char *, ns_class, rrset_ns *);
+static isc_result_t save_a(res_state, ns_msg *, ns_sect,
+ const char *, ns_class, rrset_a *);
static void free_nsrrset(rrset_ns *);
static void free_nsrr(rrset_ns *, rr_ns *);
static rr_ns * find_ns(rrset_ns *, const char *);
@@ -142,7 +142,7 @@ res_findzonecut(res_state statp, const char *dname, ns_class class, int opts,
u_long save_pfcode;
rrset_ns nsrrs;
int n = 0;
- ns_rcode rcode;
+ isc_result_t rcode;
DPRINTF(("START dname='%s' class=%s, zsize=%ld, naddrs=%d",
dname, p_class(class), (long)zsize, naddrs));
@@ -153,9 +153,9 @@ res_findzonecut(res_state statp, const char *dname, ns_class class, int opts,
ISC_LIST_INIT(nsrrs);
DPRINTF (("look for a predefined zone statement"));
- rcode = find_cached_zone (dname, class, zname, zsize, addrs, naddrs,
- &n, zcookie);
- if (rcode == ns_r_noerror)
+ rcode = find_cached_zone (dname, class, zname, zsize,
+ addrs, naddrs, &n, zcookie);
+ if (rcode == ISC_R_SUCCESS)
goto done;
DPRINTF(("get the soa, and see if it has enough glue"));
@@ -245,15 +245,16 @@ get_soa(res_state statp, const char *dname, ns_class class,
ns_sect sect;
ns_msg msg;
u_int rcode;
- ns_rcode status;
+ isc_result_t status;
/*
* Find closest enclosing SOA, even if it's for the root zone.
*/
/* First canonicalize dname (exactly one unescaped trailing "."). */
- if (ns_makecanon(dname, tname, sizeof tname) < 0)
- return ns_r_servfail;
+ status = ns_makecanon(dname, tname, sizeof tname);
+ if (status != ISC_R_SUCCESS)
+ return status;
dname = tname;
/* Now grovel the subdomains, hunting for an SOA answer or auth. */
@@ -289,10 +290,11 @@ get_soa(res_state statp, const char *dname, ns_class class,
int rdlen;
ns_rr rr;
- if (ns_parserr(&msg, sect, i, &rr) < 0) {
+ rcode = ns_parserr(&msg, sect, i, &rr) < 0;
+ if (rcode != ISC_R_SUCCESS) {
DPRINTF(("get_soa: ns_parserr(%s, %d) failed",
p_section(sect, ns_o_query), i));
- return ns_r_servfail;
+ return rcode;
}
if (ns_rr_type(rr) == ns_t_cname ||
ns_rr_type(rr) == ns_t_dname)
@@ -304,19 +306,18 @@ get_soa(res_state statp, const char *dname, ns_class class,
switch (sect) {
case ns_s_an:
if (ns_samedomain(dname, t) == 0) {
- DPRINTF(("get_soa: ns_samedomain('%s', '%s') == 0",
- dname, t));
- errno = EPROTOTYPE;
- return ns_r_notzone;
+ DPRINTF(("get_soa: %s'%s', '%s') == 0",
+ "ns_samedomain(", dname, t));
+ return ISC_R_NOTZONE;
}
break;
case ns_s_ns:
if (ns_samename(dname, t) == 1 ||
ns_samedomain(dname, t) == 0) {
- DPRINTF(("get_soa: ns_samename() || !ns_samedomain('%s', '%s')",
+ DPRINTF(("get_soa: %smain('%s', '%s')",
+ "ns_samename() || !ns_samedo",
dname, t));
- errno = EPROTOTYPE;
- return ns_r_notzone;
+ return ISC_R_NOTZONE;
}
break;
default:
@@ -325,8 +326,7 @@ get_soa(res_state statp, const char *dname, ns_class class,
if (strlen(t) + 1 > zsize) {
DPRINTF(("get_soa: zname(%d) too small (%d)",
zsize, strlen(t) + 1));
- errno = EMSGSIZE;
- return ns_r_servfail;
+ return ISC_R_NOSPACE;
}
strcpy(zname, t);
rdata = ns_rr_rdata(rr);
@@ -334,15 +334,17 @@ get_soa(res_state statp, const char *dname, ns_class class,
if (ns_name_uncompress((u_char *)resp,
ns_msg_end(msg), rdata,
mname, msize) < 0) {
- DPRINTF(("get_soa: ns_name_uncompress failed"));
- return ns_r_servfail;
+ DPRINTF(("get_soa: %s failed",
+ "ns_name_uncompress"));
+ return ISC_R_NOMEMORY;
}
- if (save_ns(statp, &msg, ns_s_ns,
- zname, class, nsrrsp) < 0) {
+ rcode = save_ns(statp, &msg,
+ ns_s_ns, zname, class, nsrrsp);
+ if (rcode != ISC_R_SUCCESS) {
DPRINTF(("get_soa: save_ns failed"));
- return ns_r_servfail;
+ return rcode;
}
- return ns_r_noerror;
+ return ISC_R_SUCCESS;
}
/* If we're out of labels, then not even "." has an SOA! */
@@ -353,43 +355,42 @@ get_soa(res_state statp, const char *dname, ns_class class,
while (*dname != '.') {
if (*dname == '\\')
if (*++dname == '\0') {
- errno = EMSGSIZE;
- return ns_r_servfail;
+ ISC_R_NOSPACE;
}
dname++;
}
}
DPRINTF(("get_soa: out of labels"));
- errno = EDESTADDRREQ;
- return ns_r_servfail;
+ return ISC_R_DESTADDRREQ;
}
-static int
+static isc_result_t
get_ns(res_state statp, const char *zname, ns_class class, rrset_ns *nsrrsp) {
double resp[NS_PACKETSZ / sizeof (double)];
ns_msg msg;
int n;
- ns_rcode rcode;
+ isc_result_t rcode;
/* Go and get the NS RRs for this zone. */
rcode = do_query(statp, zname, class, ns_t_ns, resp, &msg, &n);
- if (rcode != ns_r_noerror) {
+ if (rcode != ISC_R_SUCCESS) {
DPRINTF(("get_ns: do_query('zname', %s) failed (%d)",
zname, p_class(class), rcode));
return rcode;
}
/* Remember the NS RRs and associated A RRs that came back. */
- if (save_ns(statp, &msg, ns_s_an, zname, class, nsrrsp) < 0) {
+ rcode = save_ns(statp, &msg, ns_s_an, zname, class, nsrrsp);
+ if (rcode != ISC_R_SUCCESS) {
DPRINTF(("get_ns save_ns('%s', %s) failed",
zname, p_class(class)));
- return ns_r_servfail;
+ return rcode;
}
- return ns_r_noerror;
+ return ISC_R_SUCCESS;
}
-static ns_rcode
+static isc_result_t
get_glue(res_state statp, ns_class class, rrset_ns *nsrrsp) {
rr_ns *nsrr, *nsrr_n;
@@ -398,28 +399,29 @@ get_glue(res_state statp, ns_class class, rrset_ns *nsrrsp) {
double resp[NS_PACKETSZ / sizeof (double)];
ns_msg msg;
int n;
- ns_rcode rcode;
+ isc_result_t rcode;
nsrr_n = ISC_LIST_NEXT(nsrr, link);
if (ISC_LIST_EMPTY(nsrr->addrs)) {
rcode = do_query(statp, nsrr->name, class, ns_t_a,
resp, &msg, &n);
- if (rcode != ns_r_noerror) {
- DPRINTF(("get_glue: do_query('%s', %s') failed",
- nsrr->name, p_class(class)));
- return rcode;
+ if (rcode != ISC_R_SUCCESS) {
+ DPRINTF(("get_glue: do_query('%s', %s') failed",
+ nsrr->name, p_class(class)));
+ return rcode;
}
if (n > 0) {
DPRINTF((
"get_glue: do_query('%s', %s') CNAME or DNAME found",
nsrr->name, p_class(class)));
}
- if (save_a(statp, &msg, ns_s_an, nsrr->name, class,
- &nsrr->addrs) < 0) {
+ rcode = save_a(statp, &msg, ns_s_an, nsrr->name, class,
+ &nsrr->addrs);
+ if (rcode != ISC_R_SUCCESS) {
DPRINTF(("get_glue: save_r('%s', %s) failed",
nsrr->name, p_class(class)));
- return ns_r_servfail;
+ return rcode;
}
/* If it's still empty, it's just chaff. */
if (ISC_LIST_EMPTY(nsrr->addrs)) {
@@ -429,15 +431,16 @@ get_glue(res_state statp, ns_class class, rrset_ns *nsrrsp) {
}
}
}
- return ns_r_noerror;
+ return ISC_R_SUCCESS;
}
-static int
+static isc_result_t
save_ns(res_state statp, ns_msg *msg, ns_sect sect,
const char *owner, ns_class class,
rrset_ns *nsrrsp)
{
int i;
+ isc_result_t rcode;
for (i = 0; i < ns_msg_count(*msg, sect); i++) {
char tname[MAXDNAME];
@@ -446,10 +449,11 @@ save_ns(res_state statp, ns_msg *msg, ns_sect sect,
ns_rr rr;
int rdlen;
- if (ns_parserr(msg, sect, i, &rr) < 0) {
+ rcode = ns_parserr(msg, sect, i, &rr);
+ if (rcode != ISC_R_SUCCESS) {
DPRINTF(("save_ns: ns_parserr(%s, %d) failed",
p_section(sect, ns_o_query), i));
- return (-1);
+ return rcode;
}
if (ns_rr_type(rr) != ns_t_ns ||
ns_rr_class(rr) != class ||
@@ -460,7 +464,7 @@ save_ns(res_state statp, ns_msg *msg, ns_sect sect,
nsrr = malloc(sizeof *nsrr);
if (nsrr == NULL) {
DPRINTF(("save_ns: malloc failed"));
- return (-1);
+ return ISC_R_NOMEMORY;
}
rdata = ns_rr_rdata(rr);
rdlen = ns_rr_rdlen(rr);
@@ -469,42 +473,45 @@ save_ns(res_state statp, ns_msg *msg, ns_sect sect,
tname, sizeof tname) < 0) {
DPRINTF(("save_ns: ns_name_uncompress failed"));
free(nsrr);
- return (-1);
+ return ISC_R_NOMEMORY;
}
nsrr->name = strdup(tname);
if (nsrr->name == NULL) {
DPRINTF(("save_ns: strdup failed"));
free(nsrr);
- return (-1);
+ return ISC_R_NOMEMORY;
}
ISC_LIST_INIT(nsrr->addrs);
ISC_LIST_APPEND(*nsrrsp, nsrr, link);
}
- if (save_a(statp, msg, ns_s_ar,
- nsrr->name, class, &nsrr->addrs) < 0) {
+ rcode = save_a(statp, msg, ns_s_ar,
+ nsrr->name, class, &nsrr->addrs);
+ if (rcode != ISC_R_SUCCESS) {
DPRINTF(("save_ns: save_r('%s', %s) failed",
nsrr->name, p_class(class)));
- return (-1);
+ return rcode;
}
}
- return (0);
+ return ISC_R_SUCCESS;
}
-static int
+static isc_result_t
save_a(res_state statp, ns_msg *msg, ns_sect sect,
const char *owner, ns_class class,
rrset_a *arrsp)
{
int i;
+ isc_result_t rcode;
for (i = 0; i < ns_msg_count(*msg, sect); i++) {
ns_rr rr;
rr_a *arr;
- if (ns_parserr(msg, sect, i, &rr) < 0) {
+ rcode = ns_parserr(msg, sect, i, &rr);
+ if (rcode != ISC_R_SUCCESS) {
DPRINTF(("save_a: ns_parserr(%s, %d) failed",
p_section(sect, ns_o_query), i));
- return (-1);
+ return rcode;
}
if (ns_rr_type(rr) != ns_t_a ||
ns_rr_class(rr) != class ||
@@ -514,12 +521,12 @@ save_a(res_state statp, ns_msg *msg, ns_sect sect,
arr = malloc(sizeof *arr);
if (arr == NULL) {
DPRINTF(("save_a: malloc failed"));
- return (-1);
+ return ISC_R_NOMEMORY;
}
memcpy(&arr->addr, ns_rr_rdata(rr), NS_INADDRSZ);
ISC_LIST_APPEND(*arrsp, arr, link);
}
- return (0);
+ return ISC_R_SUCCESS;
}
static void
@@ -554,41 +561,42 @@ find_ns(rrset_ns *nsrrsp, const char *dname) {
return (NULL);
}
-static ns_rcode
+static isc_result_t
do_query(res_state statp, const char *dname, ns_class class, ns_type qtype,
double *resp, ns_msg *msg, int *alias_count)
{
double req[NS_PACKETSZ / sizeof (double)];
int i;
unsigned n;
+ isc_result_t status;
- n = res_nmkquery(statp, ns_o_query, dname, class, qtype,
- NULL, 0, NULL, req, NS_PACKETSZ);
- if (n < 0) {
+ status = res_nmkquery(statp, ns_o_query, dname, class, qtype,
+ NULL, 0, NULL, req, NS_PACKETSZ, &n);
+ if (status != ISC_R_SUCCESS) {
DPRINTF(("do_query: res_nmkquery failed"));
- return ns_r_servfail;
+ return status;
}
- n = res_nsend(statp, req, n, resp, NS_PACKETSZ);
- if (n < 0) {
+ status = res_nsend(statp, req, n, resp, NS_PACKETSZ, &n);
+ if (status != ISC_R_SUCCESS) {
DPRINTF(("do_query: res_nsend failed"));
- return ns_r_servfail;
+ return status;
}
if (n == 0) {
DPRINTF(("do_query: res_nsend returned 0"));
- errno = EMSGSIZE;
- return ns_r_servfail;
+ return ISC_R_NOTFOUND;
}
if (ns_initparse((u_char *)resp, n, msg) < 0) {
DPRINTF(("do_query: ns_initparse failed"));
- return ns_r_servfail;
+ return ISC_R_NOSPACE;
}
n = 0;
for (i = 0; i < ns_msg_count(*msg, ns_s_an); i++) {
ns_rr rr;
- if (ns_parserr(msg, ns_s_an, i, &rr) < 0) {
+ status = ns_parserr(msg, ns_s_an, i, &rr);
+ if (status != ISC_R_SUCCESS) {
DPRINTF(("do_query: ns_parserr failed"));
- return ns_r_servfail;
+ return status;
}
n += (ns_rr_class(rr) == class &&
(ns_rr_type(rr) == ns_t_cname ||
@@ -596,5 +604,5 @@ do_query(res_state statp, const char *dname, ns_class class, ns_type qtype,
}
if (alias_count)
*alias_count = n;
- return (ns_rcode)ns_msg_getflag (*msg, ns_f_rcode);
+ return ns_rcode_to_isc (ns_msg_getflag (*msg, ns_f_rcode));
}
diff --git a/minires/res_mkquery.c b/minires/res_mkquery.c
index f21cd1a3..88fe7e6a 100644
--- a/minires/res_mkquery.c
+++ b/minires/res_mkquery.c
@@ -70,7 +70,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static const char sccsid[] = "@(#)res_mkquery.c 8.1 (Berkeley) 6/4/93";
-static const char rcsid[] = "$Id: res_mkquery.c,v 1.3 2000/07/17 20:51:13 mellon Exp $";
+static const char rcsid[] = "$Id: res_mkquery.c,v 1.4 2001/01/16 22:33:14 mellon Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@@ -90,7 +90,7 @@ extern const char *_res_opcodes[];
* Form all types of queries.
* Returns the size of the result or -1.
*/
-int
+isc_result_t
res_nmkquery(res_state statp,
int op, /* opcode of query */
const char *dname, /* domain name */
@@ -99,7 +99,8 @@ res_nmkquery(res_state statp,
unsigned datalen, /* length of data */
const u_char *newrr_in, /* new rr for modify or append */
double *buf, /* buffer to put query */
- unsigned buflen) /* size of buffer */
+ unsigned buflen, /* size of buffer */
+ unsigned *rbuflen) /* returned size of buffer */
{
register HEADER *hp;
register u_char *cp;
@@ -110,7 +111,7 @@ res_nmkquery(res_state statp,
* Initialize header fields.
*/
if ((buf == NULL) || (buflen < HFIXEDSZ))
- return (-1);
+ return ISC_R_INVALIDARG;
memset(buf, 0, HFIXEDSZ);
hp = (HEADER *) buf;
hp->id = htons(++statp->id);
@@ -130,9 +131,9 @@ res_nmkquery(res_state statp,
case QUERY: /*FALLTHROUGH*/
case NS_NOTIFY_OP:
if ((buflen -= QFIXEDSZ) < 0)
- return (-1);
+ return ISC_R_NOSPACE;
if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
- return (-1);
+ return ISC_R_NOSPACE;
cp += n;
buflen -= n;
putUShort(cp, type);
@@ -148,7 +149,7 @@ res_nmkquery(res_state statp,
buflen -= RRFIXEDSZ;
n = dn_comp((const char *)data, cp, buflen, dnptrs, lastdnptr);
if (n < 0)
- return (-1);
+ return ISC_R_NOSPACE;
cp += n;
buflen -= n;
putUShort(cp, T_NULL);
@@ -167,7 +168,7 @@ res_nmkquery(res_state statp,
* Initialize answer section
*/
if (buflen < 1 + RRFIXEDSZ + datalen)
- return (-1);
+ return ISC_R_NOSPACE;
*cp++ = '\0'; /* no domain name */
putUShort(cp, type);
cp += INT16SZ;
@@ -185,7 +186,8 @@ res_nmkquery(res_state statp,
break;
default:
- return (-1);
+ return ISC_R_NOTIMPLEMENTED;
}
- return (cp - ((u_char *)buf));
+ *rbuflen = cp - ((u_char *)buf);
+ return ISC_R_SUCCESS;
}
diff --git a/minires/res_query.c b/minires/res_query.c
index 69e6fb9e..412da65a 100644
--- a/minires/res_query.c
+++ b/minires/res_query.c
@@ -70,7 +70,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static const char sccsid[] = "@(#)res_query.c 8.1 (Berkeley) 6/4/93";
-static const char rcsid[] = "$Id: res_query.c,v 1.3 2000/07/17 20:51:16 mellon Exp $";
+static const char rcsid[] = "$Id: res_query.c,v 1.4 2001/01/16 22:33:15 mellon Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@@ -107,16 +107,18 @@ static const char rcsid[] = "$Id: res_query.c,v 1.3 2000/07/17 20:51:16 mellon E
*
* Caller must parse answer and determine whether it answers the question.
*/
-int
+isc_result_t
res_nquery(res_state statp,
const char *name, /* domain name */
ns_class class, ns_type type, /* class and type of query */
double *answer, /* buffer to put answer */
- unsigned anslen) /* size of answer buffer */
+ unsigned anslen,
+ unsigned *ansret) /* size of answer buffer */
{
double buf[MAXPACKET / sizeof (double)];
HEADER *hp = (HEADER *) answer;
unsigned n;
+ isc_result_t rcode;
hp->rcode = NOERROR; /* default */
@@ -125,24 +127,24 @@ res_nquery(res_state statp,
printf(";; res_query(%s, %d, %d)\n", name, class, type);
#endif
- n = res_nmkquery(statp, QUERY, name, class, type, NULL, 0, NULL,
- buf, sizeof(buf));
- if (n <= 0) {
+ rcode = res_nmkquery(statp, QUERY, name, class, type, NULL, 0, NULL,
+ buf, sizeof(buf), &n);
+ if (rcode != ISC_R_SUCCESS) {
#ifdef DEBUG
if (statp->options & RES_DEBUG)
printf(";; res_query: mkquery failed\n");
#endif
RES_SET_H_ERRNO(statp, NO_RECOVERY);
- return (n);
+ return rcode;
}
- n = res_nsend(statp, buf, n, answer, anslen);
- if (n < 0) {
+ rcode = res_nsend(statp, buf, n, answer, anslen, &n);
+ if (rcode != ISC_R_SUCCESS) {
#ifdef DEBUG
if (statp->options & RES_DEBUG)
printf(";; res_query: send error\n");
#endif
RES_SET_H_ERRNO(statp, TRY_AGAIN);
- return (n);
+ return rcode;
}
if (hp->rcode != NOERROR || ntohs(hp->ancount) == 0) {
@@ -168,23 +170,26 @@ res_nquery(res_state statp,
RES_SET_H_ERRNO(statp, NO_RECOVERY);
break;
}
- return (-1);
+ return ns_rcode_to_isc (hp -> rcode);
}
- return (n);
+ *ansret = n;
+ return ISC_R_SUCCESS;
}
+#if 0
/*
* Formulate a normal query, send, and retrieve answer in supplied buffer.
* Return the size of the response on success, -1 on error.
* If enabled, implement search rules until answer or unrecoverable failure
* is detected. Error code, if any, is left in H_ERRNO.
*/
-int
+isc_result_t
res_nsearch(res_state statp,
const char *name, /* domain name */
ns_class class, ns_type type, /* class and type of query */
double *answer, /* buffer to put answer */
- unsigned anslen) /* size of answer */
+ unsigned anslen,
+ unsigned *ansret) /* size of answer */
{
const char *cp, * const *domain;
HEADER *hp = (HEADER *) answer;
@@ -192,6 +197,7 @@ res_nsearch(res_state statp,
u_int dots;
int trailing_dot, ret;
int got_nodata = 0, got_servfail = 0, root_on_list = 0;
+ isc_result_t rcode;
errno = 0;
RES_SET_H_ERRNO(statp, HOST_NOT_FOUND); /* True if we never query. */
@@ -205,15 +211,16 @@ res_nsearch(res_state statp,
/* If there aren't any dots, it could be a user-level alias. */
if (!dots && (cp = res_hostalias(statp, name, tmp, sizeof tmp))!= NULL)
- return (res_nquery(statp, cp, class, type, answer, anslen));
+ return res_nquery(statp, cp, class, type,
+ answer, anslen, ansret);
/*
* If there are enough dots in the name, do no searching.
* (The threshold can be set with the "ndots" option.)
*/
if (dots >= statp->ndots || trailing_dot)
- return (res_nquerydomain(statp, name, NULL, class, type,
- answer, anslen));
+ return res_nquerydomain(statp, name, NULL, class, type,
+ answer, anslen, ansret);
/*
* We do at least one level of search if
@@ -233,11 +240,13 @@ res_nsearch(res_state statp,
(domain[0][0] == '.' && domain[0][1] == '\0'))
root_on_list++;
- ret = res_nquerydomain(statp, name, *domain,
- class, type,
- answer, anslen);
- if (ret > 0)
- return (ret);
+ rcode = res_nquerydomain(statp, name, *domain,
+ class, type,
+ answer, anslen, &ret);
+ if (rcode == ISC_R_SUCCESS && ret > 0) {
+ *ansret = ret;
+ return rcode;
+ }
/*
* If no server present, give up.
@@ -254,7 +263,7 @@ res_nsearch(res_state statp,
*/
if (errno == ECONNREFUSED) {
RES_SET_H_ERRNO(statp, TRY_AGAIN);
- return (-1);
+ return ISC_R_CONNREFUSED;
}
switch (statp->res_h_errno) {
@@ -289,10 +298,12 @@ res_nsearch(res_state statp,
* list, then try an as-is query now.
*/
if (statp->ndots) {
- ret = res_nquerydomain(statp, name, NULL, class, type,
- answer, anslen);
- if (ret > 0)
- return (ret);
+ rcode = res_nquerydomain(statp, name, NULL, class, type,
+ answer, anslen, &ret);
+ if (rcode == ISC_R_SUCCESS && ret > 0) {
+ *ansret = ret;
+ return rcode;
+ }
}
/* if we got here, we didn't satisfy the search.
@@ -302,24 +313,29 @@ res_nsearch(res_state statp,
* else send back meaningless H_ERRNO, that being the one from
* the last DNSRCH we did.
*/
- if (got_nodata)
+ if (got_nodata) {
RES_SET_H_ERRNO(statp, NO_DATA);
- else if (got_servfail)
+ return ISC_R_NOTFOUND;
+ } else if (got_servfail) {
RES_SET_H_ERRNO(statp, TRY_AGAIN);
- return (-1);
+ return ISC_R_TIMEDOUT;
+ }
+ return ISC_R_UNEXPECTED;
}
+#endif
/*
* Perform a call on res_query on the concatenation of name and domain,
* removing a trailing dot from name if domain is NULL.
*/
-int
+isc_result_t
res_nquerydomain(res_state statp,
- const char *name,
- const char *domain,
- ns_class class, ns_type type,
- double *answer,
- unsigned anslen)
+ const char *name,
+ const char *domain,
+ ns_class class, ns_type type,
+ double *answer,
+ unsigned anslen,
+ unsigned *ansret)
{
char nbuf[MAXDNAME];
const char *longname = nbuf;
@@ -338,7 +354,7 @@ res_nquerydomain(res_state statp,
n = strlen(name);
if (n >= MAXDNAME) {
RES_SET_H_ERRNO(statp, NO_RECOVERY);
- return (-1);
+ return ISC_R_NOSPACE;
}
n--;
if (n >= 0 && name[n] == '.') {
@@ -351,11 +367,12 @@ res_nquerydomain(res_state statp,
d = strlen(domain);
if (n + d + 1 >= MAXDNAME) {
RES_SET_H_ERRNO(statp, NO_RECOVERY);
- return (-1);
+ return ISC_R_NOSPACE;
}
sprintf(nbuf, "%s.%s", name, domain);
}
- return (res_nquery(statp, longname, class, type, answer, anslen));
+ return res_nquery(statp,
+ longname, class, type, answer, anslen, ansret);
}
const char *
diff --git a/minires/res_send.c b/minires/res_send.c
index 07393b04..9f3a83f9 100644
--- a/minires/res_send.c
+++ b/minires/res_send.c
@@ -70,7 +70,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static const char sccsid[] = "@(#)res_send.c 8.1 (Berkeley) 6/4/93";
-static const char rcsid[] = "$Id: res_send.c,v 1.4 2000/07/17 20:51:17 mellon Exp $";
+static const char rcsid[] = "$Id: res_send.c,v 1.5 2001/01/16 22:33:16 mellon Exp $";
#endif /* LIBC_SCCS and not lint */
/*
@@ -216,9 +216,10 @@ res_queriesmatch(const u_char *buf1, const u_char *eom1,
return (1);
}
-int
+isc_result_t
res_nsend(res_state statp,
- double *buf, unsigned buflen, double *ans, unsigned anssiz)
+ double *buf, unsigned buflen,
+ double *ans, unsigned anssiz, unsigned *ansret)
{
HEADER *hp = (HEADER *) buf;
HEADER *anhp = (HEADER *) ans;
@@ -227,8 +228,7 @@ res_nsend(res_state statp,
static int highestFD = FD_SETSIZE - 1;
if (anssiz < HFIXEDSZ) {
- errno = EINVAL;
- return (-1);
+ return ISC_R_INVALIDARG;
}
DprintQ((statp->options & RES_DEBUG) ||
(statp->pfcode & RES_PRF_QUERY),
@@ -236,7 +236,7 @@ res_nsend(res_state statp,
v_circuit = (statp->options & RES_USEVC) || buflen > PACKETSZ;
gotsomewhere = 0;
connreset = 0;
- terrno = ETIMEDOUT;
+ terrno = ISC_R_TIMEDOUT;
badns = 0;
/*
@@ -289,7 +289,7 @@ res_nsend(res_state statp,
case res_error:
/*FALLTHROUGH*/
default:
- return (-1);
+ return ISC_R_UNEXPECTED;
}
} while (!done);
}
@@ -334,7 +334,7 @@ res_nsend(res_state statp,
SOCK_STREAM, 0);
if (statp->_sock < 0 ||
statp->_sock > highestFD) {
- terrno = errno;
+ terrno = uerr2isc (errno);
Perror(statp, stderr,
"socket(vc)", errno);
return (-1);
@@ -343,7 +343,7 @@ res_nsend(res_state statp,
if (connect(statp->_sock,
(struct sockaddr *)nsap,
sizeof *nsap) < 0) {
- terrno = errno;
+ terrno = uerr2isc (errno);
Aerror(statp, stderr, "connect/vc",
errno, *nsap);
badns |= (1 << ns);
@@ -362,7 +362,7 @@ res_nsend(res_state statp,
iov[1].iov_len = buflen;
if (writev(statp->_sock, iov, 2) !=
(INT16SZ + buflen)) {
- terrno = errno;
+ terrno = uerr2isc (errno);
Perror(statp, stderr, "write failed", errno);
badns |= (1 << ns);
res_nclose(statp);
@@ -381,7 +381,7 @@ res_nsend(res_state statp,
break;
}
if (n <= 0) {
- terrno = errno;
+ terrno = uerr2isc (errno);
Perror(statp, stderr, "read failed", errno);
res_nclose(statp);
/*
@@ -393,7 +393,8 @@ res_nsend(res_state statp,
* instead of failing. We only allow one reset
* per query to prevent looping.
*/
- if (terrno == ECONNRESET && !connreset) {
+ if (terrno == ISC_R_CONNREFUSED &&
+ !connreset) {
connreset = 1;
res_nclose(statp);
goto same_ns;
@@ -416,7 +417,7 @@ res_nsend(res_state statp,
*/
Dprint(statp->options & RES_DEBUG,
(stdout, ";; undersized: %d\n", len));
- terrno = EMSGSIZE;
+ terrno = ISC_R_NOSPACE;
badns |= (1 << ns);
res_nclose(statp);
goto next_ns;
@@ -430,7 +431,7 @@ res_nsend(res_state statp,
len -= n;
}
if (n <= 0) {
- terrno = errno;
+ terrno = uerr2isc (errno);
Perror(statp, stderr, "read(vc)", errno);
res_nclose(statp);
goto next_ns;
@@ -491,10 +492,10 @@ res_nsend(res_state statp,
#ifndef CAN_RECONNECT
bad_dg_sock:
#endif
- terrno = errno;
+ terrno = uerr2isc (errno);
Perror(statp, stderr,
"socket(dg)", errno);
- return (-1);
+ return terrno;
}
statp->_flags &= ~RES_F_CONN;
}
@@ -667,7 +668,7 @@ res_nsend(res_state statp,
Dprint(statp->options & RES_DEBUG,
(stdout, ";; undersized: %d\n",
resplen));
- terrno = EMSGSIZE;
+ terrno = ISC_R_NOSPACE;
badns |= (1 << ns);
res_nclose(statp);
goto next_ns;
@@ -783,24 +784,24 @@ res_nsend(res_state statp,
case res_error:
/*FALLTHROUGH*/
default:
- return (-1);
+ return ISC_R_UNEXPECTED;
}
} while (!done);
}
- return (resplen);
+ *ansret = resplen;
+ return ISC_R_SUCCESS;
next_ns: ;
} /*foreach ns*/
} /*foreach retry*/
res_nclose(statp);
if (!v_circuit) {
if (!gotsomewhere)
- errno = ECONNREFUSED; /* no nameservers found */
+ terrno = ISC_R_CONNREFUSED; /* no nameservers found */
else
- errno = ETIMEDOUT; /* no answer obtained */
- } else
- errno = terrno;
- return (-1);
+ errno = ISC_R_TIMEDOUT; /* no answer obtained */
+ }
+ return terrno;
}
/*
diff --git a/minires/res_sendsigned.c b/minires/res_sendsigned.c
index 8eb72b2e..1c0c441f 100644
--- a/minires/res_sendsigned.c
+++ b/minires/res_sendsigned.c
@@ -18,9 +18,10 @@
#include <isc/dst.h>
/* res_nsendsigned */
-int
-res_nsendsigned(res_state statp, double *msg, unsigned msglen,
- ns_tsig_key *key, double *answer, unsigned anslen)
+isc_result_t
+res_nsendsigned(res_state statp,
+ double *msg, unsigned msglen, ns_tsig_key *key,
+ double *answer, unsigned anslen, unsigned *anssize)
{
res_state nstatp;
DST_KEY *dstkey;
@@ -32,22 +33,19 @@ res_nsendsigned(res_state statp, double *msg, unsigned msglen,
HEADER *hp;
time_t tsig_time;
int ret;
+ isc_result_t rcode;
dst_init();
nstatp = (res_state) malloc(sizeof(*statp));
- if (nstatp == NULL) {
- errno = ENOMEM;
- return (-1);
- }
+ if (nstatp == NULL)
+ return ISC_R_NOMEMORY;
memcpy(nstatp, statp, sizeof(*statp));
bufsize = msglen + 1024;
newmsg = (double *) malloc(bufsize);
- if (newmsg == NULL) {
- errno = ENOMEM;
- return (-1);
- }
+ if (newmsg == NULL)
+ return ISC_R_NOMEMORY;
memcpy(newmsg, msg, msglen);
newmsglen = msglen;
@@ -59,25 +57,20 @@ res_nsendsigned(res_state statp, double *msg, unsigned msglen,
NS_KEY_PROT_ANY,
key->data, key->len);
if (dstkey == NULL) {
- errno = EINVAL;
free(nstatp);
free(newmsg);
- return (-1);
+ return ISC_R_INVALIDARG;
}
nstatp->nscount = 1;
siglen = sizeof(sig);
- ret = ns_sign((u_char *)newmsg, &newmsglen, bufsize,
- NOERROR, dstkey, NULL, 0,
- sig, &siglen, 0);
- if (ret < 0) {
+ rcode = ns_sign((u_char *)newmsg, &newmsglen, bufsize,
+ NOERROR, dstkey, NULL, 0,
+ sig, &siglen, 0);
+ if (rcode != ISC_R_SUCCESS) {
free (nstatp);
free (newmsg);
- if (ret == NS_TSIG_ERROR_NO_SPACE)
- errno = EMSGSIZE;
- else if (ret == -1)
- errno = EINVAL;
- return (ret);
+ return rcode;
}
if (newmsglen > PACKETSZ || (nstatp->options & RES_IGNTC))
@@ -89,27 +82,23 @@ res_nsendsigned(res_state statp, double *msg, unsigned msglen,
retry:
- ret = res_nsend(nstatp, newmsg, newmsglen, answer, anslen);
- if (ret < 0) {
+ rcode = res_nsend(nstatp, newmsg, newmsglen, answer, anslen, &ret);
+ if (rcode != ISC_R_SUCCESS) {
free (nstatp);
free (newmsg);
- return (ret);
+ return rcode;
}
anslen = ret;
- ret = ns_verify((u_char *)answer, &anslen, dstkey, sig, siglen,
- NULL, NULL, &tsig_time,
- (nstatp->options & RES_KEEPTSIG) ? 1 : 0);
- if (ret != 0) {
+ rcode = ns_verify((u_char *)answer, &anslen, dstkey, sig, siglen,
+ NULL, NULL, &tsig_time,
+ (nstatp->options & RES_KEEPTSIG) ? 1 : 0);
+ if (rcode != ISC_R_SUCCESS) {
Dprint(nstatp->pfcode & RES_PRF_REPLY,
(stdout, ";; TSIG invalid (%s)\n", p_rcode(ret)));
free (nstatp);
free (newmsg);
- if (ret == -1)
- errno = EINVAL;
- else
- errno = ENOTTY;
- return (-1);
+ return rcode;
}
Dprint(nstatp->pfcode & RES_PRF_REPLY, (stdout, ";; TSIG ok\n"));
@@ -122,5 +111,6 @@ retry:
free (nstatp);
free (newmsg);
- return (anslen);
+ *anssize = anslen;
+ return ISC_R_SUCCESS;
}
diff --git a/minires/res_update.c b/minires/res_update.c
index 53efffba..d7e4c882 100644
--- a/minires/res_update.c
+++ b/minires/res_update.c
@@ -1,5 +1,5 @@
#if !defined(lint) && !defined(SABER)
-static const char rcsid[] = "$Id: res_update.c,v 1.9 2000/09/12 18:38:23 mellon Exp $";
+static const char rcsid[] = "$Id: res_update.c,v 1.10 2001/01/16 22:33:18 mellon Exp $";
#endif /* not lint */
/*
@@ -76,7 +76,7 @@ static int nsprom(struct sockaddr_in *, const struct in_addr *, int);
void tkey_free (ns_tsig_key **);
-ns_rcode
+isc_result_t
res_nupdate(res_state statp, ns_updrec *rrecp_in) {
ns_updrec *rrecp;
double answer[PACKETSZ / sizeof (double)];
@@ -86,10 +86,10 @@ res_nupdate(res_state statp, ns_updrec *rrecp_in) {
unsigned n;
int rval;
struct sockaddr_in nsaddrs[MAXNS];
- ns_rcode rcode;
ns_tsig_key *key;
void *zcookie = 0;
void *zcookp = &zcookie;
+ isc_result_t rcode;
again:
/* Make sure all the updates are in the same zone, and find out
@@ -104,16 +104,17 @@ res_nupdate(res_state statp, ns_updrec *rrecp_in) {
sizeof tgrp.z_origin,
tgrp.z_nsaddrs, MAXNS, &tgrp.z_nscount,
zcookp);
- if (rcode != ns_r_noerror)
+ if (rcode != ISC_R_SUCCESS)
goto done;
if (tgrp.z_nscount <= 0) {
- rcode = ns_r_notzone;
+ rcode = ISC_R_NOTZONE;
goto done;
}
/* Make a group for it if there isn't one. */
if (zptr == NULL) {
zptr = malloc(sizeof *zptr);
if (zptr == NULL) {
+ rcode = ISC_R_NOMEMORY;
goto done;
}
*zptr = tgrp;
@@ -122,7 +123,7 @@ res_nupdate(res_state statp, ns_updrec *rrecp_in) {
} else if (ns_samename(tgrp.z_origin, zptr->z_origin) == 0 ||
tgrp.z_class != zptr->z_class) {
/* Some of the records are in different zones. */
- rcode = ns_r_notzone;
+ rcode = ISC_R_CROSSZONE;
goto done;
}
/* Thread this rrecp onto the zone group. */
@@ -141,10 +142,10 @@ res_nupdate(res_state statp, ns_updrec *rrecp_in) {
/* Marshall the update message. */
n = sizeof packet;
- if (res_nmkupdate(statp, ISC_LIST_HEAD(zptr->z_rrlist), packet, &n)) {
- rcode = -1;
+ rcode = res_nmkupdate(statp,
+ ISC_LIST_HEAD(zptr->z_rrlist), packet, &n);
+ if (rcode != ISC_R_SUCCESS)
goto done;
- }
/* Temporarily replace the resolver's nameserver set. */
nscount = nscopy(nsaddrs, statp->nsaddr_list, statp->nscount);
@@ -154,18 +155,18 @@ res_nupdate(res_state statp, ns_updrec *rrecp_in) {
/* Send the update and remember the result. */
key = (ns_tsig_key *)0;
if (!find_tsig_key (&key, zptr->z_origin, zcookie)) {
- rval = res_nsendsigned(statp, packet, n, key,
- answer, sizeof answer);
+ rcode = res_nsendsigned(statp, packet, n, key,
+ answer, sizeof answer, &rval);
tkey_free (&key);
} else {
- rval = res_nsend(statp, packet, n, answer, sizeof answer);
+ rcode = res_nsend(statp, packet, n,
+ answer, sizeof answer, &rval);
}
- if (rval < 0) {
- rcode = -1;
+ if (rcode != ISC_R_SUCCESS) {
goto undone;
}
- rcode = ((HEADER *)answer)->rcode;
- if (zcookie && rcode == ns_r_badsig) {
+ rcode = ns_rcode_to_isc (((HEADER *)answer)->rcode);
+ if (zcookie && rcode == ISC_R_BADSIG) {
repudiate_zone (&zcookie);
}
@@ -182,7 +183,7 @@ res_nupdate(res_state statp, ns_updrec *rrecp_in) {
/* If the update failed because we used a cached zone and it
didn't work, try it again without the cached zone. */
- if (zcookp && (rcode == ns_r_notzone || rcode == ns_r_badsig)) {
+ if (zcookp && (rcode == ISC_R_NOTZONE || rcode == ISC_R_BADSIG)) {
zcookp = 0;
goto again;
}