aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Marshall <tdm.code@gmail.com>2020-01-16 13:07:04 -0800
committerTom Marshall <tdm.code@gmail.com>2020-01-16 13:17:26 -0800
commit8604fcb3686a74d8f2a0632027525486febd45a4 (patch)
tree6ab0d64d9442011951ed2d547c1f328d1768a307
parentdf535c2a2fad17aa3484edd1d206ffc2cfe7ed3b (diff)
downloadandroid_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.c29
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.
*