#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 "iopause.h" #include "stralloc.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