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_group_entry(struct group *entry) { value res; value name = Val_unit, pass = Val_unit, mem = Val_unit; Begin_roots3 (name, pass, mem); name = caml_copy_string(entry->gr_name); pass = caml_copy_string(entry->gr_passwd); mem = caml_copy_string_array((const char**)entry->gr_mem); res = caml_alloc_4(0, name, pass, Val_int(entry->gr_gid), mem); End_roots(); return res; }