this patch adds a 'min-ttl' configuration option. this allows you to override the ttl for all queries ... for example, if you run `dnsmasq --min-ttl 3600`, then dnsmasq will cache all queries for at least 1 day (3600 seconds in a day) even if the record has a ttl value of say 300 seconds (like google normally uses)
after reading the archives it seems like this probably won't be added to the official package, but i imagine some people want this feature, so at least it'll sit in the mail archives for people to use :p -mike
--- dnsmasq-2.22/src/dnsmasq.h +++ dnsmasq-2.22/src/dnsmasq.h @@ -399,7 +399,7 @@ struct server *servers; int cachesize; int port, query_port; - unsigned long local_ttl; + unsigned long local_ttl, min_ttl; struct hostsfile *addn_hosts; struct dhcp_context *dhcp; struct dhcp_config *dhcp_conf; --- dnsmasq-2.22/src/option.c +++ dnsmasq-2.22/src/option.c @@ -21,7 +21,7 @@ int val; }; -#define OPTSTRING "yZDNLERKzowefnbvhdkqr:m:p:c:l:s:i:t:u:g:a:x:S:C:A:T:H:Q:I:B:F:G:O:M:X:V:U:j:P:J:W:Y:" +#define OPTSTRING "yZDNLERKzowefnbvhdkqr:m:p:c:l:s:i:t:u:g:a:x:S:C:A:T:H:Q:I:B:F:G:O:M:X:V:U:j:P:J:W:Y:_:" static struct myoption opts[] = { {"version", 0, 0, 'v'}, @@ -79,6 +79,7 @@ {"srv-host", 1, 0, 'W'}, {"localise-queries", 0, 0, 'y'}, {"txt-record", 1, 0, 'Y'}, + {"min-ttl", 1, 0, '_'}, {0, 0, 0, 0} }; @@ -170,6 +171,7 @@ "-Y --txt-record=name,txt.... Specify TXT DNS record.\n" "-z, --bind-interfaces Bind only to interfaces in use.\n" "-Z, --read-ethers Read DHCP static host information from " ETHERSFILE ".\n" +"-_, --min-ttl Force all records to have a TTL at least this long.\n" "\n"; static void add_txt(struct daemon *daemon, char *name, char *txt) @@ -216,6 +218,7 @@ /* Set defaults - everything else is zero or NULL */ daemon->min_leasetime = UINT_MAX; + daemon->local_ttl = daemon->min_ttl = 0; daemon->cachesize = CACHESIZ; daemon->port = NAMESERVER_PORT; daemon->default_resolv.is_default = 1; @@ -819,6 +822,16 @@ break; } + case '_': + { + int ttl; + if (!atoi_check(arg, &ttl)) + option = '?'; + else + daemon->min_ttl = (unsigned long)ttl; + break; + } + case 'X': if (!atoi_check(arg, &daemon->dhcp_max)) option = '?'; --- dnsmasq-2.22/src/rfc1035.c +++ dnsmasq-2.22/src/rfc1035.c @@ -607,6 +607,8 @@ /* TTL of record is minimum of CNAMES and PTR */ if (attl < cttl) cttl = attl; + if (cttl < daemon->min_ttl) + cttl = daemon->min_ttl; if (aqclass == C_IN && res != 2 && (aqtype == T_CNAME || aqtype == T_PTR)) { @@ -637,6 +642,8 @@ searched_soa = 1; ttl = find_soa(header, NULL, qlen); } + if (ttl < daemon->min_ttl) + ttl = daemon->min_ttl; if (ttl) cache_insert(name, &addr, now, ttl, name_encoding | F_REVERSE | F_NEG | flags); } @@ -671,6 +681,8 @@ GETLONG(attl, p1); GETSHORT(ardlen, p1); endrr = p1+ardlen; + if (attl < daemon->min_ttl) + attl = daemon->min_ttl; if (aqclass == C_IN && res != 2 && (aqtype == T_CNAME || aqtype == qtype)) { @@ -725,6 +740,8 @@ pointing at this, inherit it's TTL */ if (ttl || cpp) { + if (ttl < daemon->min_ttl) + ttl = daemon->min_ttl; newc = cache_insert(name, (struct all_addr *)p, now, ttl ? ttl : cttl, F_FORWARD | F_NEG | flags); if (newc && cpp) { --- dnsmasq-2.22/src/dnsmasq.8 +++ dnsmasq-2.22/src/dnsmasq.8 @@ -46,6 +46,9 @@ reduce the load on the server at the expense of clients using stale data under some circumstances. .TP +.B \-_, --min-ttl=<time> +When storing entries in the cache, override the minimum TTL value. +.TP .B \-k, --keep-in-foreground Do not go into the background at startup but otherwise run as normal. This is intended for use when dnsmasq is run under daemontools. --- dnsmasq-2.22/src/dnsmasq.conf.example +++ dnsmasq-2.22/src/dnsmasq.conf.example @@ -282,6 +282,11 @@ # seconds) here. #local-ttl= +# Set a minimum Time-To-Live value for all cached entries. If an entry has +# a larger TTL, then that will still be used. See the warning in local-ttl +# about load vs stale data. +#min-ttl= + # If you want dnsmasq to detect attempts by Verisign to send queries # to unregistered .com and .net hosts to its sitefinder service and # have dnsmasq instead return the correct NXDOMAIN response, uncomment