1#ifndef _DNS_H_INCLUDED_ 2#define _DNS_H_INCLUDED_ 3 4/*++ 5/* NAME 6/* dns 3h 7/* SUMMARY 8/* domain name service lookup 9/* SYNOPSIS 10/* #include <dns.h> 11/* DESCRIPTION 12/* .nf 13 14 /* 15 * System library. 16 */ 17#include <netinet/in.h> 18#include <arpa/nameser.h> 19#ifdef RESOLVE_H_NEEDS_STDIO_H 20#include <stdio.h> 21#endif 22#ifdef RESOLVE_H_NEEDS_NAMESER8_COMPAT_H 23#include <nameser8_compat.h> 24#endif 25#ifdef RESOLVE_H_NEEDS_ARPA_NAMESER_COMPAT_H 26#include <arpa/nameser_compat.h> 27#endif 28#include <resolv.h> 29 30 /* 31 * Name server compatibility. These undocumented macros appear in the file 32 * <arpa/nameser.h>, but since they are undocumented we should not count on 33 * their presence, and so they are included here just in case. 34 */ 35#ifndef GETSHORT 36 37#define GETSHORT(s, cp) { \ 38 unsigned char *t_cp = (u_char *)(cp); \ 39 (s) = ((unsigned)t_cp[0] << 8) \ 40 | ((unsigned)t_cp[1]) \ 41 ; \ 42 (cp) += 2; \ 43} 44 45#define GETLONG(l, cp) { \ 46 unsigned char *t_cp = (u_char *)(cp); \ 47 (l) = ((unsigned)t_cp[0] << 24) \ 48 | ((unsigned)t_cp[1] << 16) \ 49 | ((unsigned)t_cp[2] << 8) \ 50 | ((unsigned)t_cp[3]) \ 51 ; \ 52 (cp) += 4; \ 53} 54 55#endif 56 57 /* 58 * SunOS 4 needs this. 59 */ 60#ifndef T_TXT 61#define T_TXT 16 62#endif 63 64 /* 65 * Utility library. 66 */ 67#include <vstring.h> 68#include <sock_addr.h> 69#include <myaddrinfo.h> 70 71 /* 72 * Structure for fixed resource record data. 73 */ 74typedef struct DNS_FIXED { 75 unsigned short type; /* T_A, T_CNAME, etc. */ 76 unsigned short class; /* C_IN, etc. */ 77 unsigned int ttl; /* always */ 78 unsigned length; /* record length */ 79} DNS_FIXED; 80 81 /* 82 * Structure of a DNS resource record after expansion. The components are 83 * named after the things one can expect to find in a DNS resource record. 84 */ 85typedef struct DNS_RR { 86 char *qname; /* query name, mystrdup()ed */ 87 char *rname; /* reply name, mystrdup()ed */ 88 unsigned short type; /* T_A, T_CNAME, etc. */ 89 unsigned short class; /* C_IN, etc. */ 90 unsigned int ttl; /* always */ 91 unsigned short pref; /* T_MX only */ 92 struct DNS_RR *next; /* linkage */ 93 size_t data_len; /* actual data size */ 94 char data[1]; /* actually a bunch of data */ 95} DNS_RR; 96 97 /* 98 * dns_strerror.c 99 */ 100extern const char *dns_strerror(unsigned); 101 102 /* 103 * dns_strtype.c 104 */ 105extern const char *dns_strtype(unsigned); 106extern unsigned dns_type(const char *); 107 108 /* 109 * dns_rr.c 110 */ 111extern DNS_RR *dns_rr_create(const char *, const char *, 112 ushort, ushort, 113 unsigned, unsigned, 114 const char *, size_t); 115extern void dns_rr_free(DNS_RR *); 116extern DNS_RR *dns_rr_copy(DNS_RR *); 117extern DNS_RR *dns_rr_append(DNS_RR *, DNS_RR *); 118extern DNS_RR *dns_rr_sort(DNS_RR *, int (*) (DNS_RR *, DNS_RR *)); 119extern int dns_rr_compare_pref_ipv6(DNS_RR *, DNS_RR *); 120extern int dns_rr_compare_pref_ipv4(DNS_RR *, DNS_RR *); 121extern int dns_rr_compare_pref_any(DNS_RR *, DNS_RR *); 122extern int dns_rr_compare_pref(DNS_RR *, DNS_RR *); 123extern DNS_RR *dns_rr_shuffle(DNS_RR *); 124extern DNS_RR *dns_rr_remove(DNS_RR *, DNS_RR *); 125 126 /* 127 * dns_rr_to_pa.c 128 */ 129extern const char *dns_rr_to_pa(DNS_RR *, MAI_HOSTADDR_STR *); 130 131 /* 132 * dns_sa_to_rr.c 133 */ 134extern DNS_RR *dns_sa_to_rr(const char *, unsigned, struct sockaddr *); 135 136 /* 137 * dns_rr_to_sa.c 138 */ 139extern int dns_rr_to_sa(DNS_RR *, unsigned, struct sockaddr *, SOCKADDR_SIZE *); 140 141 /* 142 * dns_rr_eq_sa.c 143 */ 144extern int dns_rr_eq_sa(DNS_RR *, struct sockaddr *); 145 146#ifdef HAS_IPV6 147#define DNS_RR_EQ_SA(rr, sa) \ 148 ((SOCK_ADDR_IN_FAMILY(sa) == AF_INET && (rr)->type == T_A \ 149 && SOCK_ADDR_IN_ADDR(sa).s_addr == IN_ADDR((rr)->data).s_addr) \ 150 || (SOCK_ADDR_IN_FAMILY(sa) == AF_INET6 && (rr)->type == T_AAAA \ 151 && memcmp((char *) &(SOCK_ADDR_IN6_ADDR(sa)), \ 152 (rr)->data, (rr)->data_len) == 0)) 153#else 154#define DNS_RR_EQ_SA(rr, sa) \ 155 (SOCK_ADDR_IN_FAMILY(sa) == AF_INET && (rr)->type == T_A \ 156 && SOCK_ADDR_IN_ADDR(sa).s_addr == IN_ADDR((rr)->data).s_addr) 157#endif 158 159 /* 160 * dns_lookup.c 161 */ 162extern int dns_lookup(const char *, unsigned, unsigned, DNS_RR **, 163 VSTRING *, VSTRING *); 164extern int dns_lookup_l(const char *, unsigned, DNS_RR **, VSTRING *, 165 VSTRING *, int,...); 166extern int dns_lookup_v(const char *, unsigned, DNS_RR **, VSTRING *, 167 VSTRING *, int, unsigned *); 168 169 /* 170 * Request flags. 171 */ 172#define DNS_REQ_FLAG_STOP_OK (1<<0) 173#define DNS_REQ_FLAG_STOP_INVAL (1<<1) 174#define DNS_REQ_FLAG_NONE (0) 175 176 /* 177 * Status codes. Failures must have negative codes so they will not collide 178 * with valid counts of answer records etc. 179 */ 180#define DNS_INVAL (-5) /* query ok, malformed reply */ 181#define DNS_FAIL (-4) /* query failed, don't retry */ 182#define DNS_NOTFOUND (-3) /* query ok, data not found */ 183#define DNS_RETRY (-2) /* query failed, try again */ 184#define DNS_RECURSE (-1) /* recursion needed */ 185#define DNS_OK 0 /* query succeeded */ 186 187 /* 188 * How long can a DNS name or single text value be? 189 */ 190#define DNS_NAME_LEN 1024 191 192/* LICENSE 193/* .ad 194/* .fi 195/* The Secure Mailer license must be distributed with this software. 196/* AUTHOR(S) 197/* Wietse Venema 198/* IBM T.J. Watson Research 199/* P.O. Box 704 200/* Yorktown Heights, NY 10598, USA 201/*--*/ 202 203#endif 204