[Dnsmasq-discuss] Domain name wildcard match in the --server option
Mingjian Hong
hongmingjian at gmail.com
Mon Nov 25 15:56:56 GMT 2019
Hi,
I looked around the source code and made some modifications to fit my needs.
With this patch,
server=/.google./127.0.0.1#5053 # match domains with .google. in it or
ending with .google
#server=/.google/127.0.0.1#5053 # ditto
server=/.google.co./127.0.0.1#5053 # the same as server=/.
google.co/127.0.0.1#5053
server=/.google.com/127.0.0.1#5053 # the same as server=/.google.com./
127.0.0.1#5053
.google.com.hk will match the /.google.com/, and .google.co.hk will match
the /.google.co./
Regards,
hmj
---
diff --git a/src/forward.c b/src/forward.c
index e4745a3..6b5976e 100644
--- a/src/forward.c
+++ b/src/forward.c
@@ -150,10 +150,19 @@ static unsigned int search_servers(time_t now, union
all_addr **addrpp, unsigned
}
else if (serv->flags & SERV_HAS_DOMAIN)
{
+ int isequal;
unsigned int domainlen = strlen(serv->domain);
- char *matchstart = qdomain + namelen - domainlen;
+ char *matchstart = strcasestr(qdomain, serv->domain);
+ if ((matchstart != NULL) && (*(matchstart+domainlen) == 0 ||
*(matchstart+domainlen) == '.'))
+ isequal = 1;
+ else
+ {
+ matchstart = qdomain + namelen - domainlen;
+ isequal = hostname_isequal(matchstart, serv->domain);
+ }
+
if (namelen >= domainlen &&
- hostname_isequal(matchstart, serv->domain) &&
+ isequal &&
(domainlen == 0 || namelen == domainlen || *(matchstart-1) == '.' ))
{
if ((serv->flags & SERV_NO_REBIND) && norebind)
@@ -589,9 +598,17 @@ static size_t process_reply(struct dns_header *header,
time_t now, struct server
unsigned int matchlen = 0;
for (ipset_pos = daemon->ipsets; ipset_pos; ipset_pos =
ipset_pos->next)
{
+ int isequal;
unsigned int domainlen = strlen(ipset_pos->domain);
- char *matchstart = daemon->namebuff + namelen - domainlen;
- if (namelen >= domainlen && hostname_isequal(matchstart,
ipset_pos->domain) &&
+ char *matchstart = strcasestr(daemon->namebuff, ipset_pos->domain);
+ if ((matchstart != NULL) && (*(matchstart+domainlen) == 0 ||
*(matchstart+domainlen) == '.'))
+ isequal = 1;
+ else
+ {
+ matchstart = daemon->namebuff + namelen - domainlen;
+ isequal = hostname_isequal(matchstart, ipset_pos->domain);
+ }
+ if (namelen >= domainlen && isequal &&
(domainlen == 0 || namelen == domainlen || *(matchstart - 1) == '.'
) &&
domainlen >= matchlen)
{
--
On Sun, Nov 24, 2019 at 4:45 PM Geert Stappers <stappers at stappers.nl> wrote:
> On Sun, Nov 24, 2019 at 09:09:20AM +0800, Top Quoter wrote:
> > On Sun, Nov 24, 2019 at 1:10 AM Geert Stappers wrote:
> > > On Sat, Nov 23, 2019 at 11:48:45PM +0800, New to Mailinglists wrote:
> > > > In the config file, I have to write several lines for all domains .
> > > > google.com.ar, .google.com.jp, etc. For example,
> > > >
> > > > server=/.google.com.ar/127.0.0.1#5053
> > > > server=/.google.com.jp/127.0.0.1#5053
> > > >
> > > > I just wonder it may be more friendly to use only one line, as
> follows,
> > > >
> > > > server=/.google.com./127.0.0.1#5053
> > > >
> > > > to match any .google.com.XX
> > > >
> > >
> > > Please report back if
> > >
> > > server=/.google.com.*/127.0.0.1#5053
> > >
> > > fits your needs.
> > >
> > >
> > No.
> >
> > server=/.google.com.*/127.0.0.1#5053
> >
> > will not match .google.com.XX
>
>
> Acknowledge.
>
> Time will tell which other possiblities exist.
>
>
> Regards
> Geert Stappers
>
> P.S.
> Make reading in the discussion order possible.
> Example given
> http://lists.thekelleys.org.uk/pipermail/dnsmasq-discuss/2019q4/013526.html
> Reply below the text.
>
> _______________________________________________
> Dnsmasq-discuss mailing list
> Dnsmasq-discuss at lists.thekelleys.org.uk
> http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.thekelleys.org.uk/pipermail/dnsmasq-discuss/attachments/20191125/b3cb61a4/attachment.html>
More information about the Dnsmasq-discuss
mailing list