Commit a1d973f9 authored by Simon Kelley's avatar Simon Kelley

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

parent 0682b779
...@@ -581,7 +581,7 @@ Return a PTR DNS record. ...@@ -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 ...@@ -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
......
...@@ -3728,22 +3728,27 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma ...@@ -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); {
pen = last;
if ((ttls = split(comma)) && !atoi_check(ttls, &ttl)) last = comma;
ret_err(_("bad TTL")); }
alias = canonicalise_opt(arg); if (!pen)
target = canonicalise_opt(comma);
if (!alias || !target)
ret_err(_("bad CNAME")); ret_err(_("bad CNAME"));
else
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 ...@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment