X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/a1d2d0ed10dedfbce895f2e2f1480355e7f6d6be..2c7b101bee6ae4f7cee1417ff769603eaa161ddf:/src/adns.h diff --git a/src/adns.h b/src/adns.h index 650c42d..7e40ba5 100644 --- a/src/adns.h +++ b/src/adns.h @@ -1,11 +1,9 @@ /* - * Copyright (C)1998 Ian Jackson. - * This version provided for review and comment only. - * - * $Id: adns.h,v 1.30 1998/11/14 16:41:40 ian Exp $ + * adns.h + * - adns user-visible API (single-threaded, without any locking) */ /* - * This file is part of adns, which is Copyright (C) 1997, 1998 Ian Jackson + * This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +17,9 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id: adns.h,v 1.42 1999/04/11 17:21:22 ian Exp $ */ #ifndef ADNS_H_INCLUDED @@ -30,6 +30,8 @@ #include #include +/* All struct in_addr anywhere in adns are in NETWORK byte order. */ + typedef struct adns__state *adns_state; typedef struct adns__query *adns_query; @@ -102,29 +104,48 @@ typedef enum { */ typedef enum { - /* fixme: think about error codes */ adns_s_ok, + + /* locally induced errors */ + adns_s_nomemory, + adns_s_unknownrrtype, + + /* remotely induced errors, detected locally */ adns_s_timeout, - adns_s_nolocalmem, adns_s_allservfail, - adns_s_servfail, - adns_s_notimplemented, - adns_s_refused, - adns_s_reasonunknown, adns_s_norecurse, - adns_s_serverfaulty, - adns_s_unknownreply, - adns_s_invaliddata, + adns_s_invalidresponse, + adns_s_unknownformat, + + /* remotely induced errors, reported by remote server to us */ + adns_s_rcodeservfail, + adns_s_rcodeformaterror, + adns_s_rcodenotimplemented, + adns_s_rcoderefused, + adns_s_rcodeunknown, + adns_s_max_tempfail= 99, - adns_s_inconsistent, /* PTR gives domain whose A does not match */ - adns_s_cname, /* CNAME found where data eg A expected (not if _qf_loosecname) */ - adns_s_invalidanswerdomain, - /* fixme: implement _s_cname */ - adns_s_max_remotemisconfig= 199, + + /* remote configuration errors */ + adns_s_inconsistent, /* PTR gives domain whose A does not exist and match */ + adns_s_prohibitedcname, /* CNAME found where eg A expected (not if _qf_loosecname) */ + adns_s_answerdomaininvalid, + adns_s_answerdomaintoolong, + adns_s_invaliddata, + + adns_s_max_misconfig= 199, + + /* permanent problems with the query */ + adns_s_querydomainwrong, + adns_s_querydomaininvalid, + adns_s_querydomaintoolong, + + adns_s_max_misquery= 299, + + /* permanent errors */ adns_s_nxdomain, adns_s_nodata, - adns_s_invalidquerydomain, - adns_s_domaintoolong, + } adns_status; typedef struct { @@ -133,22 +154,22 @@ typedef struct { struct sockaddr sa; struct sockaddr_in inet; } addr; -} adns_addr; +} adns_rr_addr; typedef struct { - char *dm; + char *host; adns_status astatus; int naddrs; /* temp fail => -1, perm fail => 0, s_ok => >0 */ - adns_addr *addrs; + adns_rr_addr *addrs; } adns_rr_hostaddr; typedef struct { - char *a, *b; + char *(array[2]); } adns_rr_strpair; typedef struct { int i; - adns_rr_hostaddr hostaddr; + adns_rr_hostaddr ha; } adns_rr_inthostaddr; typedef struct { @@ -162,7 +183,11 @@ typedef struct { } adns_rr_intstr; typedef struct { - char *ns0, *rp; + adns_rr_intstr array[2]; +} adns_rr_intstrpair; + +typedef struct { + char *mname, *rname; unsigned long serial, refresh, retry, expire, minimum; } adns_rr_soa; @@ -170,16 +195,18 @@ typedef struct { adns_status status; char *cname; /* always NULL if query was for CNAME records */ adns_rrtype type; /* guaranteed to be same as in query */ + time_t expires; /* expiry time, defined only if _s_ok, nxdomain or nodata. NOT TTL! */ int nrrs, rrsz; union { void *untyped; unsigned char *bytes; char *(*str); /* ns_raw, cname, ptr, ptr_raw */ adns_rr_intstr *(*manyistr); /* txt (list of strings ends with i=-1, str=0) */ - adns_addr *addr; /* addr */ + adns_rr_addr *addr; /* addr */ struct in_addr *inaddr; /* a */ adns_rr_hostaddr *hostaddr; /* ns */ - adns_rr_strpair *strpair; /* hinfo ??fixme, rp, rp_raw */ + adns_rr_intstrpair *intstrpair; /* hinfo */ + adns_rr_strpair *strpair; /* rp, rp_raw */ adns_rr_inthostaddr *inthostaddr; /* mx */ adns_rr_intstr *intstr; /* mx_raw */ adns_rr_soa *soa; /* soa, soa_raw */ @@ -209,7 +236,11 @@ typedef struct { * If no (appropriate) requests are outstanding adns_query and adns_wait return ESRCH; */ -int adns_init(adns_state *newstate_r, adns_initflags flags, FILE *diagfile/*0=>stderr*/); +int adns_init(adns_state *newstate_r, adns_initflags flags, + FILE *diagfile /*0=>stderr*/); + +int adns_init_strcfg(adns_state *newstate_r, adns_initflags flags, + FILE *diagfile /*0=>discard*/, const char *configtext); int adns_synchronous(adns_state ads, const char *owner, @@ -238,10 +269,12 @@ int adns_wait(adns_state ads, adns_query *query_io, adns_answer **answer_r, void **context_r); +/* fixme: easy way to get lists of fd's */ +/* fixme: minor cache */ void adns_cancel(adns_query query); -int adns_finish(adns_state); +void adns_finish(adns_state); /* You may call this even if you have queries outstanding; * they will be cancelled. */ @@ -315,7 +348,7 @@ adns_status adns_rr_info(adns_rrtype type, * * Usually this routine will succeed. Possible errors include: * adns_s_nomemory - * adns_s_notimplemented (RR type not known) + * adns_s_rrtypeunknown * adns_s_invaliddata (*datap contained garbage) * If an error occurs then no memory has been allocated, * and *rrtname_r, *fmtname_r, *len_r and *data_r are undefined.