1#ifndef res_9_private_h 2#define res_9_private_h 3#include <arpa/inet.h> 4#include <sys/time.h> 5#include <stdint.h> 6 7/* 8 * status codes from dns_res_xxx SPIs 9 * positive numbers are ns_rcode values. 10 */ 11#define DNS_RES_STATUS_TIMEOUT -1001 12#define DNS_RES_STATUS_CANCELLED -1002 13#define DNS_RES_STATUS_INVALID_QUERY -1003 14#define DNS_RES_STATUS_INVALID_ARGUMENT -1004 15#define DNS_RES_STATUS_INVALID_RES_STATE -1005 16#define DNS_RES_STATUS_INVALID_REPLY -1006 17#define DNS_RES_STATUS_CONNECTION_REFUSED -1007 18#define DNS_RES_STATUS_SEND_FAILED -1008 19#define DNS_RES_STATUS_CONNECTION_FAILED -1009 20#define DNS_RES_STATUS_SYSTEM_ERROR -1010 21 22#define RES_EXT_SUFFIX_LEN 64 23 24typedef struct { 25 unsigned id :16; /* query identification number */ 26#if BYTE_ORDER == BIG_ENDIAN 27 /* fields in third byte */ 28 unsigned qr: 1; /* response flag */ 29 unsigned opcode: 4; /* purpose of message */ 30 unsigned aa: 1; /* authoritive answer */ 31 unsigned tc: 1; /* truncated message */ 32 unsigned rd: 1; /* recursion desired */ 33 /* fields in fourth byte */ 34 unsigned ra: 1; /* recursion available */ 35 unsigned unused :3; /* unused bits (MBZ as of 4.9.3a3) */ 36 unsigned rcode :4; /* response code */ 37#endif 38#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN 39 /* fields in third byte */ 40 unsigned rd :1; /* recursion desired */ 41 unsigned tc :1; /* truncated message */ 42 unsigned aa :1; /* authoritive answer */ 43 unsigned opcode :4; /* purpose of message */ 44 unsigned qr :1; /* response flag */ 45 /* fields in fourth byte */ 46 unsigned rcode :4; /* response code */ 47 unsigned unused :3; /* unused bits (MBZ as of 4.9.3a3) */ 48 unsigned ra :1; /* recursion available */ 49#endif 50 /* remaining bytes */ 51 unsigned qdcount :16; /* number of question entries */ 52 unsigned ancount :16; /* number of answer entries */ 53 unsigned nscount :16; /* number of authority entries */ 54 unsigned arcount :16; /* number of resource entries */ 55} HEADER; 56 57#ifndef __res_state_ext 58#define __res_state_ext __res_9_res_state_ext 59#endif 60 61struct __res_state_ext { 62 union res_sockaddr_union nsaddrs[MAXNS]; 63 struct sort_list { 64 int af; 65 union { 66 struct in_addr ina; 67 struct in6_addr in6a; 68 } addr, mask; 69 } sort_list[MAXRESOLVSORT]; 70 char nsuffix[64]; 71 char bsuffix[64]; 72 char nsuffix2[64]; 73}; 74 75#define get_nsaddr res_9_get_nsaddr 76struct sockaddr *get_nsaddr __P((res_state, size_t)); 77 78#define res_nsend_2 res_9_nsend_2 79int res_nsend_2(res_state, const u_char *, int, u_char *, int, struct sockaddr *, int *); 80 81#define res_ourserver_p res_9_ourserver_p 82int res_ourserver_p(const res_state, const struct sockaddr *); 83 84res_state res_state_new(); 85void res_client_close(res_state res); 86 87/* 88 * From lookupd Thread.h. We use this to signal threads to quit, since pthread_cancel() doesn't work. 89 */ 90#define ThreadStateExitRequested 4 91 92/* 93 * notification SPI 94 */ 95extern uint32_t notify_register_plain(const char *name, int *out_token); 96 97extern int res_query_mDNSResponder(res_state statp, const char *name, int class, int type, u_char *answer, int anslen, struct sockaddr *from, uint32_t *fromlen); 98 99int dns_res_once(struct sockaddr *server, struct timeval *timeout, int options, const char *name, int class, int type, u_char *res, int *reslen); 100 101/* 102 * Interrupt a thread blocked in select() 103 */ 104void res_interrupt_requests_enable(void); 105void res_interrupt_requests_disable(void); 106void res_interrupt_request(void *token); 107void *res_init_interrupt_token(void); 108void res_delete_interrupt_token(void *token); 109 110#endif 111