diff options
Diffstat (limited to '')
-rw-r--r-- | adns-0.6/src/general.c | 360 |
1 files changed, 0 insertions, 360 deletions
diff --git a/adns-0.6/src/general.c b/adns-0.6/src/general.c deleted file mode 100644 index 8793762..0000000 --- a/adns-0.6/src/general.c +++ /dev/null @@ -1,360 +0,0 @@ -/* - * general.c - * - diagnostic functions - * - vbuf handling - */ -/* - * This file is - * Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk> - * - * It is part of adns, which is - * Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk> - * Copyright (C) 1999 Tony Finch <dot@dotat.at> - * - * 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) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * 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. - */ - -#include <stdlib.h> -#include <unistd.h> - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include "internal.h" - -/* Core diagnostic functions */ - -void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent, - int serv, adns_query qu, const char *fmt, va_list al) { - const char *bef, *aft; - vbuf vb; - - if (!ads->diagfile || - (!(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()); - } else { - fprintf(ads->diagfile,"adns%s: ",pfx); - } - - vfprintf(ads->diagfile,fmt,al); - - bef= " ("; - aft= "\n"; - - if (qu && qu->query_dgram) { - adns__vbuf_init(&vb); - fprintf(ads->diagfile,"%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); - bef=", "; aft=")\n"; - adns__vbuf_free(&vb); - } - - if (serv>=0) { - fprintf(ads->diagfile,"%sNS=%s",bef,inet_ntoa(ads->servers[serv].addr)); - bef=", "; aft=")\n"; - } - - fputs(aft,ads->diagfile); -} - -void adns__debug(adns_state ads, int serv, adns_query qu, const char *fmt, ...) { - va_list al; - - va_start(al,fmt); - adns__vdiag(ads," debug",0,serv,qu,fmt,al); - va_end(al); -} - -void adns__warn(adns_state ads, int serv, adns_query qu, const char *fmt, ...) { - va_list al; - - va_start(al,fmt); - adns__vdiag(ads," warning",adns_if_noerrprint|adns_if_noserverwarn,serv,qu,fmt,al); - va_end(al); -} - -void adns__diag(adns_state ads, int serv, adns_query qu, const char *fmt, ...) { - va_list al; - - va_start(al,fmt); - adns__vdiag(ads,"",adns_if_noerrprint,serv,qu,fmt,al); - va_end(al); -} - -/* vbuf functions */ - -void adns__vbuf_init(vbuf *vb) { - vb->used= vb->avail= 0; vb->buf= 0; -} - -int adns__vbuf_ensure(vbuf *vb, int want) { - void *nb; - - if (vb->avail >= want) return 1; - nb= realloc(vb->buf,want); if (!nb) return 0; - vb->buf= nb; - vb->avail= want; - return 1; -} - -void adns__vbuf_appendq(vbuf *vb, const byte *data, int len) { - memcpy(vb->buf+vb->used,data,len); - vb->used+= len; -} - -int adns__vbuf_append(vbuf *vb, const byte *data, int len) { - int newlen; - void *nb; - - newlen= vb->used+len; - if (vb->avail < newlen) { - if (newlen<20) newlen= 20; - newlen <<= 1; - nb= realloc(vb->buf,newlen); - if (!nb) { newlen= vb->used+len; nb= realloc(vb->buf,newlen); } - if (!nb) return 0; - vb->buf= nb; - vb->avail= newlen; - } - adns__vbuf_appendq(vb,data,len); - return 1; -} - -int adns__vbuf_appendstr(vbuf *vb, const char *data) { - int l; - l= strlen(data); - return adns__vbuf_append(vb,data,l); -} - -void adns__vbuf_free(vbuf *vb) { - free(vb->buf); - adns__vbuf_init(vb); -} - -/* Additional diagnostic functions */ - -const char *adns__diag_domain(adns_state ads, int serv, adns_query qu, - vbuf *vb, const byte *dgram, int dglen, int cbyte) { - adns_status st; - - st= adns__parse_domain(ads,serv,qu,vb, pdf_quoteok, dgram,dglen,&cbyte,dglen); - if (st == adns_s_nomemory) { - return "<cannot report domain... out of memory>"; - } - if (st) { - vb->used= 0; - if (!(adns__vbuf_appendstr(vb,"<bad format... ") && - adns__vbuf_appendstr(vb,adns_strerror(st)) && - adns__vbuf_appendstr(vb,">") && - adns__vbuf_append(vb,"",1))) { - return "<cannot report bad format... out of memory>"; - } - } - if (!vb->used) { - adns__vbuf_appendstr(vb,"<truncated ...>"); - adns__vbuf_append(vb,"",1); - } - return vb->buf; -} - -adns_status adns_rr_info(adns_rrtype type, - const char **rrtname_r, const char **fmtname_r, - int *len_r, - const void *datap, char **data_r) { - const typeinfo *typei; - vbuf vb; - adns_status st; - - typei= adns__findtype(type); - if (!typei) return adns_s_unknownrrtype; - - if (rrtname_r) *rrtname_r= typei->rrtname; - if (fmtname_r) *fmtname_r= typei->fmtname; - if (len_r) *len_r= typei->rrsz; - - if (!datap) return adns_s_ok; - - adns__vbuf_init(&vb); - st= typei->convstring(&vb,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); - *data_r= realloc(vb.buf,vb.used); - if (!*data_r) *data_r= vb.buf; - return adns_s_ok; - - x_freevb: - adns__vbuf_free(&vb); - return st; -} - - -#define SINFO(n,s) { adns_s_##n, #n, s } - -static const struct sinfo { - adns_status st; - const char *abbrev; - const char *string; -} sinfos[]= { - SINFO( ok, "OK" ), - - SINFO( nomemory, "Out of memory" ), - SINFO( unknownrrtype, "Query not implemented in DNS library" ), - SINFO( systemfail, "General resolver or system failure" ), - - SINFO( timeout, "DNS query timed out" ), - SINFO( allservfail, "All nameservers failed" ), - SINFO( norecurse, "Recursion denied by nameserver" ), - SINFO( invalidresponse, "Nameserver sent bad response" ), - SINFO( unknownformat, "Nameserver used unknown format" ), - - SINFO( rcodeservfail, "Nameserver reports failure" ), - SINFO( rcodeformaterror, "Query not understood by nameserver" ), - SINFO( rcodenotimplemented, "Query not implemented by nameserver" ), - SINFO( rcoderefused, "Query refused by nameserver" ), - SINFO( rcodeunknown, "Nameserver sent unknown response code" ), - - SINFO( inconsistent, "Inconsistent resource records in DNS" ), - SINFO( prohibitedcname, "DNS alias found where canonical name wanted" ), - SINFO( answerdomaininvalid, "Found syntactically invalid domain name" ), - SINFO( answerdomaintoolong, "Found overly-long domain name" ), - SINFO( invaliddata, "Found invalid DNS data" ), - - SINFO( querydomainwrong, "Domain invalid for particular DNS query type" ), - SINFO( querydomaininvalid, "Domain name is syntactically invalid" ), - SINFO( querydomaintoolong, "Domain name is too long" ), - - SINFO( nxdomain, "No such domain" ), - SINFO( nodata, "No such data" ) -}; - -static int si_compar(const void *key, const void *elem) { - const adns_status *st= key; - const struct sinfo *si= elem; - - return *st < si->st ? -1 : *st > si->st ? 1 : 0; -} - -static const struct sinfo *findsinfo(adns_status st) { - return bsearch(&st,sinfos,sizeof(sinfos)/sizeof(*sinfos),sizeof(*sinfos),si_compar); -} - -const char *adns_strerror(adns_status st) { - const struct sinfo *si; - - si= findsinfo(st); - return si->string; -} - -const char *adns_errabbrev(adns_status st) { - const struct sinfo *si; - - si= findsinfo(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) { - byte *data= array; - int i, place; - - for (i=0; i<nobjs; i++) { - for (place= i; - place>0 && needswap(context, data + (place-1)*sz, data + i*sz); - place--); - if (place != i) { - memcpy(tempbuf, data + i*sz, sz); - memmove(data + (place+1)*sz, data + place*sz, (i-place)*sz); - memcpy(data + place*sz, tempbuf, sz); - } - } -} - -/* SIGPIPE protection. */ - -void adns__sigpipe_protect(adns_state ads) { - sigset_t toblock; - struct sigaction sa; - int r; - - if (ads->iflags & adns_if_nosigpipe) return; - - sigfillset(&toblock); - sigdelset(&toblock,SIGPIPE); - - sa.sa_handler= SIG_IGN; - sigfillset(&sa.sa_mask); - sa.sa_flags= 0; - - r= sigprocmask(SIG_SETMASK,&toblock,&ads->stdsigmask); assert(!r); - r= sigaction(SIGPIPE,&sa,&ads->stdsigpipe); assert(!r); -} - -void adns__sigpipe_unprotect(adns_state ads) { - int r; - - if (ads->iflags & adns_if_nosigpipe) return; - - r= sigaction(SIGPIPE,&ads->stdsigpipe,0); assert(!r); - r= sigprocmask(SIG_SETMASK,&ads->stdsigmask,0); assert(!r); -} |