MCPcopy Create free account
hub / github.com/OpenSIPS/opensips / get_dns_answer

Function get_dns_answer

resolve.c:143–394  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

141}
142
143int get_dns_answer(union dns_query *answer,int anslen,char *qname,int qtype,int *min_ttl)
144{
145 register const HEADER *hp;
146 register int n;
147 register const unsigned char *cp;
148 const char* tname;
149 const unsigned char *eom,*erdata;
150 int type, class,ttl, buflen, ancount;
151 int haveanswer, had_error;
152 char *bp,**ap,**hap;
153 char tbuf[DNS_MAX_NAME];
154 int toobig=0;
155
156 tname = qname;
157 global_he.h_name = NULL;
158 eom = answer->buff + anslen;
159
160 hp = &answer->hdr;
161 ancount = ntohs(hp->ancount);
162 bp = hostbuf;
163 buflen = sizeof hostbuf;
164
165 cp = answer->buff;
166 BOUNDED_INCR(DNS_HDR_SIZE);
167
168 n = dn_expand(answer->buff, eom, cp, bp, buflen);
169 if (n < 0) {
170 LM_ERR("Error expanding name\n");
171 return -1;
172 }
173 BOUNDED_INCR(n+4);
174
175 if (qtype == T_A || qtype == T_AAAA) {
176 n = strlen(bp) + 1;
177 if (n >= DNS_MAX_NAME) {
178 LM_ERR("Name too large\n");
179 return -1;
180 }
181 global_he.h_name = bp;
182 bp += n;
183 buflen -= n;
184 /* The qname can be abbreviated, but h_name is now absolute. */
185 qname = global_he.h_name;
186 }
187
188 ap = host_aliases;
189 *ap = NULL;
190 global_he.h_aliases = host_aliases;
191 hap = h_addr_ptrs;
192 *hap = NULL;
193 global_he.h_addr_list = h_addr_ptrs;
194 haveanswer = 0;
195 had_error = 0;
196 while (ancount-- > 0 && cp < eom && !had_error) {
197 n = dn_expand(answer->buff, eom, cp, bp, buflen);
198 if (n < 0) {
199 had_error++;
200 continue;

Callers 2

own_gethostbyname2Function · 0.85
own_gethostbyaddrFunction · 0.85

Calls 2

dns_get16Function · 0.85
dns_get32Function · 0.85

Tested by

no test coverage detected