X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fgeneral.c;h=ae1f05f96056826a944c7070f6fe74fc6b4c02e8;hb=73eb26037c46bebeaa30ba38eba887216f0e9a6e;hp=5ebdd6ad9c935dedac15285e0137dfdf4442f208;hpb=d942707de2dd9809338882f09a9f23316dc8be36;p=adns.git diff --git a/src/general.c b/src/general.c index 5ebdd6a..ae1f05f 100644 --- a/src/general.c +++ b/src/general.c @@ -5,10 +5,10 @@ */ /* * This file is - * Copyright (C) 1997-1999 Ian Jackson + * Copyright (C) 1997-2000 Ian Jackson * * It is part of adns, which is - * Copyright (C) 1997-1999 Ian Jackson + * Copyright (C) 1997-2000 Ian Jackson * Copyright (C) 1999 Tony Finch * * This program is free software; you can redistribute it and/or modify @@ -27,6 +27,7 @@ */ #include +#include #include #include @@ -46,7 +47,11 @@ void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent, (!(ads->iflags & adns_if_debug) && (!prevent || (ads->iflags & prevent)))) return; - fprintf(ads->diagfile,"adns%s: ",pfx); + if (ads->iflags & adns_if_logpid) { + fprintf(ads->diagfile,"adns%s [%ld]: ",pfx,(long)getpid()); + } else { + fprintf(ads->diagfile,"adns%s: ",pfx); + } vfprintf(ads->diagfile,fmt,al); @@ -63,6 +68,7 @@ void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent, if (qu->typei && qu->typei->fmtname) fprintf(ads->diagfile,"(%s)",qu->typei->fmtname); bef=", "; aft=")\n"; + adns__vbuf_free(&vb); } if (serv>=0) { @@ -204,6 +210,7 @@ adns_status adns_rr_info(adns_rrtype type, return st; } + #define SINFO(n,s) { adns_s_##n, #n, s } static const struct sinfo { @@ -237,10 +244,10 @@ static const struct sinfo { SINFO( querydomainwrong, "Domain invalid for particular DNS query type" ), SINFO( querydomaininvalid, "Domain name is syntactically invalid" ), - SINFO( querydomaintoolong, "Domain name is too long" ), + SINFO( querydomaintoolong, "Domain name or component is too long" ), SINFO( nxdomain, "No such domain" ), - SINFO( nodata, "No such data" ), + SINFO( nodata, "No such data" ) }; static int si_compar(const void *key, const void *elem) { @@ -268,6 +275,43 @@ const char *adns_errabbrev(adns_status st) { return si->abbrev; } + +#define STINFO(max) { adns_s_max_##max, #max } + +static const struct stinfo { + adns_status stmax; + const char *abbrev; +} stinfos[]= { + { adns_s_ok, "ok" }, + STINFO( localfail ), + STINFO( remotefail ), + STINFO( tempfail ), + STINFO( misconfig ), + STINFO( misquery ), + STINFO( permfail ) +}; + +static int sti_compar(const void *key, const void *elem) { + const adns_status *st= key; + const struct stinfo *sti= elem; + + adns_status here, min, max; + + here= *st; + min= (sti==stinfos) ? 0 : sti[-1].stmax+1; + max= sti->stmax; + + return here < min ? -1 : here > max ? 1 : 0; +} + +const char *adns_errtypeabbrev(adns_status st) { + const struct stinfo *sti; + + sti= bsearch(&st,stinfos,sizeof(stinfos)/sizeof(*stinfos),sizeof(*stinfos),sti_compar); + return sti->abbrev; +} + + void adns__isort(void *array, int nobjs, int sz, void *tempbuf, int (*needswap)(void *context, const void *a, const void *b), void *context) {