| 268 | static char *h_addr_ptrs[MAXADDRS]; |
| 269 | static char *host_aliases[MAXALIASES]; |
| 270 | static 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++) { |
no test coverage detected