diff options
author | Charles Longeau <github@chl.be> | 2012-09-11 22:19:08 +0200 |
---|---|---|
committer | Charles Longeau <github@chl.be> | 2012-09-11 22:19:08 +0200 |
commit | f1bd18539fe7d987c198c47ac7dea2c14625f93c (patch) | |
tree | b2eb6df10a27cfe0496335854259d33c7c41dc6c /contrib | |
parent | sync with -current (mostly asr) (diff) | |
download | OpenSMTPD-f1bd18539fe7d987c198c47ac7dea2c14625f93c.tar.xz OpenSMTPD-f1bd18539fe7d987c198c47ac7dea2c14625f93c.zip |
sync with -current
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/lib/libc/asr/CVS/Entries | 23 | ||||
-rw-r--r-- | contrib/lib/libc/asr/asr.c | 182 | ||||
-rw-r--r-- | contrib/lib/libc/asr/asr_debug.c | 587 | ||||
-rw-r--r-- | contrib/lib/libc/asr/asr_private.h | 35 | ||||
-rw-r--r-- | contrib/lib/libc/asr/res_search_async.c | 13 | ||||
-rw-r--r-- | contrib/lib/libc/asr/res_send_async.c | 90 |
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; } |