summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
authoreric <eric@openbsd.org>2013-06-01 14:34:34 +0000
committereric <eric@openbsd.org>2013-06-01 14:34:34 +0000
commit6a7a3d640d39dae50928bded135d5992d31570e3 (patch)
tree41c24fdd34b567f9bcc10dcfb95016c9625e943f /lib/libc
parentMake 'kill-paragraph' behave like emacs. ok florian@ (diff)
downloadwireguard-openbsd-6a7a3d640d39dae50928bded135d5992d31570e3.tar.xz
wireguard-openbsd-6a7a3d640d39dae50928bded135d5992d31570e3.zip
Make hostaliases work for gethostbyname() and getaddrinfo() when
looking into /etc/hosts. Remove the alias check from the search domain iteration. Instead, take a shortcut to res_query_async_ctx() in res_search_async_ctx().
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/asr/asr.c21
-rw-r--r--lib/libc/asr/asr_private.h7
-rw-r--r--lib/libc/asr/getaddrinfo_async.c20
-rw-r--r--lib/libc/asr/gethostnamadr_async.c24
-rw-r--r--lib/libc/asr/res_search_async.c6
5 files changed, 40 insertions, 38 deletions
diff --git a/lib/libc/asr/asr.c b/lib/libc/asr/asr.c
index 3260f6a9f58..3ae36fb9895 100644
--- a/lib/libc/asr/asr.c
+++ b/lib/libc/asr/asr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: asr.c,v 1.28 2013/06/01 12:38:29 eric Exp $ */
+/* $OpenBSD: asr.c,v 1.29 2013/06/01 14:34:34 eric Exp $ */
/*
* Copyright (c) 2010-2012 Eric Faurot <eric@openbsd.org>
*
@@ -937,10 +937,6 @@ enum {
int
asr_iter_domain(struct async *as, const char *name, char * buf, size_t len)
{
-#if ASR_OPT_HOSTALIASES
- char *alias;
-#endif
-
switch (as->as_dom_step) {
case DOM_INIT:
@@ -957,21 +953,6 @@ asr_iter_domain(struct async *as, const char *name, char * buf, size_t len)
return (asr_domcat(name, NULL, buf, len));
}
-#if ASR_OPT_HOSTALIASES
- /*
- * If "name" has no dots, it might be an alias. If so,
- * That's also the only result.
- */
- alias = asr_hostalias(as->as_ctx, name, buf, len);
- if (alias) {
- DPRINT("asr: asr_iter_domain(\"%s\") is alias \"%s\"\n",
- name, alias);
- as->as_dom_flags |= ASYNC_DOM_HOSTALIAS;
- as->as_dom_step = DOM_DONE;
- return (asr_domcat(alias, NULL, buf, len));
- }
-#endif
-
/*
* Otherwise, we iterate through the specified search domains.
*/
diff --git a/lib/libc/asr/asr_private.h b/lib/libc/asr/asr_private.h
index 9bbcc70c773..36dc736f5e3 100644
--- a/lib/libc/asr/asr_private.h
+++ b/lib/libc/asr/asr_private.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: asr_private.h,v 1.20 2013/06/01 12:38:29 eric Exp $ */
+/* $OpenBSD: asr_private.h,v 1.21 2013/06/01 14:34:34 eric Exp $ */
/*
* Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
*
@@ -155,9 +155,8 @@ struct asr {
#define ASYNC_DOM_FQDN 0x00000001
#define ASYNC_DOM_NDOTS 0x00000002
-#define ASYNC_DOM_HOSTALIAS 0x00000004
-#define ASYNC_DOM_DOMAIN 0x00000008
-#define ASYNC_DOM_ASIS 0x00000010
+#define ASYNC_DOM_DOMAIN 0x00000004
+#define ASYNC_DOM_ASIS 0x00000008
#define ASYNC_NODATA 0x00000100
#define ASYNC_AGAIN 0x00000200
diff --git a/lib/libc/asr/getaddrinfo_async.c b/lib/libc/asr/getaddrinfo_async.c
index 30b2a6b1e41..659fb6a52b1 100644
--- a/lib/libc/asr/getaddrinfo_async.c
+++ b/lib/libc/asr/getaddrinfo_async.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: getaddrinfo_async.c,v 1.17 2013/04/30 12:02:39 eric Exp $ */
+/* $OpenBSD: getaddrinfo_async.c,v 1.18 2013/06/01 14:34:34 eric Exp $ */
/*
* Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
*
@@ -105,6 +105,7 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
static char *domain = NULL;
char *res;
int len;
+ char alias[MAXDNAME], *name;
#endif
const char *str;
struct addrinfo *ai;
@@ -345,13 +346,18 @@ getaddrinfo_async_run(struct async *as, struct async_res *ar)
}
family = (as->as.ai.hints.ai_family == AF_UNSPEC) ?
AS_FAMILY(as) : as->as.ai.hints.ai_family;
+
+ name = asr_hostalias(as->as_ctx, as->as.ai.hostname,
+ alias, sizeof(alias));
+ if (name == NULL)
+ name = as->as.ai.hostname;
+
/* XXX
* ipnodes.byname could also contain IPv4 address
*/
r = yp_match(domain, (family == AF_INET6) ?
"ipnodes.byname" : "hosts.byname",
- as->as.ai.hostname, strlen(as->as.ai.hostname),
- &res, &len);
+ name, strlen(name), &res, &len);
if (r == 0) {
r = addrinfo_from_yp(as, family, res);
free(res);
@@ -550,7 +556,7 @@ addrinfo_add(struct async *as, const struct sockaddr *sa, const char *cname)
static int
addrinfo_from_file(struct async *as, int family, FILE *f)
{
- char *tokens[MAXTOKEN], *c;
+ char *tokens[MAXTOKEN], buf[MAXDNAME], *name, *c;
int n, i;
union {
struct sockaddr sa;
@@ -558,13 +564,17 @@ addrinfo_from_file(struct async *as, int family, FILE *f)
struct sockaddr_in6 sain6;
} u;
+ name = asr_hostalias(as->as_ctx, as->as.ai.hostname, buf, sizeof(buf));
+ if (name == NULL)
+ name = as->as.ai.hostname;
+
for (;;) {
n = asr_parse_namedb_line(f, tokens, MAXTOKEN);
if (n == -1)
break; /* ignore errors reading the file */
for (i = 1; i < n; i++) {
- if (strcasecmp(as->as.ai.hostname, tokens[i]))
+ if (strcasecmp(name, tokens[i]))
continue;
if (sockaddr_from_str(&u.sa, family, tokens[0]) == -1)
continue;
diff --git a/lib/libc/asr/gethostnamadr_async.c b/lib/libc/asr/gethostnamadr_async.c
index 2dd251382bf..9dcbbe55b3e 100644
--- a/lib/libc/asr/gethostnamadr_async.c
+++ b/lib/libc/asr/gethostnamadr_async.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gethostnamadr_async.c,v 1.19 2013/04/30 12:02:39 eric Exp $ */
+/* $OpenBSD: gethostnamadr_async.c,v 1.20 2013/06/01 14:34:34 eric Exp $ */
/*
* Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
*
@@ -148,7 +148,7 @@ gethostnamadr_async_run(struct async *as, struct async_res *ar)
struct hostent_ext *h;
int r, type, saved_errno;
FILE *f;
- char dname[MAXDNAME], *data, addr[16], *c;
+ char name[MAXDNAME], *data, addr[16], *c;
next:
switch (as->as_state) {
@@ -220,9 +220,9 @@ gethostnamadr_async_run(struct async *as, struct async_res *ar)
} else {
addr_as_fqdn(as->as.hostnamadr.addr,
as->as.hostnamadr.family,
- dname, sizeof(dname));
+ name, sizeof(name));
as->as.hostnamadr.subq = res_query_async_ctx(
- dname, C_IN, T_PTR, as->as_ctx);
+ name, C_IN, T_PTR, as->as_ctx);
}
if (as->as.hostnamadr.subq == NULL) {
@@ -242,8 +242,12 @@ gethostnamadr_async_run(struct async *as, struct async_res *ar)
if ((f = fopen(as->as_ctx->ac_hostfile, "r")) == NULL)
break;
- if (as->as_type == ASR_GETHOSTBYNAME)
- data = as->as.hostnamadr.name;
+ if (as->as_type == ASR_GETHOSTBYNAME) {
+ data = asr_hostalias(as->as_ctx,
+ as->as.hostnamadr.name, name, sizeof(name));
+ if (data == NULL)
+ data = as->as.hostnamadr.name;
+ }
else
data = as->as.hostnamadr.addr;
@@ -272,8 +276,12 @@ gethostnamadr_async_run(struct async *as, struct async_res *ar)
/* IPv4 only */
if (as->as.hostnamadr.family != AF_INET)
break;
- if (as->as_type == ASR_GETHOSTBYNAME)
- data = as->as.hostnamadr.name;
+ if (as->as_type == ASR_GETHOSTBYNAME) {
+ data = asr_hostalias(as->as_ctx,
+ as->as.hostnamadr.name, name, sizeof(name));
+ if (data == NULL)
+ data = as->as.hostnamadr.name;
+ }
else
data = as->as.hostnamadr.addr;
h = _yp_gethostnamadr(as->as_type, data);
diff --git a/lib/libc/asr/res_search_async.c b/lib/libc/asr/res_search_async.c
index 060a545eafa..c3cae7683dd 100644
--- a/lib/libc/asr/res_search_async.c
+++ b/lib/libc/asr/res_search_async.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: res_search_async.c,v 1.7 2013/04/30 12:02:39 eric Exp $ */
+/* $OpenBSD: res_search_async.c,v 1.8 2013/06/01 14:34:34 eric Exp $ */
/*
* Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
*
@@ -53,10 +53,14 @@ struct async *
res_search_async_ctx(const char *name, int class, int type, struct asr_ctx *ac)
{
struct async *as;
+ char alias[MAXDNAME];
DPRINT("asr: res_search_async_ctx(\"%s\", %i, %i)\n", name, class,
type);
+ if (asr_hostalias(ac, name, alias, sizeof(alias)))
+ return res_query_async_ctx(alias, class, type, ac);
+
if ((as = async_new(ac, ASR_SEARCH)) == NULL)
goto err; /* errno set */
as->as_run = res_search_async_run;