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 #include <arpa/inet.h>
30 /* Core diagnostic functions */
32 void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent,
33 int serv, adns_query qu, const char *fmt, va_list al) {
34 const char *bef, *aft;
36 if (!(ads->iflags & adns_if_debug) && (!prevent || (ads->iflags & prevent))) return;
38 fprintf(stderr,"adns%s: ",pfx);
40 vfprintf(stderr,fmt,al);
45 if (qu && qu->query_dgram) {
47 fprintf(stderr,"%sQNAME=%s, QTYPE=%s",
49 adns__diag_domain(qu->ads,-1,0, &vb,qu->flags,
50 qu->query_dgram,qu->query_dglen,DNS_HDRSIZE),
51 qu->typei ? qu->typei->name : "<unknown>");
56 fprintf(stderr,"%sNS=%s",bef,inet_ntoa(ads->servers[serv].addr));
63 void adns__debug(adns_state ads, int serv, adns_query qu, const char *fmt, ...) {
67 adns__vdiag(ads," debug",0,serv,qu,fmt,al);
71 void adns__warn(adns_state ads, int serv, adns_query qu, const char *fmt, ...) {
75 adns__vdiag(ads," warning",adns_if_noerrprint|adns_if_noserverwarn,serv,qu,fmt,al);
79 void adns__diag(adns_state ads, int serv, adns_query qu, const char *fmt, ...) {
83 adns__vdiag(ads,"",adns_if_noerrprint,serv,qu,fmt,al);
89 void adns__vbuf_init(vbuf *vb) {
90 vb->used= vb->avail= 0; vb->buf= 0;
93 int adns__vbuf_ensure(vbuf *vb, int want) {
96 if (vb->avail >= want) return 1;
97 nb= realloc(vb->buf,want); if (!nb) return 0;
103 void adns__vbuf_appendq(vbuf *vb, const byte *data, int len) {
104 memcpy(vb->buf+vb->used,data,len);
108 int adns__vbuf_append(vbuf *vb, const byte *data, int len) {
112 newlen= vb->used+len;
113 if (vb->avail < newlen) {
114 if (newlen<20) newlen= 20;
116 nb= realloc(vb->buf,newlen);
117 if (!nb) { newlen= vb->used+len; nb= realloc(vb->buf,newlen); }
122 adns__vbuf_appendq(vb,data,len);
126 int adns__vbuf_appendstr(vbuf *vb, const char *data) {
129 return adns__vbuf_append(vb,data,l);
132 void adns__vbuf_free(vbuf *vb) {
137 /* Additional diagnostic functions */
139 const char *adns__diag_domain(adns_state ads, int serv, adns_query qu, vbuf *vb,
140 int flags, const byte *dgram, int dglen, int cbyte) {
143 st= adns__parse_domain(ads,serv,qu,vb, flags,dgram,dglen,&cbyte,dglen);
144 if (st == adns_s_nolocalmem) {
145 return "<cannot report domain... out of memory>";
149 if (!(adns__vbuf_appendstr(vb,"<bad format... ") &&
150 adns__vbuf_appendstr(vb,adns_strerror(st)) &&
151 adns__vbuf_appendstr(vb,">") &&
152 adns__vbuf_append(vb,"",1))) {
153 return "<cannot report bad format... out of memory>";
157 adns__vbuf_appendstr(vb,"<truncated ...>");
158 adns__vbuf_append(vb,"",1);
163 const char *adns_strerror(adns_status st) {
164 static char buf[100];
165 snprintf(buf,sizeof(buf),"code %d",st);