added basic ssl support to ircu
[ircu2.10.12-pk.git] / include / res.h
index 1029af09043087bb152559f11d130e218927a0a1..0cfbeea5576ec639e6a74bee44c8bd0d00fe2cdc 100644 (file)
@@ -45,6 +45,7 @@ struct StatDesc;
 #define QUERY 0      /**< Forward (normal) DNS query operation. */
 #define NO_ERRORS 0  /**< No errors processing a query. */
 #define SERVFAIL 2   /**< Server error while processing a query. */
+#define NXDOMAIN 3   /**< Domain name in query does not exist. */
 #define T_A 1        /**< Hostname -> IPv4 query type. */
 #define T_AAAA 28    /**< Hostname -> IPv6 query type. */
 #define T_PTR 12     /**< IP(v4 or v6) -> hostname query type. */
@@ -66,19 +67,8 @@ struct irc_sockaddr
   unsigned short port;     /**< Port number, host-endian. */
 };
 
-/** DNS reply structure. */
-struct DNSReply
-{
-  char *h_name;   /**< Hostname. */
-  struct irc_in_addr addr; /**< IP address. */
-};
-
-/** DNS callback structure. */
-struct DNSQuery
-{
-  void *vptr; /**< pointer used by callback to identify request */
-  void (*callback)(void* vptr, struct DNSReply *reply); /**< callback to call */
-};
+/** DNS callback function signature. */
+typedef void (*dns_callback_f)(void *vptr, const struct irc_in_addr *addr, const char *h_name);
 
 /** DNS query and response header. */
 typedef struct
@@ -119,13 +109,25 @@ typedef struct
 } HEADER;
 
 extern void restart_resolver(void);
+extern void clear_nameservers(void);
+extern void add_nameserver(const char *ipaddr);
 extern void add_local_domain(char *hname, size_t size);
 extern size_t cres_mem(struct Client* cptr);
 extern void delete_resolver_queries(const void *vptr);
 extern void report_dns_servers(struct Client *source_p, const struct StatDesc *sd, char *param);
-extern void gethost_byname(const char *name, const struct DNSQuery *query);
-extern void gethost_byaddr(const struct irc_in_addr *addr, const struct DNSQuery *query);
-
+extern void gethost_byname(const char *name, dns_callback_f callback, void *ctx);
+extern void gethost_byaddr(const struct irc_in_addr *addr, dns_callback_f callback, void *ctx);
+
+/** Evaluate to non-zero if \a ADDR is an unspecified (all zeros) address. */
+#define irc_in_addr_unspec(ADDR) (((ADDR)->in6_16[0] == 0) \
+                                  && ((ADDR)->in6_16[1] == 0) \
+                                  && ((ADDR)->in6_16[2] == 0) \
+                                  && ((ADDR)->in6_16[3] == 0) \
+                                  && ((ADDR)->in6_16[4] == 0) \
+                                  && ((ADDR)->in6_16[6] == 0) \
+                                  && ((ADDR)->in6_16[7] == 0) \
+                                  && ((ADDR)->in6_16[5] == 0 \
+                                      || (ADDR)->in6_16[5] == 65535))
 /** Evaluate to non-zero if \a ADDR is a valid address (not all 0s and not all 1s). */
 #define irc_in_addr_valid(ADDR) (((ADDR)->in6_16[0] && ~(ADDR)->in6_16[0]) \
                                  || (ADDR)->in6_16[1] != (ADDR)->in6_16[0] \
@@ -137,8 +139,9 @@ extern void gethost_byaddr(const struct irc_in_addr *addr, const struct DNSQuery
                                  || (ADDR)->in6_16[7] != (ADDR)->in6_16[0])
 /** Evaluate to non-zero if \a ADDR (of type struct irc_in_addr) is an IPv4 address. */
 #define irc_in_addr_is_ipv4(ADDR) (!(ADDR)->in6_16[0] && !(ADDR)->in6_16[1] && !(ADDR)->in6_16[2] \
-                                   && !(ADDR)->in6_16[3] && !(ADDR)->in6_16[4] && (ADDR)->in6_16[6] \
-                                   && (!(ADDR)->in6_16[5] || (ADDR)->in6_16[5] == 65535))
+                                   && !(ADDR)->in6_16[3] && !(ADDR)->in6_16[4] \
+                                   && ((!(ADDR)->in6_16[5] && (ADDR)->in6_16[6]) \
+                                       || (ADDR)->in6_16[5] == 65535))
 /** Evaluate to non-zero if \a A is a different IP than \a B. */
 #define irc_in_addr_cmp(A,B) (irc_in_addr_is_ipv4(A) ? ((A)->in6_16[6] != (B)->in6_16[6] \
                                   || (A)->in6_16[7] != (B)->in6_16[7] || !irc_in_addr_is_ipv4(B)) \