]> jfr.im git - irc/evilnet/x3.git/blame - src/sar.h
Couple of srvx updates.
[irc/evilnet/x3.git] / src / sar.h
CommitLineData
1136f709 1/* sar.h - srvx asynchronous resolver
2 * Copyright 2005, 2007 Michael Poole <mdpoole@troilus.org>
3 *
4 * This file is part of srvx.
5 *
6 * srvx is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
be2c97a5 8 * the Free Software Foundation; either version 3 of the License, or
1136f709 9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with srvx; if not, write to the Free Software Foundation,
18 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
19 */
20
21#if !defined(SRVX_SAR_H)
22#define SRVX_SAR_H
23
24#include "common.h"
25
26#define SAI_NUMERICHOST 0x01 /* simply translate address from text form */
27#define SAI_CANONNAME 0x02 /* fill in canonical name of host */
28#define SAI_PASSIVE 0x04 /* if node==NULL, use unspecified address */
29#define SAI_V4MAPPED 0x08 /* accept v4-mapped IPv6 addresses */
30#define SAI_ALL 0x10 /* return both IPv4 and IPv6 addresses */
31#define SAI_NOSRV 0x20 /* suppress SRV even if default is to use it */
32#define SAI_FORCESRV 0x40 /* force SRV request even if questionable */
33
34#define SNI_NOFQDN 0x01 /* omit domain name for local hosts */
35#define SNI_NUMERICHOST 0x02 /* do not resolve address, just translate to text */
36#define SNI_NAMEREQD 0x04 /* indicate error if no name exists */
37#define SNI_NUMERICSERV 0x08 /* return service in numeric form */
38#define SNI_DGRAM 0x10 /* return service names for UDP use */
39#define SNI_PARANOID 0x20 /* confirm forward resolution of name */
40
41enum sar_errcode {
42 SAI_SUCCESS,
43 SAI_FAMILY,
44 SAI_SOCKTYPE,
45 SAI_BADFLAGS,
46 SAI_NONAME,
47 SAI_SERVICE,
48 SAI_ADDRFAMILY,
49 SAI_NODATA,
50 SAI_MEMORY,
51 SAI_FAIL,
52 SAI_AGAIN,
53 SAI_MISMATCH,
54 SAI_SYSTEM
55};
56
57struct sockaddr;
58struct addrinfo;
59struct sar_request;
60
61void sar_init(void);
62const char *sar_strerror(enum sar_errcode errcode);
63
64int sar_get_port(const struct sockaddr *sa, unsigned int socklen);
65int sar_set_port(struct sockaddr *sa, unsigned int socklen, unsigned short port);
66unsigned int sar_pton(struct sockaddr *sa, unsigned int socklen, unsigned int *bits, const char *input);
67typedef void (*sar_addr_cb)(void *ctx, struct addrinfo *res, enum sar_errcode errcode);
68struct sar_request *sar_getaddr(const char *node, const char *service, const struct addrinfo *hints, sar_addr_cb cb, void *cb_ctx);
69void sar_free(struct addrinfo *ai);
70
71/** Maximum value returnable by sar_ntop(). */
72#define SAR_NTOP_MAX 40
73unsigned int sar_ntop(char *output, unsigned int out_size, const struct sockaddr *sa, unsigned int socklen);
74typedef void (*sar_name_cb)(void *ctx, const char *host, const char *serv, enum sar_errcode errcode);
75struct sar_request *sar_getname(const struct sockaddr *sa, unsigned int salen, int flags, sar_name_cb cb, void *cb_ctx);
76
77/** Generic DNS lookup support. */
78
79/** DNS message (request and response) header. */
80struct dns_header {
81 uint16_t id;
82 uint16_t flags;
83#define REQ_FLAG_QR 0x8000 /* response */
84#define REQ_FLAG_OPCODE_MASK 0x7800 /* opcode mask */
85#define REQ_FLAG_OPCODE_SHIFT 11 /* opcode shift count */
86#define REQ_OPCODE_QUERY (0 << REQ_FLAG_OPCODE_SHIFT)
87#define REQ_FLAG_AA 0x0400 /* authoritative answer */
88#define REQ_FLAG_TC 0x0200 /* truncated message */
89#define REQ_FLAG_RD 0x0100 /* recursion desired */
90#define REQ_FLAG_RA 0x0080 /* recursion available */
91/* 0x0040 bit currently reserved and must be zero; 0x0020 and 0x0010
92 * used by DNSSEC. */
93#define REQ_FLAG_RCODE_MASK 0x000f /* response code mask */
94#define REQ_FLAG_RCODE_SHIFT 0 /* response code shift count */
95#define RCODE_NO_ERROR 0
96#define RCODE_FORMAT_ERROR 1
97#define RCODE_SERVER_FAILURE 2
98#define RCODE_NAME_ERROR 3 /* aka NXDOMAIN (since RFC2308) */
99#define RCODE_NOT_IMPLEMENTED 4
100#define RCODE_REFUSED 5
101#define RCODE_BAD_OPT_VERSION 16 /* RFC 2671 */
102 uint16_t qdcount; /* count of questions */
103 uint16_t ancount; /* count of answer RRs */
104 uint16_t nscount; /* count of NS (authority) RRs */
105 uint16_t arcount; /* count of additional RRs */
106};
107
108/** DNS resource record. */
109struct dns_rr {
110 uint16_t type;
111 uint16_t class;
112 uint32_t ttl;
113 uint16_t rdlength;
114 uint16_t rd_start;
115 char *name;
116};
117
118#define REQ_TYPE_A 1
119#define REQ_TYPE_NS 2
120#define REQ_TYPE_CNAME 5
121#define REQ_TYPE_SOA 6
122#define REQ_TYPE_PTR 12
123#define REQ_TYPE_MX 15
124#define REQ_TYPE_TXT 16
125#define REQ_TYPE_AAAA 28 /* RFC 3596 */
126#define REQ_TYPE_SRV 33 /* RFC 2782 */
127#define REQ_TYPE_OPT 41 /* RFC 2671 */
128#define REQ_QTYPE_ALL 255
129#define REQ_CLASS_IN 1
130#define REQ_QCLASS_ALL 255
131
132struct sar_request;
133typedef void (*sar_request_ok_cb)(struct sar_request *req, struct dns_header *hdr, struct dns_rr *rr, unsigned char *raw, unsigned int raw_size);
134typedef void (*sar_request_fail_cb)(struct sar_request *req, unsigned int rcode);
135
136/** Pending request structure.
137 * User code should treat this structure as opaque.
138 */
139struct sar_request {
140 int id;
141 time_t expiry;
142 sar_request_ok_cb cb_ok;
143 sar_request_fail_cb cb_fail;
144 unsigned char *body;
145 unsigned int body_len;
146 unsigned char retries;
147 char id_text[6];
148};
149
150const char *sar_rcode_text(unsigned int rcode);
151struct sar_request *sar_request_alloc(unsigned int data_len, sar_request_ok_cb ok_cb, sar_request_fail_cb fail_cb);
152unsigned int sar_request_build(struct sar_request *req, ...);
153void sar_request_send(struct sar_request *req);
154struct sar_request *sar_request_simple(unsigned int data_len, sar_request_ok_cb ok_cb, sar_request_fail_cb fail_cb, ...);
155void sar_request_abort(struct sar_request *req);
156char *sar_extract_name(const unsigned char *buf, unsigned int size, unsigned int *ppos);
157
158#endif /* !defined(SRVX_SAR_H) */