44
44
# include <Ws2tcpip.h>
45
45
# include <iphlpapi.h>
46
46
#else
47
+ # ifdef HAVE_SYS_IOCTL_H
48
+ # define BSD_COMP 1
49
+ # include <sys/ioctl.h>
50
+ # include <fcntl.h>
51
+ # endif
47
52
# include <netdb.h>
48
53
#endif
49
54
55
+ #ifndef PHP_WIN32
56
+ static zend_result net_get_mtu (char * ifname , zend_long * mtu )
57
+ {
58
+ #ifdef SIOCGIFMTU
59
+ struct ifreq ifr = {0 };
60
+ zend_result status = FAILURE ;
61
+ #ifndef __sun
62
+ int local = socket (AF_UNIX , SOCK_DGRAM , 0 );
63
+ #else
64
+ int local = open ("/dev/ip" , O_RDONLY );
65
+ #endif
66
+ if (local == -1 ) {
67
+ return FAILURE ;
68
+ }
69
+
70
+ strlcpy (ifr .ifr_name , ifname , IFNAMSIZ );
71
+ if (ioctl (local , SIOCGIFMTU , & ifr ) < 0 ) {
72
+ goto end ;
73
+ }
74
+
75
+ // TODO: a tad harder but mac address could be obtained
76
+ // in the same movement.
77
+
78
+ * mtu = (zend_long )ifr .ifr_mtu ;
79
+ status = SUCCESS ;
80
+ end :
81
+ close (local );
82
+ return status ;
83
+ #else
84
+ return FAILURE ;
85
+ #endif
86
+ }
87
+ #endif
88
+
50
89
PHPAPI zend_string * php_inet_ntop (const struct sockaddr * addr ) {
51
90
socklen_t addrlen = sizeof (struct sockaddr_in );
52
91
@@ -274,7 +313,7 @@ PHP_FUNCTION(net_get_interfaces) {
274
313
array_init (return_value );
275
314
for (p = addrs ; p ; p = p -> ifa_next ) {
276
315
zval * iface = zend_hash_str_find (Z_ARR_P (return_value ), p -> ifa_name , strlen (p -> ifa_name ));
277
- zval * unicast , * status ;
316
+ zval * unicast , * status , * mtu ;
278
317
279
318
if (!iface ) {
280
319
zval newif ;
@@ -298,6 +337,13 @@ PHP_FUNCTION(net_get_interfaces) {
298
337
if (!status ) {
299
338
add_assoc_bool (iface , "up" , ((p -> ifa_flags & IFF_UP ) != 0 ));
300
339
}
340
+ mtu = zend_hash_str_find (Z_ARR_P (iface ), "mtu" , sizeof ("mtu" ) - 1 );
341
+ if (!mtu ) {
342
+ zend_long val ;
343
+ if (net_get_mtu (p -> ifa_name , & val ) == SUCCESS ) {
344
+ add_assoc_long (iface , "mtu" , val );
345
+ }
346
+ }
301
347
}
302
348
303
349
freeifaddrs (addrs );
0 commit comments