diff options
author | Tom Marshall <tdm.code@gmail.com> | 2020-01-16 13:07:04 -0800 |
---|---|---|
committer | Tom Marshall <tdm.code@gmail.com> | 2020-01-16 13:17:26 -0800 |
commit | 8604fcb3686a74d8f2a0632027525486febd45a4 (patch) | |
tree | 6ab0d64d9442011951ed2d547c1f328d1768a307 | |
parent | df535c2a2fad17aa3484edd1d206ffc2cfe7ed3b (diff) | |
download | android_bionic-lineage-16.0.tar.gz android_bionic-lineage-16.0.tar.bz2 android_bionic-lineage-16.0.zip |
bionic: Support wildcards in cached hosts filelineage-16.0
If an exact name is not found in the hosts file and the host name
contains at least one dot, search for entries of the form "*.domain",
where domain is the portion of the host name after the first dot. If
that is not found, repeat using the domain.
Example: a.b.c.example.com would search for the following in turn:
a.b.c.example.com
*.b.c.example.com
*.c.example.com
*.example.com
*.com
Change-Id: I4b0bb81699151d5b371850daebf785e35ec9b180
-rw-r--r-- | libc/dns/net/hosts_cache.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/libc/dns/net/hosts_cache.c b/libc/dns/net/hosts_cache.c index deafb78b7..5038986be 100644 --- a/libc/dns/net/hosts_cache.c +++ b/libc/dns/net/hosts_cache.c @@ -121,7 +121,7 @@ static int cmp_hcent_name(const void *a, const void *b) return hstrcmp(na, nb); } -static struct hcent *_hcfindname(const char *name) +static struct hcent *_hcfindname_exact(const char *name) { size_t first, last, mid; struct hcent *cur = NULL; @@ -162,6 +162,33 @@ found: return cur; } +static struct hcent *_hcfindname(const char *name) +{ + struct hcent *ent; + char namebuf[MAX_HOSTLEN]; + char *p; + char *dot; + + ent = _hcfindname_exact(name); + if (!ent && strlen(name) < sizeof(namebuf)) { + strcpy(namebuf, name); + p = namebuf; + do { + dot = strchr(p, '.'); + if (!dot) + break; + if (dot > p) { + *(dot - 1) = '*'; + ent = _hcfindname_exact(dot - 1); + } + p = dot + 1; + } + while (!ent); + } + + return ent; +} + /* * Find next name on line, if any. * |