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