aboutsummaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorCharles Longeau <github@chl.be>2012-09-11 22:19:08 +0200
committerCharles Longeau <github@chl.be>2012-09-11 22:19:08 +0200
commitf1bd18539fe7d987c198c47ac7dea2c14625f93c (patch)
treeb2eb6df10a27cfe0496335854259d33c7c41dc6c /contrib
parentsync with -current (mostly asr) (diff)
downloadOpenSMTPD-f1bd18539fe7d987c198c47ac7dea2c14625f93c.tar.xz
OpenSMTPD-f1bd18539fe7d987c198c47ac7dea2c14625f93c.zip
sync with -current
Diffstat (limited to 'contrib')
-rw-r--r--contrib/lib/libc/asr/CVS/Entries23
-rw-r--r--contrib/lib/libc/asr/asr.c182
-rw-r--r--contrib/lib/libc/asr/asr_debug.c587
-rw-r--r--contrib/lib/libc/asr/asr_private.h35
-rw-r--r--contrib/lib/libc/asr/res_search_async.c13
-rw-r--r--contrib/lib/libc/asr/res_send_async.c90
6 files changed, 357 insertions, 573 deletions
diff --git a/contrib/lib/libc/asr/CVS/Entries b/contrib/lib/libc/asr/CVS/Entries
index 4e946087..81e461fa 100644
--- a/contrib/lib/libc/asr/CVS/Entries
+++ b/contrib/lib/libc/asr/CVS/Entries
@@ -1,17 +1,28 @@
/asr_utils.c/1.1/Sat Apr 14 09:24:18 2012//
-/res_search_async.c/1.1/Sat Apr 14 09:24:18 2012//
-/res_send_async.c/1.2/Sat Jul 7 20:41:52 2012//
/getrrsetbyname_async.c/1.2/Result of merge//
/hostaddr_async.c/1.2/Result of merge//
/getnameinfo_async.c/1.4/Result of merge//
/asr_resolver.c/1.10/Result of merge//
-/Makefile.inc/1.4/Sat Sep 8 09:11:38 2012//
-/asr.c/1.9/Result of merge+Sat Sep 8 09:11:38 2012//
/asr.h/1.3/Result of merge//
-/asr_debug.c/1.6/Result of merge//
-/asr_private.h/1.6/Sat Sep 8 09:11:38 2012//
/async_resolver.3/1.6/Sat Sep 8 09:11:38 2012//
/getaddrinfo_async.c/1.8/Result of merge+Sat Sep 8 09:11:38 2012//
/gethostnamadr_async.c/1.8/Result of merge//
/getnetnamadr_async.c/1.4/Result of merge//
+/Makefile.inc/1.5/Tue Sep 11 20:09:17 2012//
+/asr.c/1.13/Result of merge+Tue Sep 11 20:09:18 2012//
+/asr_debug.c/1.8/Result of merge+Tue Sep 11 20:09:18 2012//
+/asr_private.h/1.8/Tue Sep 11 20:09:18 2012//
+/getaddrinfo.c/1.1/Sat Sep 8 11:08:21 2012//
+/gethostnamadr.c/1.1/Sat Sep 8 11:08:21 2012//
+/getnameinfo.c/1.1/Sat Sep 8 11:08:21 2012//
+/getnetnamadr.c/1.1/Sat Sep 8 11:08:21 2012//
+/getrrsetbyname.c/1.1/Sat Sep 8 11:08:21 2012//
+/res_debug.c/1.1/Sat Sep 8 11:08:21 2012//
+/res_init.c/1.1/Sat Sep 8 11:08:21 2012//
+/res_mkquery.c/1.1/Sat Sep 8 11:08:21 2012//
+/res_query.c/1.1/Sat Sep 8 11:08:21 2012//
+/res_search_async.c/1.2/Result of merge//
+/res_send.c/1.1/Sat Sep 8 11:08:21 2012//
+/res_send_async.c/1.4/Result of merge//
+/sethostent.c/1.1/Sat Sep 8 11:08:21 2012//
D
diff --git a/contrib/lib/libc/asr/asr.c b/contrib/lib/libc/asr/asr.c
index 3d8acea1..72b531ca 100644
--- a/contrib/lib/libc/asr/asr.c
+++ b/contrib/lib/libc/asr/asr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: asr.c,v 1.9 2012/09/07 13:49:43 eric Exp $ */
+/* $OpenBSD: asr.c,v 1.13 2012/09/09 16:45:14 eric Exp $ */
/*
* Copyright (c) 2010-2012 Eric Faurot <eric@openbsd.org>
*
@@ -42,6 +42,26 @@
#define __THREAD_NAME(x) __ ## x
#define _THREAD_PRIVATE(a, b, c) (c)
+#ifndef ASR_OPT_THREADSAFE
+#define ASR_OPT_THREADSAFE 1
+#endif
+#ifndef ASR_OPT_HOSTALIASES
+#define ASR_OPT_HOSTALIASES 1
+#endif
+#ifndef ASR_OPT_ENVOPTS
+#define ASR_OPT_ENVOPTS 1
+#endif
+#ifndef ASR_OPT_RELOADCONF
+#define ASR_OPT_RELOADCONF 1
+#endif
+#ifndef ASR_OPT_ALTCONF
+#define ASR_OPT_ALTCONF 1
+#endif
+
+#if ASR_OPT_THREADSAFE
+#include "thread_private.h"
+#endif
+
#define DEFAULT_CONFFILE "/etc/resolv.conf"
#define DEFAULT_HOSTFILE "/etc/hosts"
#define DEFAULT_CONF "lookup bind file\nnameserver 127.0.0.1\n"
@@ -58,13 +78,21 @@ static int asr_ctx_from_file(struct asr_ctx *, const char *);
static int asr_ctx_from_string(struct asr_ctx *, const char *);
static int asr_ctx_parse(struct asr_ctx *, const char *);
static int asr_parse_nameserver(struct sockaddr *, const char *);
-static char *asr_hostalias(const char *, char *, size_t);
static int asr_ndots(const char *);
-static void asr_ctx_envopts(struct asr_ctx *);
static void pass0(char **, int, struct asr_ctx *);
static int strsplit(char *, char **, int);
-
+#if ASR_OPT_HOSTALIASES
+static char *asr_hostalias(const char *, char *, size_t);
+#endif
+#if ASR_OPT_ENVOPTS
+static void asr_ctx_envopts(struct asr_ctx *);
+#endif
+#if ASR_OPT_THREADSAFE
static void *__THREAD_NAME(_asr);
+#else
+# define _THREAD_PRIVATE(a, b, c) (c)
+#endif
+
static struct asr *_asr = NULL;
#define issetugid() ((getuid() != geteuid()))
@@ -76,19 +104,22 @@ async_resolver(const char *conf)
static int init = 0;
struct asr *asr;
-#ifdef DEBUG
if (init == 0) {
+#ifdef DEBUG
if (getenv("ASR_DEBUG"))
- asr_debug = 1;
+ asr_debug = stderr;
+#endif
init = 1;
}
-#endif
+
if ((asr = calloc(1, sizeof(*asr))) == NULL)
goto fail;
+#if ASR_OPT_ALTCONF
/* If not setuid/setgid, allow to use an alternate config. */
if (conf == NULL && !issetugid())
conf = getenv("ASR_CONFIG");
+#endif
if (conf == NULL)
conf = DEFAULT_CONFFILE;
@@ -108,12 +139,14 @@ async_resolver(const char *conf)
goto fail;
if (asr_ctx_from_string(asr->a_ctx, DEFAULT_CONF) == -1)
goto fail;
+#if ASR_OPT_ENVOPTS
asr_ctx_envopts(asr->a_ctx);
+#endif
}
}
#ifdef DEBUG
- asr_dump(asr);
+ asr_dump_config(asr_debug, asr);
#endif
return (asr);
@@ -169,24 +202,16 @@ async_run(struct async *as, struct async_res *ar)
{
int r, saved_errno = errno;
-#ifdef DEBUG
- asr_printf("asr: async_run(%p, %p) %s ctx=[%p]\n",
- as, ar, asr_querystr(as->as_type), as->as_ctx);
-#endif
+ DPRINT("asr: async_run(%p, %p) %s ctx=[%p]\n", as, ar,
+ asr_querystr(as->as_type), as->as_ctx);
r = as->as_run(as, ar);
+ DPRINT("asr: async_run(%p, %p) -> %s", as, ar, asr_transitionstr(r));
#ifdef DEBUG
- if (asr_debug) {
- asr_printf("asr: async_run(%p, %p) -> %s", as, ar,
- asr_transitionstr(r));
- if (r == ASYNC_COND)
- asr_printf(" fd=%i timeout=%i\n",
- ar->ar_fd, ar->ar_timeout);
- else
- asr_printf("\n");
- fflush(stderr);
- }
+ if (r == ASYNC_COND)
#endif
+ DPRINT(" fd=%i timeout=%i", ar->ar_fd, ar->ar_timeout);
+ DPRINT("\n");
if (r == ASYNC_DONE)
async_free(as);
@@ -231,10 +256,9 @@ struct async *
async_new(struct asr_ctx *ac, int type)
{
struct async *as;
-#ifdef DEBUG
- asr_printf("asr: async_new(ctx=%p) type=%i refcount=%i\n",
- ac, type, ac->ac_refcount);
-#endif
+
+ DPRINT("asr: async_new(ctx=%p) type=%i refcount=%i\n", ac, type,
+ ac->ac_refcount);
if ((as = calloc(1, sizeof(*as))) == NULL)
return (NULL);
@@ -253,9 +277,7 @@ async_new(struct asr_ctx *ac, int type)
void
async_free(struct async *as)
{
-#ifdef DEBUG
- asr_printf("asr: async_free(%p)\n", as);
-#endif
+ DPRINT("asr: async_free(%p)\n", as);
switch(as->as_type) {
case ASR_SEND:
if (as->as_fd != -1)
@@ -334,15 +356,10 @@ asr_use_resolver(struct asr *asr)
struct asr **priv;
if (asr == NULL) {
- /* Use the thread-local resolver. */
-#ifdef DEBUG
- asr_printf("using thread-local resolver\n");
-#endif
+ DPRINT("using thread-local resolver\n");
priv = _THREAD_PRIVATE(_asr, asr, &_asr);
if (*priv == NULL) {
-#ifdef DEBUG
- asr_printf("setting up thread-local resolver\n");
-#endif
+ DPRINT("setting up thread-local resolver\n");
*priv = async_resolver(NULL);
}
asr = *priv;
@@ -356,10 +373,7 @@ asr_use_resolver(struct asr *asr)
static void
asr_ctx_ref(struct asr_ctx *ac)
{
-#ifdef DEBUG
- asr_printf("asr: asr_ctx_ref(ctx=%p) refcount=%i\n",
- ac, ac->ac_refcount);
-#endif
+ DPRINT("asr: asr_ctx_ref(ctx=%p) refcount=%i\n", ac, ac->ac_refcount);
ac->ac_refcount += 1;
}
@@ -370,10 +384,7 @@ asr_ctx_ref(struct asr_ctx *ac)
void
asr_ctx_unref(struct asr_ctx *ac)
{
-#ifdef DEBUG
- asr_printf("asr: asr_ctx_unref(ctx=%p) refcount=%i\n",
- ac, ac->ac_refcount);
-#endif
+ DPRINT("asr: asr_ctx_unref(ctx=%p) refcount=%i\n", ac, ac->ac_refcount);
if (--ac->ac_refcount)
return;
@@ -401,13 +412,16 @@ asr_ctx_free(struct asr_ctx *ac)
static void
asr_check_reload(struct asr *asr)
{
- struct stat st;
struct asr_ctx *ac;
+#if ASR_OPT_RELOADCONF
+ struct stat st;
struct timespec tp;
+#endif
if (asr->a_path == NULL)
return;
+#if ASR_OPT_RELOADCONF
#ifdef HAVE_CLOCK_GETTIME
if (clock_gettime(CLOCK_MONOTONIC, &tp) == -1)
return;
@@ -423,26 +437,26 @@ asr_check_reload(struct asr *asr)
return;
asr->a_rtime = tp.tv_sec;
-#ifdef DEBUG
- asr_printf("asr: checking for update of \"%s\"\n", asr->a_path);
-#endif
-
+ DPRINT("asr: checking for update of \"%s\"\n", asr->a_path);
if (stat(asr->a_path, &st) == -1 ||
asr->a_mtime == st.st_mtime ||
(ac = asr_ctx_create()) == NULL)
return;
asr->a_mtime = st.st_mtime;
-
-#ifdef DEBUG
- asr_printf("asr: reloading config file\n");
+#else
+ if ((ac = asr_ctx_create()) == NULL)
+ return;
#endif
+ DPRINT("asr: reloading config file\n");
if (asr_ctx_from_file(ac, asr->a_path) == -1) {
asr_ctx_free(ac);
return;
}
+#if ASR_OPT_ENVOPTS
asr_ctx_envopts(ac);
+#endif
if (asr->a_ctx)
asr_ctx_unref(asr->a_ctx);
asr->a_ctx = ac;
@@ -721,9 +735,7 @@ asr_ctx_from_file(struct asr_ctx *ac, const char *path)
r = fread(buf, 1, sizeof buf - 1, cf);
if (feof(cf) == 0) {
-#ifdef DEBUG
- asr_printf("asr: config file too long: \"%s\"\n", path);
-#endif
+ DPRINT("asr: config file too long: \"%s\"\n", path);
r = -1;
}
fclose(cf);
@@ -768,6 +780,7 @@ asr_ctx_parse(struct asr_ctx *ac, const char *str)
return (0);
}
+#if ASR_OPT_ENVOPTS
/*
* Check for environment variables altering the configuration as described
* in resolv.conf(5). Altough not documented there, this feature is disabled
@@ -801,6 +814,7 @@ asr_ctx_envopts(struct asr_ctx *ac)
asr_ctx_parse(ac, buf);
}
}
+#endif
/*
* Parse a resolv.conf(5) nameserver string into a sockaddr.
@@ -912,17 +926,14 @@ int
asr_iter_db(struct async *as)
{
if (as->as_db_idx >= as->as_ctx->ac_dbcount) {
-#ifdef DEBUG
- asr_printf("asr_iter_db: done\n");
-#endif
+ DPRINT("asr_iter_db: done\n");
return (-1);
}
as->as_db_idx += 1;
as->as_ns_idx = 0;
-#ifdef DEBUG
- asr_printf("asr_iter_db: %i\n", as->as_db_idx);
-#endif
+ DPRINT("asr_iter_db: %i\n", as->as_db_idx);
+
return (0);
}
@@ -944,9 +955,7 @@ asr_iter_ns(struct async *as)
break;
as->as_ns_idx = 0;
as->as_ns_cycles++;
-#ifdef DEBUG
- asr_printf("asr: asr_iter_ns(): cycle %i\n", as->as_ns_cycles);
-#endif
+ DPRINT("asr: asr_iter_ns(): cycle %i\n", as->as_ns_cycles);
}
return (0);
@@ -973,7 +982,9 @@ 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) {
@@ -985,14 +996,13 @@ asr_iter_domain(struct async *as, const char *name, char * buf, size_t len)
* don't try anything else.
*/
if (strlen(name) && name[strlen(name) - 1] == '.') {
-#ifdef DEBUG
- asr_printf("asr: asr_iter_domain(\"%s\") fqdn\n", name);
-#endif
+ DPRINT("asr: asr_iter_domain(\"%s\") fqdn\n", name);
as->as_dom_flags |= ASYNC_DOM_FQDN;
as->as_dom_step = DOM_DONE;
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.
@@ -1000,14 +1010,13 @@ asr_iter_domain(struct async *as, const char *name, char * buf, size_t len)
if ((as->as_ctx->ac_options & RES_NOALIASES) == 0 &&
asr_ndots(name) == 0 &&
(alias = asr_hostalias(name, buf, len)) != NULL) {
-#ifdef DEBUG
- asr_printf("asr: asr_iter_domain(\"%s\") is alias "
- "\"%s\"\n", name, alias);
-#endif
+ 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.
@@ -1020,10 +1029,7 @@ asr_iter_domain(struct async *as, const char *name, char * buf, size_t len)
* in resolv.conf(5).
*/
if ((asr_ndots(name)) >= as->as_ctx->ac_ndots) {
-#ifdef DEBUG
- asr_printf("asr: asr_iter_domain(\"%s\") ndots\n",
- name);
-#endif
+ DPRINT("asr: asr_iter_domain(\"%s\") ndots\n", name);
as->as_dom_flags |= ASYNC_DOM_NDOTS;
strlcpy(buf, name, len);
return (0);
@@ -1033,11 +1039,8 @@ asr_iter_domain(struct async *as, const char *name, char * buf, size_t len)
case DOM_DOMAIN:
if (as->as_dom_idx < as->as_ctx->ac_domcount) {
-#ifdef DEBUG
- asr_printf("asr: asr_iter_domain(\"%s\") "
- "domain \"%s\"\n", name,
- as->as_ctx->ac_dom[as->as_dom_idx]);
-#endif
+ DPRINT("asr: asr_iter_domain(\"%s\") domain \"%s\"\n",
+ name, as->as_ctx->ac_dom[as->as_dom_idx]);
as->as_dom_flags |= ASYNC_DOM_DOMAIN;
return (asr_domcat(name,
as->as_ctx->ac_dom[as->as_dom_idx++], buf, len));
@@ -1052,10 +1055,7 @@ asr_iter_domain(struct async *as, const char *name, char * buf, size_t len)
* do it now.
*/
if (!(as->as_dom_flags & ASYNC_DOM_NDOTS)) {
-#ifdef DEBUG
- asr_printf("asr: asr_iter_domain(\"%s\") as is\n",
- name);
-#endif
+ DPRINT("asr: asr_iter_domain(\"%s\") as is\n", name);
as->as_dom_flags |= ASYNC_DOM_ASIS;
strlcpy(buf, name, len);
return (0);
@@ -1064,13 +1064,12 @@ asr_iter_domain(struct async *as, const char *name, char * buf, size_t len)
case DOM_DONE:
default:
-#ifdef DEBUG
- asr_printf("asr: asr_iter_domain(\"%s\") done\n", name);
-#endif
+ DPRINT("asr: asr_iter_domain(\"%s\") done\n", name);
return (-1);
}
}
+#if ASR_OPT_HOSTALIASES
/*
* Check if the hostname "name" is a user-defined alias as per hostname(7).
* If so, copies the result in the buffer "abuf" of size "abufsz" and
@@ -1088,9 +1087,7 @@ asr_hostalias(const char *name, char *abuf, size_t abufsz)
if (file == NULL || issetugid() != 0 || (fp = fopen(file, "r")) == NULL)
return (NULL);
-#ifdef DEBUG
- asr_printf("asr: looking up aliases in \"%s\"\n", file);
-#endif
+ DPRINT("asr: looking up aliases in \"%s\"\n", file);
while ((buf = fgetln(fp, &len)) != NULL) {
if (buf[len - 1] == '\n')
@@ -1101,9 +1098,7 @@ asr_hostalias(const char *name, char *abuf, size_t abufsz)
if (!strcasecmp(tokens[0], name)) {
if (strlcpy(abuf, tokens[1], abufsz) > abufsz)
continue;
-#ifdef DEBUG
- asr_printf("asr: found alias \"%s\"\n", abuf);
-#endif
+ DPRINT("asr: found alias \"%s\"\n", abuf);
fclose(fp);
return (abuf);
}
@@ -1112,3 +1107,4 @@ asr_hostalias(const char *name, char *abuf, size_t abufsz)
fclose(fp);
return (NULL);
}
+#endif
diff --git a/contrib/lib/libc/asr/asr_debug.c b/contrib/lib/libc/asr/asr_debug.c
index 979003fd..8d3d57c9 100644
--- a/contrib/lib/libc/asr/asr_debug.c
+++ b/contrib/lib/libc/asr/asr_debug.c
@@ -1,6 +1,6 @@
-/* $OpenBSD: asr_debug.c,v 1.6 2012/09/05 21:49:12 eric Exp $ */
+/* $OpenBSD: asr_debug.c,v 1.8 2012/09/09 12:15:32 eric Exp $ */
/*
- * Copyright (c) 2010-2012 Eric Faurot <eric@openbsd.org>
+ * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -21,144 +21,47 @@
#include <sys/socket.h>
#include <netinet/in.h>
-#include <arpa/inet.h>
#include <arpa/nameser.h>
+#include <arpa/inet.h>
-#include <inttypes.h>
#include <resolv.h>
-#include <string.h>
-#include <stdarg.h>
#include "asr.h"
#include "asr_private.h"
-static void asr_vdebug(const char *, va_list);
-
-static char *print_dname(const char *, char *, size_t);
-static char *print_host(const struct sockaddr *, char *, size_t);
-
-static const char *typetostr(uint16_t);
-static const char *classtostr(uint16_t);
-static const char *rcodetostr(uint16_t);
-
-static const char *inet6_ntoa(struct in6_addr);
+static const char* rcodetostr(uint16_t);
+static const char* print_dname(const char *, char *, size_t);
+static const char* print_header(const struct header *, char *, size_t);
+static const char* print_query(const struct query *, char *, size_t);
+static const char* print_rr(const struct rr*, char *, size_t);
+FILE *asr_debug = NULL;
#define OPCODE_SHIFT 11
#define Z_SHIFT 4
-struct keyval {
- const char *key;
- uint16_t value;
-};
-
-static struct keyval kv_class[] = {
- { "IN", C_IN },
- { "CHAOS", C_CHAOS },
- { "HS", C_HS },
- { "ANY", C_ANY },
- { NULL, 0 },
-};
-
-static struct keyval kv_type[] = {
- { "A", T_A },
- { "NS", T_NS },
- { "MD", T_MD },
- { "MF", T_MF },
- { "CNAME", T_CNAME },
- { "SOA", T_SOA },
- { "MB", T_MB },
- { "MG", T_MG },
- { "MR", T_MR },
- { "NULL", T_NULL },
- { "WKS", T_WKS },
- { "PTR", T_PTR },
- { "HINFO", T_HINFO },
- { "MINFO", T_MINFO },
- { "MX", T_MX },
- { "TXT", T_TXT },
-
- { "AAAA", T_AAAA },
-
- { "AXFR", T_AXFR },
- { "MAILB", T_MAILB },
- { "MAILA", T_MAILA },
- { "ANY", T_ANY },
- { NULL, 0 },
-};
-
-static struct keyval kv_rcode[] = {
- { "NOERROR", NOERROR },
- { "FORMERR", FORMERR },
- { "SERVFAIL", SERVFAIL },
- { "NXDOMAIN", NXDOMAIN },
- { "NOTIMP", NOTIMP },
- { "REFUSED", REFUSED },
- { NULL, 0 },
-};
-
-static const char *
-typetostr(uint16_t v)
-{
- static char buf[16];
- size_t i;
-
- for(i = 0; kv_type[i].key; i++)
- if (kv_type[i].value == v)
- return (kv_type[i].key);
-
- snprintf(buf, sizeof buf, "%"PRIu16"?", v);
-
- return (buf);
-}
-
-static const char *
-classtostr(uint16_t v)
-{
- static char buf[16];
- size_t i;
-
- for(i = 0; kv_class[i].key; i++)
- if (kv_class[i].value == v)
- return (kv_class[i].key);
-
- snprintf(buf, sizeof buf, "%"PRIu16"?", v);
-
- return (buf);
-}
-
static const char *
rcodetostr(uint16_t v)
{
- static char buf[16];
- size_t i;
-
- for(i = 0; kv_rcode[i].key; i++)
- if (kv_rcode[i].value == v)
- return (kv_rcode[i].key);
-
- snprintf(buf, sizeof buf, "%"PRIu16"?", v);
-
- return (buf);
+ switch(v) {
+ case NOERROR: return "NOERROR";
+ case FORMERR: return "FORMERR";
+ case SERVFAIL: return "SERVFAIL";
+ case NXDOMAIN: return "NXDOMAIN";
+ case NOTIMP: return "NOTIMP";
+ case REFUSED: return "REFUSED";
+ default: return "?";
+ }
}
-static const char *
-inet6_ntoa(struct in6_addr a)
+static const char*
+print_dname(const char *_dname, char *buf, size_t max)
{
- static char buf[256];
- struct sockaddr_in6 si;
-
-#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN
- si.sin6_len = sizeof(si);
-#endif
- si.sin6_family = PF_INET6;
- si.sin6_addr = a;
-
- return print_host((struct sockaddr*)&si, buf, sizeof buf);
+ return (asr_strdname(_dname, buf, max));
}
-static char*
-print_rr(struct rr *rr, char *buf, size_t max)
+static const char*
+print_rr(const struct rr *rr, char *buf, size_t max)
{
char *res;
char tmp[256];
@@ -170,15 +73,15 @@ print_rr(struct rr *rr, char *buf, size_t max)
r = snprintf(buf, max, "%s %u %s %s ",
print_dname(rr->rr_dname, tmp, sizeof tmp),
rr->rr_ttl,
- classtostr(rr->rr_class),
- typetostr(rr->rr_type));
+ __p_class(rr->rr_class),
+ __p_type(rr->rr_type));
if (r == -1) {
buf[0] = '\0';
- return buf;
+ return (buf);
}
if ((size_t)r >= max)
- return buf;
+ return (buf);
max -= r;
buf += r;
@@ -188,8 +91,8 @@ print_rr(struct rr *rr, char *buf, size_t max)
print_dname(rr->rr.cname.cname, buf, max);
break;
case T_MX:
- snprintf(buf, max, "%"PRIu32" %s",
- rr->rr.mx.preference,
+ snprintf(buf, max, "%lu %s",
+ (unsigned long)rr->rr.mx.preference,
print_dname(rr->rr.mx.exchange, tmp, sizeof tmp));
break;
case T_NS:
@@ -199,59 +102,54 @@ print_rr(struct rr *rr, char *buf, size_t max)
print_dname(rr->rr.ptr.ptrname, buf, max);
break;
case T_SOA:
- snprintf(buf, max, "%s %s %" PRIu32 " %" PRIu32 " %" PRIu32
- " %" PRIu32 " %" PRIu32,
+ snprintf(buf, max, "%s %s %lu %lu %lu %lu %lu",
print_dname(rr->rr.soa.rname, tmp, sizeof tmp),
print_dname(rr->rr.soa.mname, tmp2, sizeof tmp2),
- rr->rr.soa.serial,
- rr->rr.soa.refresh,
- rr->rr.soa.retry,
- rr->rr.soa.expire,
- rr->rr.soa.minimum);
+ (unsigned long)rr->rr.soa.serial,
+ (unsigned long)rr->rr.soa.refresh,
+ (unsigned long)rr->rr.soa.retry,
+ (unsigned long)rr->rr.soa.expire,
+ (unsigned long)rr->rr.soa.minimum);
break;
case T_A:
if (rr->rr_class != C_IN)
goto other;
- snprintf(buf, max, "%s", inet_ntoa(rr->rr.in_a.addr));
+ snprintf(buf, max, "%s", inet_ntop(AF_INET,
+ &rr->rr.in_a.addr, tmp, sizeof tmp));
break;
case T_AAAA:
if (rr->rr_class != C_IN)
goto other;
- snprintf(buf, max, "%s", inet6_ntoa(rr->rr.in_aaaa.addr6));
+ snprintf(buf, max, "%s", inet_ntop(AF_INET6,
+ &rr->rr.in_aaaa.addr6, tmp, sizeof tmp));
break;
default:
other:
- snprintf(buf, max, "(rdlen=%"PRIu16 ")", rr->rr.other.rdlen);
+ snprintf(buf, max, "(rdlen=%i)", (int)rr->rr.other.rdlen);
break;
}
return (res);
}
-static char*
-print_query(struct query *q, char *buf, size_t max)
+static const char*
+print_query(const struct query *q, char *buf, size_t max)
{
char b[256];
snprintf(buf, max, "%s %s %s",
print_dname(q->q_dname, b, sizeof b),
- classtostr(q->q_class), typetostr(q->q_type));
+ __p_class(q->q_class), __p_type(q->q_type));
return (buf);
}
-static char*
-print_dname(const char *_dname, char *buf, size_t max)
-{
- return asr_strdname(_dname, buf, max);
-}
-
-static char*
-print_header(struct header *h, char *buf, size_t max, int noid)
+static const char*
+print_header(const struct header *h, char *buf, size_t max)
{
snprintf(buf, max,
"id:0x%04x %s op:%i %s %s %s %s z:%i r:%s qd:%i an:%i ns:%i ar:%i",
- noid ? 0 : ((int)h->id),
+ ((int)h->id),
(h->flags & QR_MASK) ? "QR":" ",
(int)(OPCODE(h->flags) >> OPCODE_SHIFT),
(h->flags & AA_MASK) ? "AA":" ",
@@ -262,233 +160,11 @@ print_header(struct header *h, char *buf, size_t max, int noid)
rcodetostr(RCODE(h->flags)),
h->qdcount, h->ancount, h->nscount, h->arcount);
- return buf;
-}
-
-static char *
-print_host(const struct sockaddr *sa, char *buf, size_t len)
-{
- switch (sa->sa_family) {
- case AF_INET:
- inet_ntop(AF_INET, &((const struct sockaddr_in*)sa)->sin_addr,
- buf, len);
- break;
- case AF_INET6:
- inet_ntop(AF_INET6,
- &((const struct sockaddr_in6*)sa)->sin6_addr, buf, len);
- break;
- default:
- buf[0] = '\0';
- }
return (buf);
}
-char *
-asr_print_addr(const struct sockaddr *sa, char *buf, size_t len)
-{
- char h[256];
-
- print_host(sa, h, sizeof h);
-
- switch (sa->sa_family) {
- case AF_INET:
- snprintf(buf, len, "%s:%i", h,
- ntohs(((const struct sockaddr_in*)(sa))->sin_port));
- break;
- case AF_INET6:
- snprintf(buf, len, "[%s]:%i", h,
- ntohs(((const struct sockaddr_in6*)(sa))->sin6_port));
- break;
- default:
- snprintf(buf, len, "?");
- break;
- }
-
- return (buf);
-}
-
-struct kv { int code; const char *name; };
-
-static const char* kvlookup(struct kv *, int);
-
-int asr_debug = 0;
-
-void
-asr_dump(struct asr *a)
-{
- char buf[256];
- int i;
- struct asr_ctx *ac;
- unsigned int options;
-
- ac = a->a_ctx;
-
- asr_printf("--------- ASR CONFIG ---------------\n");
- if (a->a_path)
- asr_printf("CONF FILE \"%s\"\n", a->a_path);
- else
- asr_printf("STATIC CONF\n");
- asr_printf("DOMAIN \"%s\"\n", ac->ac_domain);
- asr_printf("SEARCH\n");
- for(i = 0; i < ac->ac_domcount; i++)
- asr_printf(" \"%s\"\n", ac->ac_dom[i]);
- asr_printf("OPTIONS\n");
- asr_printf(" options:");
- options = ac->ac_options;
- if (options & RES_INIT) {
- asr_printf(" INIT"); options &= ~RES_INIT;
- }
- if (options & RES_DEBUG) {
- asr_printf(" DEBUG"); options &= ~RES_DEBUG;
- }
- if (options & RES_USEVC) {
- asr_printf(" USEVC"); options &= ~RES_USEVC;
- }
- if (options & RES_IGNTC) {
- asr_printf(" IGNTC"); options &= ~RES_IGNTC;
- }
- if (options & RES_RECURSE) {
- asr_printf(" RECURSE"); options &= ~RES_RECURSE;
- }
- if (options & RES_DEFNAMES) {
- asr_printf(" DEFNAMES"); options &= ~RES_DEFNAMES;
- }
- if (options & RES_STAYOPEN) {
- asr_printf(" STAYOPEN"); options &= ~RES_STAYOPEN;
- }
- if (options & RES_DNSRCH) {
- asr_printf(" DNSRCH"); options &= ~RES_DNSRCH;
- }
- if (options & RES_NOALIASES) {
- asr_printf(" NOALIASES"); options &= ~RES_NOALIASES;
- }
- if (options & RES_USE_EDNS0) {
- asr_printf(" USE_EDNS0"); options &= ~RES_USE_EDNS0;
- }
- if (options & RES_USE_DNSSEC) {
- asr_printf(" USE_DNSSEC"); options &= ~RES_USE_DNSSEC;
- }
- if (options)
- asr_printf("0x%08x\n", options);
- asr_printf("\n", ac->ac_options);
-
- asr_printf(" ndots: %i\n", ac->ac_ndots);
- asr_printf(" family:");
- for(i = 0; ac->ac_family[i] != -1; i++)
- asr_printf(" %s", (ac->ac_family[i] == AF_INET) ?
- "inet" : "inet6");
- asr_printf("\n");
- asr_printf("NAMESERVERS timeout=%i retry=%i\n",
- ac->ac_nstimeout,
- ac->ac_nsretries);
- for(i = 0; i < ac->ac_nscount; i++)
- asr_printf(" %s\n", asr_print_addr(ac->ac_ns[i], buf,
- sizeof buf));
- asr_printf("HOSTFILE %s\n", ac->ac_hostfile);
- asr_printf("LOOKUP");
- for(i = 0; i < ac->ac_dbcount; i++) {
- switch (ac->ac_db[i]) {
- case ASR_DB_FILE:
- asr_printf(" file");
- break;
- case ASR_DB_DNS:
- asr_printf(" dns");
- break;
- case ASR_DB_YP:
- asr_printf(" yp");
- break;
- default:
- asr_printf(" ?%i", ac->ac_db[i]);
- }
- }
- asr_printf("\n------------------------------------\n");
-}
-
-static const char *
-kvlookup(struct kv *kv, int code)
-{
- while (kv->name) {
- if (kv->code == code)
- return (kv->name);
- kv++;
- }
- return "???";
-}
-
-struct kv kv_query_type[] = {
- { ASR_SEND, "ASR_SEND" },
- { ASR_SEARCH, "ASR_SEARCH" },
- { ASR_GETRRSETBYNAME, "ASR_GETRRSETBYNAME" },
- { ASR_GETHOSTBYNAME, "ASR_GETHOSTBYNAME" },
- { ASR_GETHOSTBYADDR, "ASR_GETHOSTBYADDR" },
- { ASR_GETNETBYNAME, "ASR_GETNETBYNAME" },
- { ASR_GETNETBYADDR, "ASR_GETNETBYADDR" },
- { ASR_GETADDRINFO, "ASR_GETADDRINFO" },
- { ASR_GETNAMEINFO, "ASR_GETNAMEINFO" },
- { 0, NULL }
-};
-
-struct kv kv_db_type[] = {
- { ASR_DB_FILE, "ASR_DB_FILE" },
- { ASR_DB_DNS, "ASR_DB_DNS" },
- { ASR_DB_YP, "ASR_DB_YP" },
- { 0, NULL }
-};
-
-struct kv kv_state[] = {
- { ASR_STATE_INIT, "ASR_STATE_INIT" },
- { ASR_STATE_NEXT_DOMAIN, "ASR_STATE_NEXT_DOMAIN" },
- { ASR_STATE_NEXT_DB, "ASR_STATE_NEXT_DB" },
- { ASR_STATE_SAME_DB, "ASR_STATE_SAME_DB" },
- { ASR_STATE_NEXT_FAMILY, "ASR_STATE_NEXT_FAMILY" },
- { ASR_STATE_NEXT_NS, "ASR_STATE_NEXT_NS" },
- { ASR_STATE_UDP_SEND, "ASR_STATE_UDP_SEND" },
- { ASR_STATE_UDP_RECV, "ASR_STATE_UDP_RECV" },
- { ASR_STATE_TCP_WRITE, "ASR_STATE_TCP_WRITE" },
- { ASR_STATE_TCP_READ, "ASR_STATE_TCP_READ" },
- { ASR_STATE_PACKET, "ASR_STATE_PACKET" },
- { ASR_STATE_SUBQUERY, "ASR_STATE_SUBQUERY" },
- { ASR_STATE_NOT_FOUND, "ASR_STATE_NOT_FOUND", },
- { ASR_STATE_HALT, "ASR_STATE_HALT" },
- { 0, NULL }
-};
-
-struct kv kv_transition[] = {
- { ASYNC_COND, "ASYNC_COND" },
- { ASYNC_YIELD, "ASYNC_YIELD" },
- { ASYNC_DONE, "ASYNC_DONE" },
- { 0, NULL }
-};
-
-const char *
-asr_querystr(int type)
-{
- return kvlookup(kv_query_type, type);
-}
-
-const char *
-asr_transitionstr(int type)
-{
- return kvlookup(kv_transition, type);
-}
-
void
-asr_dump_async(struct async *as)
-{
- asr_printf("%s fd=%i timeout=%i"
- " dom_idx=%i db_idx=%i ns_idx=%i ns_cycles=%i\n",
- kvlookup(kv_state, as->as_state),
- as->as_fd,
- as->as_timeout,
-
- as->as_dom_idx,
- as->as_db_idx,
- as->as_ns_idx,
- as->as_ns_cycles);
-}
-
-void
-asr_dump_packet(FILE *f, const void *data, size_t len, int noid)
+asr_dump_packet(FILE *f, const void *data, size_t len)
{
char buf[1024];
struct packed p;
@@ -507,7 +183,7 @@ asr_dump_packet(FILE *f, const void *data, size_t len, int noid)
return;
}
- fprintf(f, ";; HEADER %s\n", print_header(&h, buf, sizeof buf, noid));
+ fprintf(f, ";; HEADER %s\n", print_header(&h, buf, sizeof buf));
if (h.qdcount)
fprintf(f, ";; QUERY SECTION:\n");
@@ -542,34 +218,163 @@ asr_dump_packet(FILE *f, const void *data, size_t len, int noid)
if (p.err)
fprintf(f, ";; ERROR AT OFFSET %zu/%zu: %s\n", p.offset, p.len,
p.err);
-
- return;
}
-static void
-asr_vdebug(const char *fmt, va_list ap)
+const char *
+print_sockaddr(const struct sockaddr *sa, char *buf, size_t len)
{
- if (asr_debug)
- vfprintf(stderr, fmt, ap);
+ char h[256];
+ int portno;
+ union {
+ const struct sockaddr *sa;
+ const struct sockaddr_in *sin;
+ const struct sockaddr_in6 *sin6;
+ } s;
+
+ s.sa = sa;
+
+ switch (sa->sa_family) {
+ case AF_INET:
+ inet_ntop(AF_INET, &s.sin->sin_addr, h, sizeof h);
+ portno = ntohs(s.sin->sin_port);
+ break;
+ case AF_INET6:
+ inet_ntop(AF_INET6, &s.sin6->sin6_addr, h, sizeof h);
+ portno = ntohs(s.sin6->sin6_port);
+ break;
+ default:
+ snprintf(buf, len, "?");
+ return (buf);
+ }
+
+ snprintf(buf, len, "%s:%i", h, portno);
+ return (buf);
}
void
-asr_printf(const char *fmt, ...)
+asr_dump_config(FILE *f, struct asr *a)
+{
+ char buf[256];
+ int i;
+ struct asr_ctx *ac;
+ unsigned int o;
+
+ if (f == NULL)
+ return;
+
+ ac = a->a_ctx;
+
+ fprintf(f, "--------- ASR CONFIG ---------------\n");
+ if (a->a_path)
+ fprintf(f, "CONF FILE \"%s\"\n", a->a_path);
+ else
+ fprintf(f, "STATIC CONF\n");
+ fprintf(f, "DOMAIN \"%s\"\n", ac->ac_domain);
+ fprintf(f, "SEARCH\n");
+ for(i = 0; i < ac->ac_domcount; i++)
+ fprintf(f, " \"%s\"\n", ac->ac_dom[i]);
+ fprintf(f, "OPTIONS\n");
+ fprintf(f, " options:");
+ o = ac->ac_options;
+
+#define PRINTOPT(flag, n) if (o & (flag)) { fprintf(f, " " n); o &= ~(flag); }
+ PRINTOPT(RES_INIT, "INIT");
+ PRINTOPT(RES_DEBUG, "DEBUG");
+ PRINTOPT(RES_USEVC, "USEVC");
+ PRINTOPT(RES_IGNTC, "IGNTC");
+ PRINTOPT(RES_RECURSE, "RECURSE");
+ PRINTOPT(RES_DEFNAMES, "DEFNAMES");
+ PRINTOPT(RES_STAYOPEN, "STAYOPEN");
+ PRINTOPT(RES_DNSRCH, "DNSRCH");
+ PRINTOPT(RES_NOALIASES, "NOALIASES");
+ PRINTOPT(RES_USE_EDNS0, "USE_EDNS0");
+ PRINTOPT(RES_USE_DNSSEC, "USE_DNSSEC");
+ if (o)
+ fprintf(f, " 0x%08x", o);
+ fprintf(f, "\n");
+
+ fprintf(f, " ndots: %i\n", ac->ac_ndots);
+ fprintf(f, " family:");
+ for(i = 0; ac->ac_family[i] != -1; i++)
+ fprintf(f, " %s", (ac->ac_family[i] == AF_INET)?"inet":"inet6");
+ fprintf(f, "\n");
+ fprintf(f, "NAMESERVERS timeout=%i retry=%i\n",
+ ac->ac_nstimeout,
+ ac->ac_nsretries);
+ for(i = 0; i < ac->ac_nscount; i++)
+ fprintf(f, " %s\n", print_sockaddr(ac->ac_ns[i], buf,
+ sizeof buf));
+ fprintf(f, "HOSTFILE %s\n", ac->ac_hostfile);
+ fprintf(f, "LOOKUP");
+ for(i = 0; i < ac->ac_dbcount; i++) {
+ switch (ac->ac_db[i]) {
+ case ASR_DB_FILE:
+ fprintf(f, " file");
+ break;
+ case ASR_DB_DNS:
+ fprintf(f, " dns");
+ break;
+ case ASR_DB_YP:
+ fprintf(f, " yp");
+ break;
+ default:
+ fprintf(f, " ?%i", ac->ac_db[i]);
+ }
+ }
+ fprintf(f, "\n------------------------------------\n");
+}
+
+#define CASE(n) case n: return #n
+
+const char *
+asr_statestr(int state)
{
- va_list ap;
+ switch (state) {
+ CASE(ASR_STATE_INIT);
+ CASE(ASR_STATE_NEXT_DOMAIN);
+ CASE(ASR_STATE_NEXT_DB);
+ CASE(ASR_STATE_SAME_DB);
+ CASE(ASR_STATE_NEXT_FAMILY);
+ CASE(ASR_STATE_NEXT_NS);
+ CASE(ASR_STATE_UDP_SEND);
+ CASE(ASR_STATE_UDP_RECV);
+ CASE(ASR_STATE_TCP_WRITE);
+ CASE(ASR_STATE_TCP_READ);
+ CASE(ASR_STATE_PACKET);
+ CASE(ASR_STATE_SUBQUERY);
+ CASE(ASR_STATE_NOT_FOUND);
+ CASE(ASR_STATE_HALT);
+ default:
+ return "?";
+ }
+};
- va_start(ap, fmt);
- asr_vdebug(fmt, ap);
- va_end(ap);
+const char *
+asr_querystr(int type)
+{
+ switch (type) {
+ CASE(ASR_SEND);
+ CASE(ASR_SEARCH);
+ CASE(ASR_GETRRSETBYNAME);
+ CASE(ASR_GETHOSTBYNAME);
+ CASE(ASR_GETHOSTBYADDR);
+ CASE(ASR_GETNETBYNAME);
+ CASE(ASR_GETNETBYADDR);
+ CASE(ASR_GETADDRINFO);
+ CASE(ASR_GETNAMEINFO);
+ default:
+ return "?";
+ }
}
-void
-async_set_state(struct async *as, int state)
+const char *
+asr_transitionstr(int type)
{
- asr_printf("asr: [%s@%p] %s -> %s\n",
- kvlookup(kv_query_type, as->as_type),
- as,
- kvlookup(kv_state, as->as_state),
- kvlookup(kv_state, state));
- as->as_state = state;
+ switch(type) {
+ CASE(ASYNC_COND);
+ CASE(ASYNC_YIELD);
+ CASE(ASYNC_DONE);
+ default:
+ return "?";
+ }
}
diff --git a/contrib/lib/libc/asr/asr_private.h b/contrib/lib/libc/asr/asr_private.h
index 7562ca5b..16b46243 100644
--- a/contrib/lib/libc/asr/asr_private.h
+++ b/contrib/lib/libc/asr/asr_private.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: asr_private.h,v 1.6 2012/09/06 13:57:51 eric Exp $ */
+/* $OpenBSD: asr_private.h,v 1.8 2012/09/09 12:15:32 eric Exp $ */
/*
* Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
*
@@ -329,20 +329,35 @@ struct async *gethostbyaddr_async_ctx(const void *, socklen_t, int,
#ifdef DEBUG
-extern int asr_debug;
+#define DPRINT(...) do { if(asr_debug) { \
+ fprintf(asr_debug, __VA_ARGS__); \
+ } } while (0)
+#define DPRINT_PACKET(n, p, s) do { if(asr_debug) { \
+ fprintf(asr_debug, "----- %s -----\n", n); \
+ asr_dump_packet(asr_debug, (p), (s)); \
+ fprintf(asr_debug, "--------------\n"); \
+ } } while (0)
-/* asr_debug.h */
const char *asr_querystr(int);
+const char *asr_statestr(int);
const char *asr_transitionstr(int);
-void asr_dump(struct asr *);
-void asr_dump_async(struct async *);
-void asr_dump_packet(FILE *, const void *, size_t, int);
-void asr_printf(const char *fmt, ...);
-void async_set_state(struct async *, int);
-char *asr_print_addr(const struct sockaddr *, char *, size_t);
+const char *print_sockaddr(const struct sockaddr *, char *, size_t);
+void asr_dump_config(FILE *, struct asr *);
+void asr_dump_packet(FILE *, const void *, size_t);
+
+extern FILE * asr_debug;
#else /* DEBUG */
-#define async_set_state(a, s) do { (a)->as_state = (s); } while (0)
+#define DPRINT(...)
+#define DPRINT_PACKET(...)
#endif /* DEBUG */
+
+#define async_set_state(a, s) do { \
+ DPRINT("asr: [%s@%p] %s -> %s\n", \
+ asr_querystr((a)->as_type), \
+ as, \
+ asr_statestr((a)->as_state), \
+ asr_statestr((s))); \
+ (a)->as_state = (s); } while (0)
diff --git a/contrib/lib/libc/asr/res_search_async.c b/contrib/lib/libc/asr/res_search_async.c
index 08674db0..6399c7f3 100644
--- a/contrib/lib/libc/asr/res_search_async.c
+++ b/contrib/lib/libc/asr/res_search_async.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: res_search_async.c,v 1.1 2012/04/14 09:24:18 eric Exp $ */
+/* $OpenBSD: res_search_async.c,v 1.2 2012/09/09 09:42:06 eric Exp $ */
/*
* Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
*
@@ -50,9 +50,9 @@ res_search_async(const char *name, int class, int type, unsigned char *ans,
{
struct asr_ctx *ac;
struct async *as;
-#ifdef DEBUG
- asr_printf("asr: res_search_async(\"%s\", %i, %i)\n", name, class, type);
-#endif
+
+ DPRINT("asr: res_search_async(\"%s\", %i, %i)\n", name, class, type);
+
ac = asr_use_resolver(asr);
as = res_search_async_ctx(name, class, type, ans, anslen, ac);
asr_ctx_unref(ac);
@@ -66,10 +66,7 @@ res_search_async_ctx(const char *name, int class, int type, unsigned char *ans,
{
struct async *as;
-#ifdef DEBUG
- asr_printf("asr: res_search_async_ctx(\"%s\", %i, %i)\n",
- name, class, type);
-#endif
+ DPRINT("asr: res_search_async_ctx(\"%s\", %i, %i)\n", name, class, type);
if ((as = async_new(ac, ASR_SEARCH)) == NULL)
goto err; /* errno set */
diff --git a/contrib/lib/libc/asr/res_send_async.c b/contrib/lib/libc/asr/res_send_async.c
index 1cafa528..387c131a 100644
--- a/contrib/lib/libc/asr/res_send_async.c
+++ b/contrib/lib/libc/asr/res_send_async.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: res_send_async.c,v 1.2 2012/07/07 20:41:52 eric Exp $ */
+/* $OpenBSD: res_send_async.c,v 1.4 2012/09/09 12:15:32 eric Exp $ */
/*
* Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
*
@@ -60,12 +60,8 @@ res_send_async(const unsigned char *buf, int buflen, unsigned char *ans,
struct header h;
struct query q;
-#ifdef DEBUG
- if (asr_debug) {
- asr_printf("asr: res_send_async()\n");
- asr_dump_packet(stderr, buf, buflen, 0);
- }
-#endif
+ DPRINT_PACKET("asr: res_send_async()", buf, buflen);
+
ac = asr_use_resolver(asr);
if ((as = async_new(ac, ASR_SEND)) == NULL) {
asr_ctx_unref(ac);
@@ -124,9 +120,9 @@ res_query_async(const char *name, int class, int type, unsigned char *ans,
{
struct asr_ctx *ac;
struct async *as;
-#ifdef DEBUG
- asr_printf("asr: res_query_async(\"%s\", %i, %i)\n", name, class, type);
-#endif
+
+ DPRINT("asr: res_query_async(\"%s\", %i, %i)\n", name, class, type);
+
ac = asr_use_resolver(asr);
as = res_query_async_ctx(name, class, type, ans, anslen, ac);
asr_ctx_unref(ac);
@@ -140,10 +136,8 @@ res_query_async_ctx(const char *name, int class, int type, unsigned char *ans,
{
struct async *as;
-#ifdef DEBUG
- asr_printf("asr: res_query_async_ctx(\"%s\", %i, %i)\n", name, class,
- type);
-#endif
+ DPRINT("asr: res_query_async_ctx(\"%s\", %i, %i)\n", name, class, type);
+
if ((as = async_new(a_ctx, ASR_SEND)) == NULL)
return (NULL); /* errno set */
as->as_run = res_send_async_run;
@@ -380,25 +374,19 @@ setup_query(struct async *as, const char *name, const char *dom,
if (as->as.dns.flags & ASYNC_EXTOBUF) {
errno = EINVAL;
-#ifdef DEBUG
- asr_printf("attempting to write in user packet");
-#endif
+ DPRINT("attempting to write in user packet");
return (-1);
}
if (asr_make_fqdn(name, dom, fqdn, sizeof(fqdn)) > sizeof(fqdn)) {
errno = EINVAL;
-#ifdef DEBUG
- asr_printf("asr_make_fqdn: name too long\n");
-#endif
+ DPRINT("asr_make_fqdn: name too long\n");
return (-1);
}
if (dname_from_fqdn(fqdn, dname, sizeof(dname)) == -1) {
errno = EINVAL;
-#ifdef DEBUG
- asr_printf("dname_from_fqdn: invalid\n");
-#endif
+ DPRINT("dname_from_fqdn: invalid\n");
return (-1);
}
@@ -420,9 +408,7 @@ setup_query(struct async *as, const char *name, const char *dom,
pack_header(&p, &h);
pack_query(&p, type, class, dname);
if (p.err) {
-#ifdef DEBUG
- asr_printf("error packing query");
-#endif
+ DPRINT("error packing query");
errno = EINVAL;
return (-1);
}
@@ -435,20 +421,12 @@ setup_query(struct async *as, const char *name, const char *dom,
free(as->as.dns.dname);
as->as.dns.dname = strdup(dname);
if (as->as.dns.dname == NULL) {
-#ifdef DEBUG
- asr_printf("strdup");
-#endif
+ DPRINT("strdup");
return (-1); /* errno set */
}
as->as.dns.obuflen = p.offset;
-#ifdef DEBUG
- if (asr_debug) {
- asr_printf("------- asr_setup_query(): packet -------\n");
- asr_dump_packet(stderr, as->as.dns.obuf, as->as.dns.obuflen, 0);
- asr_printf("-----------------------------------------\n");
- }
-#endif
+ DPRINT_PACKET("asr_setup_query", as->as.dns.obuf, as->as.dns.obuflen);
return (0);
}
@@ -465,11 +443,11 @@ udp_send(struct async *as)
int save_errno;
#ifdef DEBUG
char buf[256];
-
- if (asr_debug)
- asr_printf("asr: [%p] connecting to %s UDP\n", as,
- asr_print_addr(AS_NS_SA(as), buf, sizeof buf));
#endif
+
+ DPRINT("asr: [%p] connecting to %s UDP\n", as,
+ print_sockaddr(AS_NS_SA(as), buf, sizeof buf));
+
as->as_fd = sockaddr_connect(AS_NS_SA(as), SOCK_DGRAM);
if (as->as_fd == -1)
return (-1); /* errno set */
@@ -520,13 +498,7 @@ udp_recv(struct async *as)
as->as.dns.ibuflen = n;
-#ifdef DEBUG
- if (asr_debug) {
- asr_printf("------- asr_udp_recv() packet -------\n");
- asr_dump_packet(stderr, as->as.dns.ibuf, as->as.dns.ibuflen, 0);
- asr_printf("-------------------------------------\n");
- }
-#endif
+ DPRINT_PACKET("asr_udp_recv()", as->as.dns.ibuf, as->as.dns.ibuflen);
if (validate_packet(as) == -1)
return (-1); /* errno set */
@@ -554,11 +526,8 @@ tcp_write(struct async *as)
/* First try to connect if not already */
if (as->as_fd == -1) {
-#ifdef DEBUG
- if (asr_debug)
- asr_printf("asr: [%p] connecting to %s TCP\n", as,
- asr_print_addr(AS_NS_SA(as), buf, sizeof buf));
-#endif
+ DPRINT("asr: [%p] connecting to %s TCP\n", as,
+ print_sockaddr(AS_NS_SA(as), buf, sizeof buf));
as->as_fd = sockaddr_connect(AS_NS_SA(as), SOCK_STREAM);
if (as->as_fd == -1)
return (-1); /* errno set */
@@ -677,13 +646,8 @@ tcp_read(struct async *as)
if (as->as.dns.ibuflen != as->as.dns.datalen)
return (1);
-#ifdef DEBUG
- if (asr_debug) {
- asr_printf("------- asr_tcp_read() packet -------\n");
- asr_dump_packet(stderr, as->as.dns.ibuf, as->as.dns.ibuflen, 0);
- asr_printf("-------------------------------------\n");
- }
-#endif
+ DPRINT_PACKET("asr_tcp_read()", as->as.dns.ibuf, as->as.dns.ibuflen);
+
if (validate_packet(as) == -1)
goto close; /* errno set */
@@ -753,9 +717,7 @@ validate_packet(struct async *as)
goto inval;
if (h.id != as->as.dns.reqid) {
-#ifdef DEBUG
- asr_printf("incorrect reqid\n");
-#endif
+ DPRINT("incorrect reqid\n");
goto inval;
}
if (h.qdcount != 1)
@@ -780,10 +742,8 @@ validate_packet(struct async *as)
if (q.q_type != as->as.dns.type ||
q.q_class != as->as.dns.class ||
strcasecmp(q.q_dname, as->as.dns.dname)) {
-#ifdef DEBUG
- asr_printf("incorrect type/class/dname '%s' != '%s'\n",
+ DPRINT("incorrect type/class/dname '%s' != '%s'\n",
q.q_dname, as->as.dns.dname);
-#endif
goto inval;
}