diff options
author | 2013-06-01 14:34:34 +0000 | |
---|---|---|
committer | 2013-06-01 14:34:34 +0000 | |
commit | 6a7a3d640d39dae50928bded135d5992d31570e3 (patch) | |
tree | 41c24fdd34b567f9bcc10dcfb95016c9625e943f /lib/libc | |
parent | Make 'kill-paragraph' behave like emacs. ok florian@ (diff) | |
download | wireguard-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.c | 21 | ||||
-rw-r--r-- | lib/libc/asr/asr_private.h | 7 | ||||
-rw-r--r-- | lib/libc/asr/getaddrinfo_async.c | 20 | ||||
-rw-r--r-- | lib/libc/asr/gethostnamadr_async.c | 24 | ||||
-rw-r--r-- | lib/libc/asr/res_search_async.c | 6 |
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; |