20#ifdef HAVE_ARPA_INET_H
21# include <arpa/inet.h>
30#elif defined(__PASE__)
32#include <as400_protos.h>
33#define getifaddrs Qp2getifaddrs
34#define freeifaddrs Qp2freeifaddrs
35#define ifaddrs ifaddrs_pase
51 socklen_t addrlen =
sizeof(
struct sockaddr_in);
55 switch (
addr->sa_family) {
58 zend_string *ret = zend_string_alloc(INET6_ADDRSTRLEN, 0);
59 if (inet_ntop(AF_INET6, &(((struct sockaddr_in6*)addr)->sin6_addr), ZSTR_VAL(ret), INET6_ADDRSTRLEN)) {
60 ZSTR_LEN(ret) = strlen(ZSTR_VAL(ret));
63 zend_string_efree(ret);
68 zend_string *ret = zend_string_alloc(INET_ADDRSTRLEN, 0);
69 if (inet_ntop(AF_INET, &(((struct sockaddr_in*)addr)->sin_addr), ZSTR_VAL(ret), INET_ADDRSTRLEN)) {
70 ZSTR_LEN(ret) = strlen(ZSTR_VAL(ret));
73 zend_string_efree(
ret);
79 switch (
addr->sa_family) {
82 addrlen = sizeof(struct sockaddr_in6);
86 zend_string *ret = zend_string_alloc(NI_MAXHOST, 0);
87 if (getnameinfo(addr, addrlen, ZSTR_VAL(ret), NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == SUCCESS) {
89 char *colon = strchr(ZSTR_VAL(ret),
'%');
90 if (colon) { *colon = 0; }
91 ZSTR_LEN(ret) = strlen(ZSTR_VAL(ret));
94 zend_string_efree(ret);
102#if defined(PHP_WIN32) || defined(HAVE_GETIFADDRS) || defined(__PASE__)
104 struct sockaddr *
addr,
struct sockaddr *netmask,
105 struct sockaddr *broadcast,
struct sockaddr *ptp) {
110 add_assoc_long(&
u,
"flags",
flags);
113 add_assoc_long(&
u,
"family",
addr->sa_family);
115 add_assoc_str(&
u,
"address", host);
119 add_assoc_str(&
u,
"netmask", host);
123 add_assoc_str(&
u,
"broadcast", host);
127 add_assoc_str(&
u,
"ptp", host);
130 add_next_index_zval(unicast, &
u);
153# define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
154# define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
155 ULONG family = AF_UNSPEC;
156 ULONG
flags = GAA_FLAG_INCLUDE_PREFIX;
157 PIP_ADAPTER_ADDRESSES pAddresses =
NULL,
p;
158 PIP_ADAPTER_UNICAST_ADDRESS
u =
NULL;
166 if (GetAdaptersAddresses(family,
flags,
NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW) {
168 pAddresses = (IP_ADAPTER_ADDRESSES *)
MALLOC(outBufLen);
171 if (pAddresses ==
NULL) {
176 dwRetVal = GetAdaptersAddresses(family,
flags,
NULL, pAddresses, &outBufLen);
178 if (NO_ERROR != dwRetVal) {
187 for (
p = pAddresses;
p;
p =
p->Next) {
190 if ((IF_TYPE_ETHERNET_CSMACD !=
p->IfType) && (IF_TYPE_IEEE80211 !=
p->IfType) && (IF_TYPE_SOFTWARE_LOOPBACK !=
p->IfType)) {
196 if (
p->Description) {
198 memset(tmp, 0,
sizeof(tmp));
199 wcstombs(tmp,
p->Description,
sizeof(tmp));
200 add_assoc_string(&iface,
"description", tmp);
203 if (
p->PhysicalAddressLength > 0) {
204 zend_string *mac = zend_string_alloc(
p->PhysicalAddressLength * 3, 0);
207 for (i = 0; i <
p->PhysicalAddressLength; ++i) {
208 s +=
snprintf(
s, 4,
"%02X:",
p->PhysicalAddress[i]);
212 add_assoc_str(&iface,
"mac", mac);
219 add_assoc_long(&iface,
"mtu",
p->Mtu);
222 for (
u =
p->FirstUnicastAddress;
u;
u =
u->Next) {
223 switch (
u->Address.lpSockaddr->sa_family) {
226 struct sockaddr_in sin_mask;
228 ConvertLengthToIpv4Mask(
u->OnLinkPrefixLength, &mask);
230 sin_mask.sin_addr.s_addr = mask;
232 iface_append_unicast(&unicast,
p->Flags,
233 (
struct sockaddr*)
u->Address.lpSockaddr,
234 (
struct sockaddr*)&sin_mask,
NULL,
NULL);
239 struct sockaddr_in6 sin6_mask;
241 memset(&sin6_mask, 0,
sizeof(sin6_mask));
243 for (i =
u->OnLinkPrefixLength,
j = 0; i > 0; i -= 8, ++
j) {
244 sin6_mask.sin6_addr.s6_addr[
j] = (i >= 8) ? 0xff : ((ULONG)((0xffU << (8 - i)) & 0xffU));
247 iface_append_unicast(&unicast,
p->Flags,
248 (
struct sockaddr*)
u->Address.lpSockaddr,
249 (
struct sockaddr*)&sin6_mask,
NULL,
NULL);
254 add_assoc_zval(&iface,
"unicast", &unicast);
256 add_assoc_bool(&iface,
"up", (
p->OperStatus == IfOperStatusUp));
264#elif defined(HAVE_GETIFADDRS) || defined(__PASE__)
265 struct ifaddrs *addrs =
NULL, *
p;
269 if (getifaddrs(&addrs)) {
275 for (
p = addrs;
p;
p =
p->ifa_next) {
292 iface_append_unicast(unicast,
294 p->ifa_addr,
p->ifa_netmask,
295 (
p->ifa_flags & IFF_BROADCAST) ?
p->ifa_broadaddr :
NULL,
296 (
p->ifa_flags & IFF_POINTOPOINT) ?
p->ifa_dstaddr :
NULL);
299 add_assoc_bool(iface,
"up", ((
p->ifa_flags & IFF_UP) != 0));
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
PHPAPI zend_string * php_inet_ntop(const struct sockaddr *addr)
#define zend_hash_str_add(...)
PHP_WINUTIL_API char * php_win32_error_to_msg(HRESULT error)
PHP_WINUTIL_API void php_win32_error_msg_free(char *msg)
ZEND_API ZEND_COLD void zend_error(int type, const char *format,...)
#define ZEND_PARSE_PARAMETERS_NONE()
ZEND_API zval *ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len)
struct _zend_string zend_string
#define ZEND_UNREACHABLE()