windows get adapters

This commit is contained in:
Jeff Harris 2025-05-03 08:57:29 +12:00
parent ca8120a00f
commit 3cf40e248a
2 changed files with 62 additions and 1 deletions

@ -1 +1 @@
Subproject commit 700d071d0ff784d83105f03e521c0e1b135971f5
Subproject commit 89861762c3e0743eed484ef5dace8e882ecd1289

View File

@ -1,5 +1,10 @@
// Based on https://gist.github.com/jvranish/4441299
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
// this has to be first
#include <windows.h>
//
@ -16,6 +21,11 @@
#include <stdio.h> /* errno_t, FILE, fgets, fopen_s, fprintf*/
#include <stdlib.h> /* _splitpath */
#include <string.h> /* strcpy, strerror, strlen, strrchr */
#include <wchar.h>
#include <locale.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#ifndef F_OK
#define F_OK 0
@ -391,3 +401,54 @@ char* OS_Basename(const char* path) {
char* OS_GetWorkingDirectory(char* argv0) {
return OS_Dirname(argv0);
}
int OS_GetAdapaterAddress(char* name, void* pSockaddr_in) {
DWORD ret, bufLen = 15000;
IP_ADAPTER_ADDRESSES* adapter_addrs = (IP_ADAPTER_ADDRESSES*)malloc(bufLen);
int found = 0;
if (!adapter_addrs) {
fprintf(stderr, "Memory allocation failed.\n");
return 0;
}
// Convert input name to wide char
wchar_t wideName[256] = { 0 };
if (name && strlen(name) > 0) {
mbstowcs(wideName, name, sizeof(wideName) / sizeof(wideName[0]) - 1);
}
ret = GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, adapter_addrs, &bufLen);
if (ret == ERROR_BUFFER_OVERFLOW) {
free(adapter_addrs);
adapter_addrs = (IP_ADAPTER_ADDRESSES*)malloc(bufLen);
if (!adapter_addrs)
return 0;
ret = GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, adapter_addrs, &bufLen);
}
if (ret != NO_ERROR) {
free(adapter_addrs);
return 0;
}
for (IP_ADAPTER_ADDRESSES* aa = adapter_addrs; aa != NULL; aa = aa->Next) {
LOG_DEBUG("name: %s", aa->FriendlyName); // Skip if name is provided and doesn't match FriendlyName
if (wcslen(wideName) > 0 && wcscmp(aa->FriendlyName, wideName) != 0)
continue;
for (IP_ADAPTER_UNICAST_ADDRESS* ua = aa->FirstUnicastAddress; ua != NULL; ua = ua->Next) {
if (ua->Address.lpSockaddr->sa_family == AF_INET) {
struct sockaddr_in* sa_in = (struct sockaddr_in*)ua->Address.lpSockaddr;
*((struct sockaddr_in*)pSockaddr_in) = *sa_in;
found = 1;
goto cleanup;
}
}
}
cleanup:
free(adapter_addrs);
return found;
}