Allow multiple CNAMEs in a single --cname= option.

This commit is contained in:
Simon Kelley
2016-12-22 22:09:50 +00:00
parent 0682b7795c
commit a1d973f987
2 changed files with 24 additions and 15 deletions

View File

@@ -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

View File

@@ -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;