#include "exim.h"
-
/*************************************************
* Fake DNS resolver *
*************************************************/
/*XXX the derivation of this value needs explaining */
#define DNS_FAILTAG_MAX 290
+#define alignment \
+ (sizeof(void *) > sizeof(double) ? sizeof(void *) : sizeof(double))
+#define align(n) \
+ (((((intptr_t)n) + (alignment-1)) / alignment) * alignment)
+#define DNS_FAILNODE_SIZE \
+ align(sizeof(tree_node) + DNS_FAILTAG_MAX + sizeof(expiring_data))
static int
dns_fail_return(const uschar * name, int type, time_t expiry, int rc)
e = previous->data.ptr;
else
{
- new = store_get_perm(
- sizeof(tree_node) + DNS_FAILTAG_MAX + sizeof(expiring_data), is_tainted(name));
+ new = store_get_perm(DNS_FAILNODE_SIZE, is_tainted(name));
dns_fail_tag(new->name, name, type);
- e = (expiring_data *)((char *)new + sizeof(tree_node) + DNS_FAILTAG_MAX);
+ e = (expiring_data *) align((char *)new + sizeof(tree_node) + DNS_FAILTAG_MAX);
new->data.ptr = e;
(void)tree_insertnode(&tree_dns_fails, new);
}
bother doing a separate lookup; if not found return a forever TTL.
*/
-static time_t
+time_t
dns_expire_from_soa(dns_answer * dnsa)
{
const HEADER * h = (const HEADER *)dnsa->answer;
/* Skip the SOA serial, refresh, retry & expire. Grab the TTL */
- if (p > dnsa->answer + dnsa->answerlen - 5 * NS_INT32SZ)
+ if (p > dnsa->answer + dnsa->answerlen - 5 * INT32SZ)
break;
- p += 4 * NS_INT32SZ;
+ p += 4 * INT32SZ;
GETLONG(ttl, p);
return time(NULL) + ttl;