X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Finternal.h;h=121c6d8fb36afd9f3e12edd1f388384a2266f007;hb=814cee186999a6e9a76ab970f891347c1e42b132;hp=24c5c829f69162094a67c121337bc179eb5050f8;hpb=c0af047b137721acff216e6d5665433ff2a366cb;p=adns.git diff --git a/src/internal.h b/src/internal.h index 24c5c82..121c6d8 100644 --- a/src/internal.h +++ b/src/internal.h @@ -6,14 +6,15 @@ */ /* * This file is part of adns, which is - * 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 - * the Free Software Foundation; either version 2, or (at your option) + * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, @@ -22,8 +23,7 @@ * 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. */ #ifndef ADNS_INTERNAL_H_INCLUDED @@ -53,7 +53,7 @@ typedef unsigned char byte; /* Configuration and constants */ -#define MAXSERVERS 5 +#define MAXSERVERS 5 /* do not increase beyond no. of bits in `unsigned'! */ #define MAXSORTLIST 15 #define UDPMAXRETRIES 15 #define UDPRETRYMS 2000 @@ -95,7 +95,8 @@ typedef unsigned char byte; typedef enum { cc_user, - cc_entex, + cc_enter, + cc_exit, cc_freq } consistency_checks; @@ -170,7 +171,7 @@ typedef struct typeinfo { * Previously, used alloc_interim, now use alloc_final. */ - adns_status (*convstring)(vbuf *vb, const void *data); + adns_status (*convstring)(vbuf *vb, adns_rrtype, const void *data); /* 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. @@ -207,7 +208,7 @@ typedef struct typeinfo { * because lablen is zero. */ - 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 @@ -246,7 +247,7 @@ union maxalign { void *p; void (*fp)(void); union maxalign *up; -} data; +}; struct adns__query { adns_state ads; @@ -297,7 +298,8 @@ struct adns__query { int id, flags, retries; int udpnextserver; unsigned long udpsent; /* bitmap indexed by server */ - struct timeval timeout; + int timeout_ms; + struct timeval timeout_started; time_t expires; /* Earliest expiry time of any record we used. */ qcontext ctx; @@ -371,9 +373,10 @@ struct adns__state { int configerrno; struct query_queue udpw, tcpw, childw, output, intdone; adns_query forallnext; - int nextid, tcpsocket; - struct udpsocket { int af; int fd; } udpsocket[MAXUDP]; - int nudp; + unsigned nextid; + int tcpsocket; + struct udpsocket { int af; int fd; } udpsockets[MAXUDP]; + int nudpsockets; vbuf tcpsend, tcprecv; int nservers, nsortlist, nsearchlist, searchndots, tcpserver, tcprecv_skip; enum adns__tcpstate { @@ -394,6 +397,7 @@ struct adns__state { adns_sockaddr base, mask; } sortlist[MAXSORTLIST]; char **searchlist; + unsigned config_report_unknown:1; unsigned short rand48xsubi[3]; }; @@ -450,8 +454,9 @@ extern const void *adns__sockaddr_addr(const struct sockaddr *sa); */ char *adns__sockaddr_ntoa(const struct sockaddr *sa, char *buf); -/* 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__make_reverse_domain(const struct sockaddr *sa, @@ -706,7 +711,7 @@ void adns__reset_preserved(adns_query qu); void adns__cancel(adns_query qu); void adns__query_done(adns_query qu); -void adns__query_fail(adns_query qu, adns_status stat); +void adns__query_fail(adns_query qu, adns_status st); void adns__cancel_children(adns_query qu); void adns__returning(adns_state ads, adns_query qu); @@ -717,6 +722,8 @@ void adns__returning(adns_state ads, adns_query qu); * external-faciing functions which call adns__returning should * normally be avoided in internal code. */ +void adns__intdone_process(adns_state ads); + /* From reply.c: */ void adns__procdgram(adns_state ads, const byte *dgram, int len, @@ -864,8 +871,6 @@ void adns__update_expires(adns_query qu, unsigned long ttl, * now + ttl. */ -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); /* From event.c: */ @@ -881,6 +886,15 @@ void adns__autosys(adns_state ads, struct timeval now); * lest we end up in recursive descent ! */ +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! */ @@ -934,7 +948,7 @@ static inline int errno_resources(int e) { return e==ENOMEM || e==ENOBUFS; } (( ((sz)+sizeof(union maxalign)-1) / sizeof(union maxalign) ) \ * sizeof(union maxalign) ) -#define GETIL_B(cb) (((dgram)[(cb)++]) & 0x0ff) +#define GETIL_B(cb) (((dgram)[(cb)++]) & 0x0ffu) #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, \