chiark
/
gitweb
/
~mdw
/
adns
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Include TTL (well, actually, expiry time) in answers.
[adns]
/
src
/
internal.h
diff --git
a/src/internal.h
b/src/internal.h
index 27d025878ef00136d20e862d36de7d30ac00eaeb..5e59a12877b066eb47a199a2aae8f491bc52c7a3 100644
(file)
--- a/
src/internal.h
+++ b/
src/internal.h
@@
-5,7
+5,7
@@
* - comments regarding library data structures
*/
/*
* - comments regarding library data structures
*/
/*
- * This file is part of adns, which is Copyright (C) 1997
, 1998
Ian Jackson
+ * This file is part of adns, which is Copyright (C) 1997
-1999
Ian Jackson
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@
-25,7
+25,7
@@
#ifndef ADNS_INTERNAL_H_INCLUDED
#define ADNS_INTERNAL_H_INCLUDED
#ifndef ADNS_INTERNAL_H_INCLUDED
#define ADNS_INTERNAL_H_INCLUDED
-#
define PRINTFFORMAT(a,b) __attribute__((format(printf,a,b)))
+#
include "config.h"
typedef unsigned char byte;
#include <stdarg.h>
typedef unsigned char byte;
#include <stdarg.h>
@@
-39,10
+39,12
@@
typedef unsigned char byte;
/* Configuration and constants */
#define MAXSERVERS 5
/* Configuration and constants */
#define MAXSERVERS 5
-#define UDPMAXRETRIES /*15*/5
+#define MAXSORTLIST 15
+#define UDPMAXRETRIES 15
#define UDPRETRYMS 2000
#define TCPMS 30000
#define LOCALRESOURCEMS 20
#define UDPRETRYMS 2000
#define TCPMS 30000
#define LOCALRESOURCEMS 20
+#define MAXTTLBELIEVE (7*86400) /* any TTL > 7 days is capped */
#define DNS_PORT 53
#define DNS_MAXUDP 512
#define DNS_PORT 53
#define DNS_MAXUDP 512
@@
-115,7
+117,7
@@
typedef struct {
* nsstart is the offset of the authority section.
*/
* nsstart is the offset of the authority section.
*/
- int (*diff_needswap)(const void *datap_a, const void *datap_b);
+ int (*diff_needswap)(
adns_state ads,
const void *datap_a, const void *datap_b);
/* Returns !0 if RR a should be strictly after RR b in the sort order,
* 0 otherwise. Must not fail.
*/
/* Returns !0 if RR a should be strictly after RR b in the sort order,
* 0 otherwise. Must not fail.
*/
@@
-180,6
+182,7
@@
struct adns__query {
int udpnextserver;
unsigned long udpsent, tcpfailed; /* bitmap indexed by server */
struct timeval timeout;
int udpnextserver;
unsigned long udpsent, tcpfailed; /* bitmap indexed by server */
struct timeval timeout;
+ time_t expires; /* Earliest expiry time of any record we used. */
qcontext ctx;
qcontext ctx;
@@
-243,12
+246,15
@@
struct adns__state {
struct { adns_query head, tail; } timew, childw, output;
int nextid, udpsocket, tcpsocket;
vbuf tcpsend, tcprecv;
struct { adns_query head, tail; } timew, childw, output;
int nextid, udpsocket, tcpsocket;
vbuf tcpsend, tcprecv;
- int nservers, tcpserver;
+ int nservers,
nsortlist,
tcpserver;
enum adns__tcpstate { server_disconnected, server_connecting, server_ok } tcpstate;
struct timeval tcptimeout;
struct server {
struct in_addr addr;
} servers[MAXSERVERS];
enum adns__tcpstate { server_disconnected, server_connecting, server_ok } tcpstate;
struct timeval tcptimeout;
struct server {
struct in_addr addr;
} servers[MAXSERVERS];
+ struct sortlist {
+ struct in_addr base, mask;
+ } sortlist[MAXSORTLIST];
};
/* From setup.c: */
};
/* From setup.c: */
@@
-289,7
+295,8
@@
const char *adns__diag_domain(adns_state ads, int serv, adns_query qu,
*/
void adns__isort(void *array, int nobjs, int sz, void *tempbuf,
*/
void adns__isort(void *array, int nobjs, int sz, void *tempbuf,
- int (*needswap)(const void *a, const void *b));
+ int (*needswap)(void *context, const void *a, const void *b),
+ void *context);
/* Does an insertion sort of array which must contain nobjs objects
* each sz bytes long. tempbuf must point to a buffer at least
* sz bytes long. needswap should return !0 if a>b (strictly, ie
/* Does an insertion sort of array which must contain nobjs objects
* each sz bytes long. tempbuf must point to a buffer at least
* sz bytes long. needswap should return !0 if a>b (strictly, ie
@@
-374,6
+381,10
@@
void adns__transfer_interim(adns_query from, adns_query to, void *block, size_t
*
* It is legal to call adns__transfer_interim with a null pointer; this
* has no effect.
*
* It is legal to call adns__transfer_interim with a null pointer; this
* has no effect.
+ *
+ * _transfer_interim also ensures that the expiry time of the `to' query
+ * is no later than that of the `from' query, so that child queries'
+ * TTLs get inherited by their parents.
*/
void *adns__alloc_mine(adns_query qu, size_t sz);
*/
void *adns__alloc_mine(adns_query qu, size_t sz);
@@
-473,16
+484,17
@@
adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
adns_status adns__findrr(adns_query qu, int serv,
const byte *dgram, int dglen, int *cbyte_io,
adns_status adns__findrr(adns_query qu, int serv,
const byte *dgram, int dglen, int *cbyte_io,
- int *type_r, int *class_r, int *rdlen_r, int *rdstart_r,
+ int *type_r, int *class_r, unsigned long *ttl_r,
+ int *rdlen_r, int *rdstart_r,
int *ownermatchedquery_r);
/* Finds the extent and some of the contents of an RR in a datagram
* and does some checks. The datagram is *dgram, length dglen, and
* the RR starts at *cbyte_io (which is updated afterwards to point
* to the end of the RR).
*
int *ownermatchedquery_r);
/* Finds the extent and some of the contents of an RR in a datagram
* and does some checks. The datagram is *dgram, length dglen, and
* the RR starts at *cbyte_io (which is updated afterwards to point
* to the end of the RR).
*
- * The type, class and RRdata length and start are returned iff
- * the corresponding pointer variables are not null. type_r
and
- *
class_r may not be null
.
+ * The type, class
, TTL
and RRdata length and start are returned iff
+ * the corresponding pointer variables are not null. type_r
, class_r
+ *
and ttl_r may not be null. The TTL will be capped
.
*
* If ownermatchedquery_r != 0 then the owner domain of this
* RR will be compared with that in the query (or, if the query
*
* If ownermatchedquery_r != 0 then the owner domain of this
* RR will be compared with that in the query (or, if the query
@@
-501,7
+513,8
@@
adns_status adns__findrr(adns_query qu, int serv,
adns_status adns__findrr_anychk(adns_query qu, int serv,
const byte *dgram, int dglen, int *cbyte_io,
adns_status adns__findrr_anychk(adns_query qu, int serv,
const byte *dgram, int dglen, int *cbyte_io,
- int *type_r, int *class_r, int *rdlen_r, int *rdstart_r,
+ int *type_r, int *class_r, unsigned long *ttl_r,
+ int *rdlen_r, int *rdstart_r,
const byte *eo_dgram, int eo_dglen, int eo_cbyte,
int *eo_matched_r);
/* Like adns__findrr_checked, except that the datagram and
const byte *eo_dgram, int eo_dglen, int eo_cbyte,
int *eo_matched_r);
/* Like adns__findrr_checked, except that the datagram and
@@
-518,6
+531,11
@@
adns_status adns__findrr_anychk(adns_query qu, int serv,
* untruncated.
*/
* untruncated.
*/
+void adns__update_expires(adns_query qu, unsigned long ttl, struct timeval now);
+/* Updates the `expires' field in the query, so that it doesn't exceed
+ * now + ttl.
+ */
+
int vbuf__append_quoted1035(vbuf *vb, const byte *buf, int len);
/* From event.c: */
int vbuf__append_quoted1035(vbuf *vb, const byte *buf, int len);
/* From event.c: */
@@
-576,5
+594,11
@@
static inline int ctype_alpha(int c) {
#define GETIL_B(cb) (((dgram)[(cb)++]) & 0x0ff)
#define GET_B(cb,tv) ((tv)= GETIL_B((cb)))
#define GET_W(cb,tv) ((tv)=0, (tv)|=(GETIL_B((cb))<<8), (tv)|=GETIL_B(cb), (tv))
#define GETIL_B(cb) (((dgram)[(cb)++]) & 0x0ff)
#define GET_B(cb,tv) ((tv)= GETIL_B((cb)))
#define GET_W(cb,tv) ((tv)=0, (tv)|=(GETIL_B((cb))<<8), (tv)|=GETIL_B(cb), (tv))
+#define GET_L(cb,tv) ( (tv)=0, \
+ (tv)|=(GETIL_B((cb))<<24), \
+ (tv)|=(GETIL_B((cb))<<16), \
+ (tv)|=(GETIL_B((cb))<<8), \
+ (tv)|=GETIL_B(cb), \
+ (tv) )
#endif
#endif