* - vbuf handling
*/
/*
- * This file is
- * Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
- *
- * It is part of adns, which is
- * Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
- * Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+ * This file is part of adns, which is Copyright Ian Jackson
+ * and contributors (see the file INSTALL for full details).
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
+ * the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * along with this program; if not, write to the Free Software Foundation.
*/
#include <stdlib.h>
/* Core diagnostic functions */
+void adns__vlprintf(adns_state ads, const char *fmt, va_list al) {
+ ads->logfn(ads,ads->logfndata,fmt,al);
+}
+
+void adns__lprintf(adns_state ads, const char *fmt, ...) {
+ va_list al;
+ va_start(al,fmt);
+ adns__vlprintf(ads,fmt,al);
+ va_end(al);
+}
+
void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent,
int serv, adns_query qu, const char *fmt, va_list al) {
+ char buf[ADNS_ADDR2TEXT_BUFLEN];
const char *bef, *aft;
vbuf vb;
- if (!ads->diagfile ||
+ if (!ads->logfn ||
(!(ads->iflags & adns_if_debug)
&& (!prevent || (ads->iflags & prevent))))
return;
if (ads->iflags & adns_if_logpid) {
- fprintf(ads->diagfile,"adns%s [%ld]: ",pfx,(long)getpid());
+ adns__lprintf(ads,"adns%s [%ld]: ",pfx,(long)getpid());
} else {
- fprintf(ads->diagfile,"adns%s: ",pfx);
+ adns__lprintf(ads,"adns%s: ",pfx);
}
- vfprintf(ads->diagfile,fmt,al);
+ adns__vlprintf(ads,fmt,al);
bef= " (";
aft= "\n";
if (qu && qu->query_dgram) {
adns__vbuf_init(&vb);
- fprintf(ads->diagfile,"%sQNAME=%s, QTYPE=%s",
+ adns__lprintf(ads,"%sQNAME=%s, QTYPE=%s",
bef,
adns__diag_domain(qu->ads,-1,0, &vb,
qu->query_dgram,qu->query_dglen,DNS_HDRSIZE),
qu->typei ? qu->typei->rrtname : "<unknown>");
if (qu->typei && qu->typei->fmtname)
- fprintf(ads->diagfile,"(%s)",qu->typei->fmtname);
+ adns__lprintf(ads,"(%s)",qu->typei->fmtname);
bef=", "; aft=")\n";
adns__vbuf_free(&vb);
}
if (serv>=0) {
- fprintf(ads->diagfile,"%sNS=%s",bef,inet_ntoa(ads->servers[serv].addr));
+ adns__lprintf(ads,"%sNS=%s",bef,
+ adns__sockaddr_ntoa(&ads->servers[serv].addr.sa, buf));
bef=", "; aft=")\n";
}
- fputs(aft,ads->diagfile);
+ adns__lprintf(ads,"%s",aft);
}
void adns__debug(adns_state ads, int serv, adns_query qu,
return vb->buf;
}
+int adns__getrrsz_default(const typeinfo *typei, adns_rrtype type)
+ { return typei->fixed_rrsz; }
+
adns_status adns_rr_info(adns_rrtype type,
const char **rrtname_r, const char **fmtname_r,
int *len_r,
if (rrtname_r) *rrtname_r= typei->rrtname;
if (fmtname_r) *fmtname_r= typei->fmtname;
- if (len_r) *len_r= typei->rrsz;
+ if (len_r) *len_r= typei->getrrsz(typei, type);
if (!datap) return adns_s_ok;
adns__vbuf_init(&vb);
- st= typei->convstring(&vb,datap);
+ st= typei->convstring(&vb,type,datap);
if (st) goto x_freevb;
if (!adns__vbuf_append(&vb,"",1)) { st= adns_s_nomemory; goto x_freevb; }
assert(strlen(vb.buf) == vb.used-1);
const struct sinfo *si;
si= findsinfo(st);
- return si->string;
+ return si ? si->string : 0;
}
const char *adns_errabbrev(adns_status st) {
const struct sinfo *si;
si= findsinfo(st);
- return si->abbrev;
+ return si ? si->abbrev : 0;
}
sti= bsearch(&st,stinfos, sizeof(stinfos)/sizeof(*stinfos),
sizeof(*stinfos), sti_compar);
- return sti->abbrev;
+ return sti ? sti->abbrev : 0;
}