- * Copyright (C) 1997-2000,2003,2006 Ian Jackson
+ * Copyright (C) 1997-2000,2003,2006,2014-2016,2020 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
* Copyright (C) 1999-2000,2003,2006 Tony Finch
* Copyright (C) 1991 Massachusetts Institute of Technology
* (See the file INSTALL for full details.)
*
* 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
* Copyright (C) 1999-2000,2003,2006 Tony Finch
* Copyright (C) 1991 Massachusetts Institute of Technology
* (See the file INSTALL for full details.)
*
* 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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* GNU General Public License for more details.
*
* 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.
+ * along with this program; if not, write to the Free Software Foundation.
/* Converts the RR data to a string representation in vbuf.
* vbuf will be appended to (it must have been initialised),
* and will not be null-terminated by convstring.
/* Converts the RR data to a string representation in vbuf.
* vbuf will be appended to (it must have been initialised),
* and will not be null-terminated by convstring.
adns_status (*checklabel)(adns_state ads, adns_queryflags flags,
union checklabel_state *cls, qcontext *ctx,
adns_status (*checklabel)(adns_state ads, adns_queryflags flags,
union checklabel_state *cls, qcontext *ctx,
- int labnum, const char *label, int lablen);
+ int labnum, const char *dgram,
+ int labstart, int lablen);
/* Check a label from the query domain string. The label is not
* necessarily null-terminated. The hook can refuse the query's submission
* by returning a nonzero status. State can be stored in *cls between
/* Check a label from the query domain string. The label is not
* necessarily null-terminated. The hook can refuse the query's submission
* by returning a nonzero status. State can be stored in *cls between
- void (*postsort)(adns_state ads, void *array, int nrrs,int rrsz,
+ void (*postsort)(adns_state ads, void *array, int nrrs, int rrsz,
const struct typeinfo *typei);
/* Called immediately after the RRs have been sorted, and may rearrange
* them. (This is really for the benefit of SRV's bizarre weighting
const struct typeinfo *typei);
/* Called immediately after the RRs have been sorted, and may rearrange
* them. (This is really for the benefit of SRV's bizarre weighting
adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags,
union checklabel_state *cls,
qcontext *ctx, int labnum,
adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags,
union checklabel_state *cls,
qcontext *ctx, int labnum,
/* implemented in query.c, used by types.c as default
* and as part of implementation for some fancier types
* doesn't require any state */
/* implemented in query.c, used by types.c as default
* and as part of implementation for some fancier types
* doesn't require any state */
int configerrno;
struct query_queue udpw, tcpw, childw, output, intdone;
adns_query forallnext;
int configerrno;
struct query_queue udpw, tcpw, childw, output, intdone;
adns_query forallnext;
vbuf tcpsend, tcprecv;
int nservers, nsortlist, nsearchlist, searchndots, tcpserver, tcprecv_skip;
enum adns__tcpstate {
vbuf tcpsend, tcprecv;
int nservers, nsortlist, nsearchlist, searchndots, tcpserver, tcprecv_skip;
enum adns__tcpstate {
-/* Convert sa to a string, and write it to buf, which must be at least
- * ADNS_ADDR2TEXT_BUFLEN bytes long (unchecked). Return buf; can't fail.
+/* Converts sa to a string, and writes it to buf, which must be at
+ * least ADNS_ADDR2TEXT_BUFLEN bytes long (unchecked). Returns buf;
+ * can't fail.
-extern int adns__revparse_label(struct revparse_state *rps, int labnum,
- const char *label, int lablen);
+extern bool adns__revparse_label(struct revparse_state *rps, int labnum,
+ const char *dgram,
+ int labstart, int lablen);
/* Parse a label in a reverse-domain name, given its index labnum (starting
* from zero), a pointer to its contents (which need not be null-terminated),
* and its length. The state in *rps is initialized implicitly when labnum
* is zero.
*
/* Parse a label in a reverse-domain name, given its index labnum (starting
* from zero), a pointer to its contents (which need not be null-terminated),
* and its length. The state in *rps is initialized implicitly when labnum
* is zero.
*
- * Returns zero if the parse was successful, nonzero if the domain name is
- * definitely invalid and the parse must be abandoned.
+ * Returns 1 if the parse is proceeding successfully, 0 if the domain
+ * name is definitely invalid and the parse must be abandoned.
-extern int adns__revparse_done(struct revparse_state *rps, int nlabels,
- adns_rrtype *rrtype_r, adns_sockaddr *addr_r);
+extern bool adns__revparse_done(struct revparse_state *rps,
+ const char *dgram, int nlabels,
+ adns_rrtype *rrtype_r, adns_sockaddr *addr_r);
/* Finishes parsing a reverse-domain name, given the total number of
* labels in the name. On success, fills in the af and protocol
* address in *addr_r, and the forward query type in *rrtype_r
/* Finishes parsing a reverse-domain name, given the total number of
* labels in the name. On success, fills in the af and protocol
* address in *addr_r, and the forward query type in *rrtype_r
void adns__cancel_children(adns_query qu);
void adns__returning(adns_state ads, adns_query qu);
void adns__cancel_children(adns_query qu);
void adns__returning(adns_state ads, adns_query qu);
* external-faciing functions which call adns__returning should
* normally be avoided in internal code. */
* external-faciing functions which call adns__returning should
* normally be avoided in internal code. */
/* From reply.c: */
void adns__procdgram(adns_state ads, const byte *dgram, int len,
/* From reply.c: */
void adns__procdgram(adns_state ads, const byte *dgram, int len,
-int vbuf__append_quoted1035(vbuf *vb, const byte *buf, int len);
+bool adns__labels_equal(const byte *a, int al, const byte *b, int bl);
+static inline void
+adns__timeout_set(adns_query qu, struct timeval now, long ms)
+ { qu->timeout_ms= ms; qu->timeout_started= now; }
+
+static inline void
+adns__timeout_clear(adns_query qu)
+ { qu->timeout_ms= 0; timerclear(&qu->timeout_started); }
+
+
void adns__must_gettimeofday(adns_state ads, const struct timeval **now_io,
struct timeval *tv_buf);
/* Call with care - might reentrantly cause queries to be completed! */
void adns__must_gettimeofday(adns_state ads, const struct timeval **now_io,
struct timeval *tv_buf);
/* Call with care - might reentrantly cause queries to be completed! */
static inline int ctype_822special(int c) {
return strchr("()<>@,;:\\\".[]",c) != 0;
}
static inline int ctype_822special(int c) {
return strchr("()<>@,;:\\\".[]",c) != 0;
}
#define GET_B(cb,tv) ((tv)= GETIL_B((cb)))
#define GET_W(cb,tv) ((tv)=0,(tv)|=(GETIL_B((cb))<<8), (tv)|=GETIL_B(cb), (tv))
#define GET_L(cb,tv) ( (tv)=0, \
#define GET_B(cb,tv) ((tv)= GETIL_B((cb)))
#define GET_W(cb,tv) ((tv)=0,(tv)|=(GETIL_B((cb))<<8), (tv)|=GETIL_B(cb), (tv))
#define GET_L(cb,tv) ( (tv)=0, \