7c42eb6e6b76ec9f1c42436935354422c52de1a5
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
);