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

Function deserialize_he_rdata

modules/dns_cache/dns_cache.c:270–348  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

268static char *h_addr_ptrs[MAXADDRS];
269static char *host_aliases[MAXALIASES];
270static struct hostent* deserialize_he_rdata(char *buff,int buf_len,int do_decoding)
271{
272 char **ap,**hap;
273 unsigned char *p;
274 int max_len=0;
275 int i,alias_no=0,addr_no=0,len=0;
276
277 /* max estimation of needed buffer */
278 if (do_decoding) {
279 max_len=calc_max_base64_decode_len(buf_len);
280 } else {
281 max_len = buf_len;
282 }
283
284 if (dec_he_buf == NULL || max_len > dec_he_buf_len) {
285 /* realloc buff if not enough space */
286 dec_he_buf = pkg_realloc(dec_he_buf,max_len);
287 if (dec_he_buf == NULL) {
288 LM_ERR("No more pkg\n");
289 return NULL;
290 }
291 dec_he_buf_len = max_len;
292 }
293
294 /* set pointer in dec_global_he */
295 ap = host_aliases;
296 dec_global_he.h_aliases = host_aliases;
297 hap = h_addr_ptrs;
298 dec_global_he.h_addr_list = h_addr_ptrs;
299
300 if (do_decoding) {
301 /* decode base64 buf */
302 base64decode(dec_he_buf,(unsigned char *)buff,buf_len);
303 p = dec_he_buf;
304 } else {
305 memcpy(dec_he_buf,buff,buf_len);
306 p = dec_he_buf;
307 }
308
309 /* set address type & length */
310 memcpy(&dec_global_he.h_addrtype,p,sizeof(int));
311 p+=sizeof(int);
312 if (dec_global_he.h_addrtype == AF_INET)
313 dec_global_he.h_length=4;
314 else
315 dec_global_he.h_length=16;
316
317 /* set name */
318 memcpy(&len,p,sizeof(int));
319 p+=sizeof(int);
320 dec_global_he.h_name = (char *)p;
321 p+=len;
322
323 /* get number of aliases */
324 memcpy(&alias_no,p,sizeof(int));
325 p+=sizeof(int);
326
327 for (i=0;i<alias_no;i++) {

Callers 1

get_dnscache_valueFunction · 0.85

Calls 1

base64decodeFunction · 0.85

Tested by

no test coverage detected