mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 10:18:25 +00:00
Allow multiple CNAMEs in a single --cname= option.
This commit is contained in:
@@ -581,7 +581,7 @@ Return a PTR DNS record.
|
|||||||
.B --naptr-record=<name>,<order>,<preference>,<flags>,<service>,<regexp>[,<replacement>]
|
.B --naptr-record=<name>,<order>,<preference>,<flags>,<service>,<regexp>[,<replacement>]
|
||||||
Return an NAPTR DNS record, as specified in RFC3403.
|
Return an NAPTR DNS record, as specified in RFC3403.
|
||||||
.TP
|
.TP
|
||||||
.B --cname=<cname>,<target>[,<TTL>]
|
.B --cname=<cname>,[<cname>,]<target>[,<TTL>]
|
||||||
Return a CNAME record which indicates that <cname> is really
|
Return a CNAME record which indicates that <cname> is really
|
||||||
<target>. There are significant limitations on the target; it must be a
|
<target>. There are significant limitations on the target; it must be a
|
||||||
DNS name which is known to dnsmasq from /etc/hosts (or additional
|
DNS name which is known to dnsmasq from /etc/hosts (or additional
|
||||||
@@ -589,7 +589,9 @@ hosts files), from DHCP, from --interface-name or from another
|
|||||||
.B --cname.
|
.B --cname.
|
||||||
If the target does not satisfy this
|
If the target does not satisfy this
|
||||||
criteria, the whole cname is ignored. The cname must be unique, but it
|
criteria, the whole cname is ignored. The cname must be unique, but it
|
||||||
is permissable to have more than one cname pointing to the same target.
|
is permissable to have more than one cname pointing to the same target. Indeed
|
||||||
|
it's possible to declare multiple cnames to a target in a single line, like so:
|
||||||
|
.B --cname=cname1,cname2,target
|
||||||
|
|
||||||
If the time-to-live is given, it overrides the default, which is zero
|
If the time-to-live is given, it overrides the default, which is zero
|
||||||
or the value of -local-ttl. The value is a positive integer and gives
|
or the value of -local-ttl. The value is a positive integer and gives
|
||||||
|
|||||||
33
src/option.c
33
src/option.c
@@ -3728,22 +3728,27 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
|
|||||||
case LOPT_CNAME: /* --cname */
|
case LOPT_CNAME: /* --cname */
|
||||||
{
|
{
|
||||||
struct cname *new;
|
struct cname *new;
|
||||||
char *alias, *target, *ttls;
|
char *alias, *target, *last, *pen;
|
||||||
int ttl = -1;
|
int ttl = -1;
|
||||||
|
|
||||||
if (!(comma = split(arg)))
|
for (last = pen = NULL, comma = arg; comma; comma = split(comma))
|
||||||
ret_err(gen_err);
|
|
||||||
|
|
||||||
if ((ttls = split(comma)) && !atoi_check(ttls, &ttl))
|
|
||||||
ret_err(_("bad TTL"));
|
|
||||||
|
|
||||||
alias = canonicalise_opt(arg);
|
|
||||||
target = canonicalise_opt(comma);
|
|
||||||
|
|
||||||
if (!alias || !target)
|
|
||||||
ret_err(_("bad CNAME"));
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
|
pen = last;
|
||||||
|
last = comma;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pen)
|
||||||
|
ret_err(_("bad CNAME"));
|
||||||
|
|
||||||
|
if (pen != arg && atoi_check(last, &ttl))
|
||||||
|
last = pen;
|
||||||
|
|
||||||
|
target = canonicalise_opt(last);
|
||||||
|
|
||||||
|
while (arg != last)
|
||||||
|
{
|
||||||
|
alias = canonicalise_opt(arg);
|
||||||
|
|
||||||
for (new = daemon->cnames; new; new = new->next)
|
for (new = daemon->cnames; new; new = new->next)
|
||||||
if (hostname_isequal(new->alias, arg))
|
if (hostname_isequal(new->alias, arg))
|
||||||
ret_err(_("duplicate CNAME"));
|
ret_err(_("duplicate CNAME"));
|
||||||
@@ -3753,6 +3758,8 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
|
|||||||
new->alias = alias;
|
new->alias = alias;
|
||||||
new->target = target;
|
new->target = target;
|
||||||
new->ttl = ttl;
|
new->ttl = ttl;
|
||||||
|
|
||||||
|
arg += strlen(arg)+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user