static value alloc_host_entry(struct hostent *entry) { value res; value name = Val_unit, aliases = Val_unit; value addr_list = Val_unit, adr = Val_unit; Begin_roots4 (name, aliases, addr_list, adr); name = copy_string((char *)(entry->h_name)); /* PR#4043: protect against buggy implementations of gethostbyname() that return a NULL pointer in h_aliases */ if (entry->h_aliases) aliases = copy_string_array((const char**)entry->h_aliases); else aliases = Atom(0); entry_h_length = entry->h_length; #ifdef h_addr addr_list = alloc_array(alloc_one_addr, (const char**)entry->h_addr_list); #else adr = alloc_one_addr(entry->h_addr); addr_list = caml_alloc_1(0, adr); #endif int addrtype; switch (entry->h_addrtype) { case PF_UNIX: addrtype = 0; break; case PF_INET: addrtype = 1; break; default: /*PF_INET6 */ addrtype = 2; break; } res = caml_alloc_4(0, name, aliases, Val_int(addrtype), addr_list); End_roots(); return res; }
static value alloc_host_entry(struct hostent *entry) { value res; value name = Val_unit, aliases = Val_unit; value addr_list = Val_unit, adr = Val_unit; Begin_roots4 (name, aliases, addr_list, adr); name = copy_string((char *)(entry->h_name)); /* PR#4043: protect against buggy implementations of gethostbyname() that return a NULL pointer in h_aliases */ if (entry->h_aliases) aliases = copy_string_array((const char**)entry->h_aliases); else aliases = Atom(0); entry_h_length = entry->h_length; #ifdef h_addr addr_list = alloc_array(alloc_one_addr, (const char**)entry->h_addr_list); #else adr = alloc_one_addr(entry->h_addr); addr_list = alloc_small(1, 0); Field(addr_list, 0) = adr; #endif res = alloc_small(4, 0); Field(res, 0) = name; Field(res, 1) = aliases; switch (entry->h_addrtype) { case PF_UNIX: Field(res, 2) = Val_int(0); break; case PF_INET: Field(res, 2) = Val_int(1); break; default: /*PF_INET6 */ Field(res, 2) = Val_int(2); break; } Field(res, 3) = addr_list; End_roots(); return res; }
static void store_in_job(value job_v) { value adr = Val_unit; value addr_list = Val_unit; int i; /* printf("store_in_job %d\n", job_naddresses); */ Begin_roots3 (job_v, addr_list, adr); #ifdef h_addr addr_list = alloc_small(job_naddresses, 0); for(i=0; i<job_naddresses; i++){ adr = alloc_one_addr(ip_job_result + i * entry_h_length); modify(&Field(addr_list,i), adr); } #else adr = alloc_one_addr(ip_job_result); addr_list = alloc_small(1, 0); Field(addr_list, 0) = adr; #endif /* h_addr */ modify(&Field(job_v,1), addr_list); End_roots(); }