From b0dd94b504a1928751a7dfc839084868d315c517 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 21 Jun 2024 14:26:12 +0100 Subject: [PATCH] standard/net: even field a bit more with windows by adding interface's MTU data. --- ext/standard/net.c | 48 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/ext/standard/net.c b/ext/standard/net.c index 80a6541bf60f..53f13dee643e 100644 --- a/ext/standard/net.c +++ b/ext/standard/net.c @@ -44,9 +44,48 @@ # include # include #else +# ifdef HAVE_SYS_IOCTL_H +# define BSD_COMP 1 +# include +# include +# endif # include #endif +#ifndef PHP_WIN32 +static zend_result net_get_mtu(char *ifname, zend_long *mtu) +{ +#ifdef SIOCGIFMTU + struct ifreq ifr = {0}; + zend_result status = FAILURE; +#ifndef __sun + int local = socket(AF_UNIX, SOCK_DGRAM, 0); +#else + int local = open("/dev/ip", O_RDONLY); +#endif + if (local == -1) { + return FAILURE; + } + + strlcpy(ifr.ifr_name, ifname, IFNAMSIZ); + if (ioctl(local, SIOCGIFMTU, &ifr) < 0) { + goto end; + } + +// TODO: a tad harder but mac address could be obtained +// in the same movement. + + *mtu = (zend_long)ifr.ifr_mtu; + status = SUCCESS; +end: + close(local); + return status; +#else + return FAILURE; +#endif +} +#endif + PHPAPI zend_string* php_inet_ntop(const struct sockaddr *addr) { socklen_t addrlen = sizeof(struct sockaddr_in); @@ -274,7 +313,7 @@ PHP_FUNCTION(net_get_interfaces) { array_init(return_value); for (p = addrs; p; p = p->ifa_next) { zval *iface = zend_hash_str_find(Z_ARR_P(return_value), p->ifa_name, strlen(p->ifa_name)); - zval *unicast, *status; + zval *unicast, *status, *mtu; if (!iface) { zval newif; @@ -298,6 +337,13 @@ PHP_FUNCTION(net_get_interfaces) { if (!status) { add_assoc_bool(iface, "up", ((p->ifa_flags & IFF_UP) != 0)); } + mtu = zend_hash_str_find(Z_ARR_P(iface), "mtu", sizeof("mtu") - 1); + if (!mtu) { + zend_long val; + if (net_get_mtu(p->ifa_name, &val) == SUCCESS) { + add_assoc_long(iface, "mtu", val); + } + } } freeifaddrs(addrs);