3 * - diagnostic functions
7 * This file is part of adns, which is Copyright (C) 1997, 1998 Ian Jackson
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2, or (at your option)
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software Foundation,
21 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 /* Core diagnostic functions */
28 void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent,
29 int serv, const char *fmt, adns_query qu, va_list al) {
30 const char *bef, *aft;
32 if (!(ads->iflags & adns_if_debug) && (!prevent || (ads->iflags & prevent))) return;
34 fprintf(stderr,"adns%s: ",pfx);
36 vfprintf(stderr,fmt,al);
41 if (qu && qu->query_dgram) {
43 fprintf(stderr,"%sQNAME=%s, QTYPE=%s",
45 adns__diag_domain(ads,-1,0,&vb,qu->query_dgram,qu->query_dglen,DNS_HDRSIZE),
46 qu->typei ? qu->typei->name : "<unknown>");
51 fprintf(stderr,"%sNS=%s",bef,inet_ntoa(ads->servers[serv].addr));
58 void adns__debug(adns_state ads, int serv, adns_query qu, const char *fmt, ...) {
62 adns__vdiag(ads," debug",0,serv,qu,fmt,al);
66 void adns__warn(adns_state ads, int serv, adns_query qu, const char *fmt, ...) {
70 adns__vdiag(ads," warning",adns_if_noerrprint|adns_if_noserverwarn,serv,qu,fmt,al);
74 void adns__diag(adns_state ads, int serv, adns_query qu, const char *fmt, ...) {
78 adns__vdiag(ads,"",adns_if_noerrprint,serv,qu,fmt,al);
84 void adns__vbuf_init(vbuf *vb) {
85 vb->used= vb->avail= 0; vb->buf= 0;
88 int adns__vbuf_ensure(vbuf *vb, int want) {
91 if (vb->avail >= want) return 1;
92 nb= realloc(vb->buf,want); if (!nb) return 0;
98 void adns__vbuf_appendq(vbuf *vb, const byte *data, int len) {
99 memcpy(vb->buf+vb->used,data,len);
103 int adns__vbuf_append(vbuf *vb, const byte *data, int len) {
107 newlen= vb->used+len;
108 if (vb->avail < newlen) {
110 nb= realloc(vb->buf,newlen);
111 if (!nb) { newlen >>= 1; nb= realloc(vb->buf,newlen); }
116 adns__vbuf_appendq(vb,data,len);
120 /* Additional diagnostic functions */
122 const char *adns__diag_domain(adns_state ads, int serv, adns_query qu, vbuf *vb,
123 int flags, const byte *dgram, int dglen, int cbyte) {
126 st= adns__parse_domain(ads,serv,vb,qu->flags, dgram,dglen, &cbyte,dglen);
127 if (st == adns_s_nomemory) {
128 return "<cannot report domain... out of memory>";
132 if (!(adns__vbuf_appendstr(vb,"<bad format... ") &&
133 adns__vbuf_appendstr(vb,adns_strerror(st)) &&
134 adns__vbuf_appendstr(vb,">") &&
135 adns__vbuf_append(vb,"",1))) {
136 return "<cannot report bad format... out of memory>";
140 adns__vbuf_appendstr(vb,"<truncated ...>");
141 adns__vbuf_append(vb,"",1);
146 const char *adns_strerror(adns_status st) {
147 static char buf[100];
148 snprintf(buf,sizeof(buf),"code %d",st);