diff options
Diffstat (limited to 'include/dnsresolv.h')
-rw-r--r-- | include/dnsresolv.h | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/include/dnsresolv.h b/include/dnsresolv.h new file mode 100644 index 0000000..406af50 --- /dev/null +++ b/include/dnsresolv.h @@ -0,0 +1,202 @@ +#ifndef DNSRESOLV_H +#define DNSRESOLV_H + +/* + * Revision 20230613, Erwin Hoffmann + * - DNS_NXD (return code 0) for NXDOMAIN and NODATA added + * - DNS_SOFT as shortcut for DNS_ERR or DNS_COM + * - DNS_HARD indicates DNS loop problems + * Revision 20221101, Erwin Hoffmann + * - DNS_COM has now return code -3 (as documented; tx. Franz S.) + * Revision 20210922, Erwin Hoffmann + * - Added constants MAXMSGSIZE and MAXSEGMENT - not used yet + * Revision 20210401, Erwin Hoffmann + * - removed obsolete dns_sortip(); not going to work with GCC-10 anyway + * Revision 20200719, Erwin Hoffmann + * - added dns_qualify_localhost function including fqdn retrun + * Revision 20190730, Erwin Hoffmann + * - revised DNS_* return codes to make them compliant with ucspi-* + * Revision 20190430, Erwin Hoffmann + * - added DNS_SOFT/HARD/MEM complient to s/qmail + * - code changes in all decendent modules + * Revision 20180222, Erwin Hoffmann + * - we consider in total 32 NS IPs (IPv4 + IPv6) + * - added dns_transmit_start6 + * - added uint32 scope_ids[32], + * the initial NS scopes read from /etc/resolv.conf et al. + * Revision 20180118, Erwin Hoffmann + * - included MSGSIZE for DNS messages (instead of MTUSIZE) + * Revision 20171231, Erwin Hoffmann + * - renamed to dnsresolv.h and removed *qmail declarations + * Revision 20170902, Erwin Hoffmann + * - added old definitions from *qmail for (temp) backwards compatibility + * - added more DNS RR definitions +*/ + +#include "stralloc.h" +#include "iopause.h" +#include "taia.h" + +/* Note: The conventions are subject of change in forthcoming versions */ + +#define DNS_NXD 0 /* NXDOMAIN, NODATA */ +#define DNS_MEM -1 /* out of memory; fatal */ +#define DNS_ERR -2 /* parsing errors and others */ +#define DNS_COM -3 /* (socket) communication errors: SERVFAIL */ +#define DNS_INT -4 /* internal errors */ +#define DNS_SOFT -5 /* DNS_ERR or DNS_COM */ +#define DNS_HARD -6 /* DNS loop problem */ + +#define MSGSIZE MTUSIZE /* todays default */ +// #define MSGSIZE 512 /* RFC 1035 */ +#define MAXMSGSIZE 4096 /* 4069 seen with EDNS0 */ +#define MAXSEGMENT 65535 /* Max TCP buffer size */ + +#define QUERY_MAXNS 32 /* 16 IPv4 + 16 IPv6 NS */ +#define QUERY_MAXIPLEN 512 /* QUERY_MAXNS * 16 */ + +/* Note: These following definitions are subject of change */ + +#define DNS_C_IN "\0\1" +#define DNS_C_ANY "\0\377" + +#define DNS_T_A "\0\1" +#define DNS_T_NS "\0\2" +#define DNS_T_CNAME "\0\5" +#define DNS_T_SOA "\0\6" +#define DNS_T_PTR "\0\14" +#define DNS_T_HINFO "\0\15" +#define DNS_T_MX "\0\17" +#define DNS_T_TXT "\0\20" +#define DNS_T_RP "\0\21" +#define DNS_T_SIG "\0\30" +#define DNS_T_KEY "\0\31" +#define DNS_T_AAAA "\0\34" +#define DNS_T_SRV "\0\41" +#define DNS_T_NAPTR "\0\43" +#define DNS_T_CERT "\0\45" +#define DNS_T_OPT "\0\51" +#define DNS_T_DS "\0\53" +#define DNS_T_SSHFP "\0\54" +#define DNS_T_IPSECKEY "\0\55" +#define DNS_T_RRSIG "\0\56" +#define DNS_T_NSEC "\0\57" +#define DNS_T_DNSKEY "\0\60" +#define DNS_T_NSEC3 "\0\62" +#define DNS_T_NSEC3PARAM "\0\63" +#define DNS_T_TLSA "\0\64" +#define DNS_T_HIP "\0\67" +#define DNS_T_OPENPGPKEY "\0\75" +#define DNS_T_SPF "\0\143" +#define DNS_T_AXFR "\0\374" +#define DNS_T_ANY "\0\377" +#define DNS_T_CAA "\1\1" + +#define LOCALHOST "localhost" /* no clear distinction IPv4/IPv6 */ +#define IP4_LOOPBACK "ip4-loopback" +#define IP6_LOOPBACK "ip6-loopback" + +struct dns_transmit { + char *query; /* 0, or dynamically allocated */ + unsigned int querylen; + char *packet; /* 0, or dynamically allocated */ + unsigned int packetlen; + int s1; /* 0, or 1 + an open file descriptor */ + int tcpstate; + unsigned int udploop; + unsigned int curserver; + struct taia deadline; + unsigned int pos; + const char *servers; + uint32 scope_id; + char localip[16]; + char qtype[2]; +} ; + +/* General */ + +extern void dns_random_init(const char *); +extern unsigned int dns_random(unsigned int); + +extern void dns_domain_free(char **); +extern int dns_domain_copy(char **,const char *); +extern unsigned int dns_domain_length(const char *); +extern int dns_domain_equal(const char *,const char *); +extern int dns_domain_suffix(const char *,const char *); +extern unsigned int dns_domain_suffixpos(const char *,const char *); +extern int dns_domain_fromdot(char **,const char *,unsigned int); +extern int dns_domain_todot_cat(stralloc *,const char *); +extern int dns_ip_qualify(stralloc *,stralloc *,const stralloc *); +extern int dns_ip_qualify_rules(stralloc *,stralloc *,const stralloc *,const stralloc *); +extern int dns_ip_qualify_localhost(stralloc *,stralloc *,const stralloc *); + +extern unsigned int dns_packet_copy(const char *,unsigned int,unsigned int,char *,unsigned int); +extern unsigned int dns_packet_getname(const char *,unsigned int,unsigned int,char **); +extern unsigned int dns_packet_skipname(const char *,unsigned int,unsigned int); + +extern struct dns_transmit dns_resolve_tx; +extern int dns_transmit_start(struct dns_transmit *,const char *,int,const char *,const char *,const char *); +extern void dns_transmit_free(struct dns_transmit *); +extern void dns_transmit_io(struct dns_transmit *,iopause_fd *,struct taia *); +extern int dns_transmit_get(struct dns_transmit *,const iopause_fd *,const struct taia *); + +/* Common IPv4 + IPv6 */ + +extern int dns_resolvconfip(char *,uint32 *); +extern int dns_resolvconfrewrite(stralloc *); +extern int dns_resolve(const char *,const char *); + +extern int dns_name(stralloc *,const char *); +extern int dns_name_packet(stralloc *,const char *,unsigned int); +extern int dns_txt_packet(stralloc *,const char *,unsigned int); +extern int dns_txt(stralloc *,const stralloc *); +extern int dns_mx_packet(stralloc *,const char *,unsigned int); +extern int dns_mx(stralloc *,const stralloc *); + +/* IPv4 specific */ + +extern int dns_ip4_packet(stralloc *,const char *,unsigned int); +extern int dns_ip4(stralloc *,stralloc *); +extern void dns_sortip4(char *,unsigned int); + +extern int dns_ip4_qualify_rules(stralloc *,stralloc *,const stralloc *,const stralloc *); +extern int dns_ip4_qualify(stralloc *,stralloc *,const stralloc *); + +#define DNS_NAME4_DOMAIN 31 +extern int dns_name4_domain(char *,const char *); +extern int dns_name4(stralloc *,const char *); +extern int randombind4(struct dns_transmit *); + +/* IPv6 specific */ + +extern int dns_ip6_packet(stralloc *,const char *,unsigned int); +extern int dns_ip6(stralloc *,stralloc *); +extern void dns_sortip6(char *,unsigned int); + +extern int dns_ip6_qualify_rules(stralloc *,stralloc *,const stralloc *,const stralloc *); +extern int dns_ip6_qualify(stralloc *,stralloc *,const stralloc *); + +#define DNS_NAME6_DOMAIN (4*16+11) +extern int dns_name6_domain(char *,const char *); +extern int dns_name6(stralloc *,const char *); + +extern int dns_cname_packet(stralloc *,const char *,unsigned int); +extern int dns_cname(stralloc *,stralloc *); + +extern int dns_transmit_start6(struct dns_transmit *,const char *,int,const char *,const char *,const char *,const uint32 *); +extern int randombind6(struct dns_transmit *); + +/* General */ + +extern void socketfree(struct dns_transmit *); +extern void queryfree(struct dns_transmit *); +extern void packetfree(struct dns_transmit *); +extern int serverwantstcp(const char *,unsigned int); +extern int serverfailed(const char *,unsigned int); +extern int getscopeid(const struct dns_transmit *,const char *); +extern int firstudp(struct dns_transmit *); +extern int nextudp(struct dns_transmit *); +extern int firsttcp(struct dns_transmit *); +extern int nexttcp(struct dns_transmit *); + +#endif |