From 4575b55e7769e14d2d88d79ec97e9939c978ed9a Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 21 Jun 2026 19:44:57 +0900 Subject: feat(php-shim): implement gethostbyname() and inet_pton() --- crates/shirabe-php-shim/src/net.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/crates/shirabe-php-shim/src/net.rs b/crates/shirabe-php-shim/src/net.rs index e7ecb18..0ecf5cb 100644 --- a/crates/shirabe-php-shim/src/net.rs +++ b/crates/shirabe-php-shim/src/net.rs @@ -1,13 +1,31 @@ +use std::net::{IpAddr, SocketAddr, ToSocketAddrs}; + pub fn gethostname() -> String { todo!() } -pub fn gethostbyname(_hostname: &str) -> String { - todo!() +// Resolves the first IPv4 address for the host name, mirroring PHP's gethostbyname +// which only ever yields an IPv4 record and returns the unmodified host name on +// failure. +pub fn gethostbyname(hostname: &str) -> String { + match (hostname, 0u16).to_socket_addrs() { + Ok(addrs) => addrs + .filter_map(|addr| match addr { + SocketAddr::V4(v4) => Some(v4.ip().to_string()), + SocketAddr::V6(_) => None, + }) + .next() + .unwrap_or_else(|| hostname.to_string()), + Err(_) => hostname.to_string(), + } } -pub fn inet_pton(_host: &str) -> Option> { - todo!() +pub fn inet_pton(host: &str) -> Option> { + match host.parse::() { + Ok(IpAddr::V4(v4)) => Some(v4.octets().to_vec()), + Ok(IpAddr::V6(v6)) => Some(v6.octets().to_vec()), + Err(_) => None, + } } pub fn http_get_last_response_headers() -> Option> { -- cgit v1.3.1