CAMLprim value unix_inet_addr_of_string(value s) { #if defined(HAS_IPV6) #ifdef _WIN32 CAMLparam1(s); CAMLlocal1(vres); struct addrinfo hints; struct addrinfo * res; int retcode; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_flags = AI_NUMERICHOST; retcode = getaddrinfo(String_val(s), NULL, &hints, &res); if (retcode != 0) failwith("inet_addr_of_string"); switch (res->ai_addr->sa_family) { case AF_INET: { vres = alloc_inet_addr(&((struct sockaddr_in *) res->ai_addr)->sin_addr); break; } case AF_INET6: { vres = alloc_inet6_addr(&((struct sockaddr_in6 *) res->ai_addr)->sin6_addr); break; } default: { freeaddrinfo(res); failwith("inet_addr_of_string"); } } freeaddrinfo(res); CAMLreturn (vres); #else struct in_addr address; struct in6_addr address6; if (inet_pton(AF_INET, String_val(s), &address) > 0) return alloc_inet_addr(&address); else if (inet_pton(AF_INET6, String_val(s), &address6) > 0) return alloc_inet6_addr(&address6); else failwith("inet_addr_of_string"); #endif #elif defined(HAS_INET_ATON) struct in_addr address; if (inet_aton(String_val(s), &address) == 0) failwith("inet_addr_of_string"); return alloc_inet_addr(&address); #else struct in_addr address; address.s_addr = inet_addr(String_val(s)); if (address.s_addr == (uint32) -1) failwith("inet_addr_of_string"); return alloc_inet_addr(&address); #endif }
static value alloc_one_addr(char const *a) { struct in_addr addr; #ifdef HAS_IPV6 struct in6_addr addr6; if (entry_h_length == 16) { memmove(&addr6, a, 16); return alloc_inet6_addr(&addr6); } #endif memmove (&addr, a, 4); return alloc_inet_addr(&addr); }
value alloc_sockaddr(union sock_addr_union * adr /*in*/, socklen_param_type adr_len, int close_on_error) { value res; switch(adr->s_gen.sa_family) { #ifndef _WIN32 case AF_UNIX: { char * path; value n; /* PR#7039: harden against unnamed sockets */ if (adr_len > (char *)&(adr->s_unix.sun_path) - (char *)&(adr->s_unix)) path = adr->s_unix.sun_path; else path = ""; n = copy_string(path); Begin_root (n); res = alloc_small(1, 0); Field(res,0) = n; End_roots(); break; } #endif case AF_INET: { value a = alloc_inet_addr(&adr->s_inet.sin_addr); Begin_root (a); res = alloc_small(2, 1); Field(res,0) = a; Field(res,1) = Val_int(ntohs(adr->s_inet.sin_port)); End_roots(); break; } #ifdef HAS_IPV6 case AF_INET6: { value a = alloc_inet6_addr(&adr->s_inet6.sin6_addr); Begin_root (a); res = alloc_small(2, 1); Field(res,0) = a; Field(res,1) = Val_int(ntohs(adr->s_inet6.sin6_port)); End_roots(); break; } #endif default: if (close_on_error != -1) close (close_on_error); unix_error(EAFNOSUPPORT, "", Nothing); } return res; }
CAMLprim value unix_inet_addr_of_string(value s) { #if defined(HAS_IPV6) struct in_addr address; struct in6_addr address6; if (inet_pton(AF_INET, String_val(s), &address) > 0) return alloc_inet_addr(&address); else if (inet_pton(AF_INET6, String_val(s), &address6) > 0) return alloc_inet6_addr(&address6); else failwith("inet_addr_of_string"); #elif defined(HAS_INET_ATON) struct in_addr address; if (inet_aton(String_val(s), &address) == 0) failwith("inet_addr_of_string"); return alloc_inet_addr(&address); #else struct in_addr address; address.s_addr = inet_addr(String_val(s)); if (address.s_addr == (uint32) -1) failwith("inet_addr_of_string"); return alloc_inet_addr(&address); #endif }