diff --git a/libc/calls/calls.mk b/libc/calls/calls.mk index 7c14e3c42..0e31c8da9 100644 --- a/libc/calls/calls.mk +++ b/libc/calls/calls.mk @@ -43,6 +43,8 @@ LIBC_CALLS_A_DIRECTDEPS = \ LIBC_NT_ADVAPI32 \ LIBC_NT_KERNEL32 \ LIBC_NT_NTDLL \ + LIBC_NT_WS2_32 \ + LIBC_NT_IPHLPAPI \ LIBC_STR \ LIBC_STUBS \ LIBC_SYSV_CALLS \ diff --git a/libc/calls/ioctl-siocgifconf-nt.c b/libc/calls/ioctl-siocgifconf-nt.c index 84df151be..ba9b6f8c4 100644 --- a/libc/calls/ioctl-siocgifconf-nt.c +++ b/libc/calls/ioctl-siocgifconf-nt.c @@ -16,20 +16,102 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/bits/weaken.h" #include "libc/calls/calls.h" #include "libc/calls/internal.h" #include "libc/sysv/consts/o.h" +#include "libc/sysv/consts/af.h" #include "libc/sock/sock.h" #include "libc/sock/internal.h" #include "libc/sysv/errfuns.h" #include "libc/nt/winsock.h" +#include "libc/nt/errors.h" // TODO: Remove me -//#include "libc/stdio/stdio.h" +#include "libc/bits/weaken.h" +#include "libc/stdio/stdio.h" +#define PRINTF weaken(printf) #define MAX_INTERFACES 32 +#if 1 + +#define GAA_FLAG_SKIP_UNICAST 0x0001 +#define GAA_FLAG_SKIP_ANYCAST 0x0002 +#define GAA_FLAG_SKIP_MULTICAST 0x0004 +#define GAA_FLAG_SKIP_DNS_SERVER 0x0008 +#define GAA_FLAG_INCLUDE_PREFIX 0x0010 +#define GAA_FLAG_SKIP_FRIENDLY_NAME 0x0020 +#define GAA_FLAG_INCLUDE_WINS_INFO 0x0040 +#define GAA_FLAG_INCLUDE_GATEWAYS 0x0080 +#define GAA_FLAG_INCLUDE_ALL_INTERFACES 0x0100 +#define GAA_FLAG_INCLUDE_ALL_COMPARTMENTS 0x0200 +#define GAA_FLAG_INCLUDE_TUNNEL_BINDINGORDER 0x0400 +#define GAA_FLAG_SKIP_DNS_INFO 0x0800 + +typedef struct _IP_ADAPTER_ADDRESSES_XP { + union { + uint64_t Alignment; + struct { + uint32_t Length; + uint32_t IfIndex; + }; + }; + struct _IP_ADAPTER_ADDRESSES_XP *Next; + char * AdapterName; + void * FirstUnicastAddress; + void * FirstAnycastAddress; + void * FirstMulticastAddress; + void * FirstDnsServerAddress; + wchar_t *DnsSuffix; + wchar_t *Description; + wchar_t *FriendlyName; + /* Filler */ +} IP_ADAPTER_ADDRESSES_XP, *PIP_ADAPTER_ADDRESSES_XP; + +extern unsigned long GetAdaptersAddresses( + uint32_t Family, + uint32_t Flags, + void * Reserved, + char *AdapterAddresses, + uint32_t *SizePointer); + +textwindows int ioctl_siocgifconf_nt(int fd, struct ifconf *ifc) { + uint32_t rv, size; + char * adapter_addresses; + struct _IP_ADAPTER_ADDRESSES_XP *aa; + + PRINTF("FABDEBUG> ioctl(SIOCGIFCONF) for Windows... printf=%p, GetAdaptersAddresses=%p\n", weaken(printf), weaken(GetAdaptersAddresses)); + if (!weaken(GetAdaptersAddresses)) { + PRINTF("FABDEBUG> NULL GetAdaptersAddresses\n"); + return enomem(); + } + rv = weaken(GetAdaptersAddresses)(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &size); + if (rv != kNtErrorBufferOverflow) { + PRINTF("FABDEBUG> GetAdaptersAddresses failed %d\n", WSAGetLastError()); + return ebadf(); + } + PRINTF("FABDEBUG> size=%lu\n", size); + + adapter_addresses = (char *)weaken(malloc)(size); + if (!adapter_addresses) { + return enomem(); + } + + rv = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, adapter_addresses, &size); + if (rv != kNtErrorSuccess) { + PRINTF("FABDEBUG> GetAdaptersAddresses failed %d\n", WSAGetLastError()); + weaken(free)(adapter_addresses); + return efault(); + } + + for (aa = (struct _IP_ADAPTER_ADDRESSES_XP *)adapter_addresses; aa != NULL; aa = aa->Next) { + PRINTF("FABDEBUG> Adapter name = %s", aa->AdapterName); + } + weaken(free)(adapter_addresses); + + return 0; +} +#else /* Reference: * - Description of ioctls: https://docs.microsoft.com/en-us/windows/win32/winsock/winsock-ioctls * - Structure INTERFACE_INFO: https://docs.microsoft.com/en-us/windows/win32/api/ws2ipdef/ns-ws2ipdef-interface_info @@ -47,18 +129,19 @@ textwindows int ioctl_siocgifconf_nt(int fd, struct ifconf *ifc) { return ebadf(); } - ret = weaken(WSAIoctl)(g_fds.p[fd].handle, kNtSioGetInterfaceList, NULL, 0, &iflist, sizeof(iflist), &dwBytes, NULL, NULL); + ret = WSAIoctl(g_fds.p[fd].handle, kNtSioGetInterfaceList, NULL, 0, &iflist, sizeof(iflist), &dwBytes, NULL, NULL); if (ret == -1) { + PRINTF("FABDEBUG> WSAIoctl failed %d\n", WSAGetLastError()); return weaken(__winsockerr)(); } + PRINTF("FABDEBUG> WSAIoctl success\n"); count = dwBytes / sizeof(struct NtInterfaceInfo); - /* - printf("CI> SIO_GET_INTERFACE_LIST success:\n"); + PRINTF("CI> SIO_GET_INTERFACE_LIST success:\n"); for (i = 0; i < count; ++i) { - printf("CI>\t #i: %08x\n", i, iflist[i].iiAddress.sin_addr.s_addr); + PRINTF("CI>\t #i: addr=%08x, flags=%08x, bcast=%08x\n", i, iflist[i].iiAddress.sin_addr.s_addr, iflist[i].iiFlags, iflist[i].iiBroadcastAddress.sin_addr.s_addr); } - */ return ret; } +#endif diff --git a/libc/calls/ioctl-siocgifconf.c b/libc/calls/ioctl-siocgifconf.c index 131ecf373..c8c5d5222 100644 --- a/libc/calls/ioctl-siocgifconf.c +++ b/libc/calls/ioctl-siocgifconf.c @@ -35,7 +35,7 @@ int ioctl_default(int, uint64_t, void *) hidden; int ioctl_siocgifconf_nt(int, struct ifconf *) hidden; -int ioctl_siocgifaddr_nt(int, struct ifconf *) hidden; +//int ioctl_siocgifaddr_nt(int, struct ifconf *) hidden; static int ioctl_siocgifconf_sysv(int fd, struct ifconf *ifc) { if (IsBsd()) { @@ -123,8 +123,7 @@ int ioctl_siocgifconf(int fd, void *ifc) { if (!IsWindows()) { return ioctl_siocgifconf_sysv(fd, (struct ifconf *)ifc); } else { - return enotsup(); - //return ioctl_siocgifconf_nt(fd, ifc); + return ioctl_siocgifconf_nt(fd, ifc); } } diff --git a/libc/nt/master.sh b/libc/nt/master.sh index d4257064b..8d6260545 100755 --- a/libc/nt/master.sh +++ b/libc/nt/master.sh @@ -7797,3 +7797,5 @@ imp 'ReleaseSRWLockExclusive' ReleaseSRWLockExclusive kernel32 0 1 # Kern imp 'ReleaseSRWLockShared' ReleaseSRWLockShared kernel32 0 1 # KernelBase imp 'TryAcquireSRWLockExclusive' TryAcquireSRWLockExclusive kernel32 0 1 # KernelBase imp 'TryAcquireSRWLockShared' TryAcquireSRWLockShared kernel32 0 1 # KernelBase + +imp 'GetAdaptersAddresses' GetAdaptersAddresses iphlpapi 67 5 diff --git a/libc/nt/nt.mk b/libc/nt/nt.mk index dfb10d2b7..c1687aa4d 100644 --- a/libc/nt/nt.mk +++ b/libc/nt/nt.mk @@ -252,6 +252,27 @@ $(LIBC_NT_WS2_32_A).pkg: \ #─────────────────────────────────────────────────────────────────────────────── +LIBC_NT_ARTIFACTS += LIBC_NT_IPHLPAPI_A +LIBC_NT_IPHLPAPI = $(LIBC_NT_IPHLPAPI_A_DEPS) $(LIBC_NT_IPHLPAPI_A) +LIBC_NT_IPHLPAPI_A = o/$(MODE)/libc/nt/iphlpapi.a +LIBC_NT_IPHLPAPI_A_SRCS := $(wildcard libc/nt/iphlpapi/*.s) +LIBC_NT_IPHLPAPI_A_OBJS = $(LIBC_NT_IPHLPAPI_A_SRCS:%.s=o/$(MODE)/%.o) +LIBC_NT_IPHLPAPI_A_CHECKS = $(LIBC_IPHLPAPI_32_A).pkg +LIBC_NT_IPHLPAPI_A_DIRECTDEPS = LIBC_NT_KERNEL32 +LIBC_NT_IPHLPAPI_A_DEPS := \ + $(call uniq,$(foreach x,$(LIBC_NT_IPHLPAPI_A_DIRECTDEPS),$($(x)))) + +$(LIBC_NT_IPHLPAPI_A): \ + libc/nt/iphlpapi/ \ + $(LIBC_NT_IPHLPAPI_A).pkg \ + $(LIBC_NT_IPHLPAPI_A_OBJS) + +$(LIBC_NT_IPHLPAPI_A).pkg: \ + $(LIBC_NT_IPHLPAPI_A_OBJS) \ + $(foreach x,$(LIBC_NT_IPHLPAPI_A_DIRECTDEPS),$($(x)_A).pkg) + +#─────────────────────────────────────────────────────────────────────────────── + LIBC_NT_ARTIFACTS += LIBC_NT_MSWSOCK_A LIBC_NT_MSWSOCK = $(LIBC_NT_MSWSOCK_A_DEPS) $(LIBC_NT_MSWSOCK_A) LIBC_NT_MSWSOCK_A = o/$(MODE)/libc/nt/MsWSock.a