X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=blobdiff_plain;f=src%2Freply.c;h=486dd37ea997bc6695ce56add139f66ae82b2c77;hp=4e7f8f7aa782bf0d02aff0780d1d0ec2b0e33710;hb=ced2f0cf2a351f8d30b800c915eeee042658d235;hpb=609133ee3365572c56ffa2ffb14d274ff47eb94b diff --git a/src/reply.c b/src/reply.c index 4e7f8f7..486dd37 100644 --- a/src/reply.c +++ b/src/reply.c @@ -3,16 +3,15 @@ * - main handling and parsing routine for received datagrams */ /* - * This file is - * Copyright (C) 1997-2000 Ian Jackson - * - * It is part of adns, which is - * Copyright (C) 1997-2000 Ian Jackson - * Copyright (C) 1999-2000 Tony Finch + * This file is part of adns, which is + * Copyright (C) 1997-2000,2003,2006 Ian Jackson + * Copyright (C) 1999-2000,2003,2006 Tony Finch + * Copyright (C) 1991 Massachusetts Institute of Technology + * (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, @@ -21,8 +20,7 @@ * 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 @@ -35,7 +33,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, int id, f1, f2, qdcount, ancount, nscount, arcount; int flg_ra, flg_rd, flg_tc, flg_qr, opcode; int rrtype, rrclass, rdlength, rdstart; - int anstart, nsstart, arstart; + int anstart, nsstart; int ownermatched, l, nrrs; unsigned long ttl, soattl; const typeinfo *typei; @@ -158,7 +156,6 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, * query now. */ anstart= qu->query_dglen; - arstart= -1; /* Now, take a look at the answer section, and see if it is complete. * If it has any CNAMEs we stuff them in the answer. @@ -187,7 +184,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, continue; } if (rrtype == adns_r_cname && - (qu->typei->type & adns__rrt_typemask) != adns_r_cname) { + (qu->answer->type & adns_rrt_typemask) != adns_r_cname) { if (qu->flags & adns_qf_cname_forbid) { adns__query_fail(qu,adns_s_prohibitedcname); return; @@ -230,7 +227,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, * it contains the relevant info. */ } - } else if (rrtype == (qu->typei->type & adns__rrt_typemask)) { + } else if (rrtype == (qu->answer->type & adns_rrt_typemask)) { wantedrrs++; } else { adns__debug(ads,serv,qu,"ignoring answer RR" @@ -313,7 +310,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, /* Now, we have some RRs which we wanted. */ - qu->answer->rrs.untyped= adns__alloc_interim(qu,qu->typei->rrsz*wantedrrs); + qu->answer->rrs.untyped= adns__alloc_interim(qu,qu->answer->rrsz*wantedrrs); if (!qu->answer->rrs.untyped) { adns__query_fail(qu,adns_s_nomemory); return; @@ -339,11 +336,12 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, &ownermatched); assert(!st); assert(rrtype != -1); if (rrclass != DNS_CLASS_IN || - rrtype != (qu->typei->type & adns__rrt_typemask) || + rrtype != (qu->answer->type & adns_rrt_typemask) || !ownermatched) continue; adns__update_expires(qu,ttl,now); - st= typei->parse(&pai, rdstart,rdstart+rdlength, rrsdata+nrrs*typei->rrsz); + st= typei->parse(&pai, rdstart,rdstart+rdlength, + rrsdata+nrrs*qu->answer->rrsz); if (st) { adns__query_fail(qu,st); return; } if (rdstart==-1) goto x_truncated; nrrs++; @@ -373,7 +371,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, if (qu->cname_dgram) { st= adns__mkquery_frdgram(qu->ads,&qu->vb,&qu->id, qu->cname_dgram,qu->cname_dglen,qu->cname_begin, - qu->typei->type, qu->flags); + qu->answer->type, qu->flags); if (st) { adns__query_fail(qu,st); return; } newquery= realloc(qu->query_dgram,qu->vb.used);