mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-08-03 16:30:29 +00:00
Attempt to get the siocgifconf_nt to work using the GetAdaptersAddresses, unsuccessful so far
This commit is contained in:
parent
3929d7c726
commit
b9b1e4f3b5
5 changed files with 117 additions and 10 deletions
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue