68 lines
1.7 KiB
C++
68 lines
1.7 KiB
C++
#include "hardware/clocks.h"
|
|
#include "lwip/ip_addr.h"
|
|
#include "nlohmann/json.hpp"
|
|
#include "pico/cyw43_arch.h"
|
|
#include "pico/util/datetime.h"
|
|
#include <lwip/arch.h>
|
|
#include "lwipopts.h"
|
|
|
|
#include "lwip/dns.h"
|
|
#include "lwip/sys.h"
|
|
#include "lwip/err.h"
|
|
|
|
|
|
#include "lwip/timeouts.h"
|
|
|
|
typedef struct {
|
|
volatile bool done;
|
|
ip_addr_t addr;
|
|
bool success;
|
|
} dns_blocking_result_t;
|
|
|
|
static void blocking_dns_callback(const char *name, const ip_addr_t *ipaddr, void *arg) {
|
|
dns_blocking_result_t *result = (dns_blocking_result_t *)arg;
|
|
if (ipaddr != NULL) {
|
|
result->addr = *ipaddr;
|
|
result->success = true;
|
|
} else {
|
|
result->success = false;
|
|
}
|
|
result->done = true;
|
|
}
|
|
|
|
// Function to synchronously resolve DNS hostname to IP
|
|
// Returns true if resolved, false otherwise
|
|
bool dns_resolve_sync(const char *hostname, ip_addr_t *resolved_ip, uint32_t timeout_ms) {
|
|
dns_blocking_result_t result = {0};
|
|
uint32_t start_time = sys_now();
|
|
|
|
err_t err = dns_gethostbyname(hostname, &result.addr, blocking_dns_callback, &result);
|
|
|
|
if (err == ERR_OK) {
|
|
// Already resolved from cache
|
|
*resolved_ip = result.addr;
|
|
return true;
|
|
} else if (err == ERR_INPROGRESS) {
|
|
// Wait for resolution with timeout
|
|
while (!result.done) {
|
|
if (timeout_ms > 0 && (sys_now() - start_time) > timeout_ms) {
|
|
return false; // Timeout
|
|
}
|
|
sys_check_timeouts();
|
|
// Sleep or delay depends on your platform
|
|
sys_msleep(10);
|
|
}
|
|
|
|
if (result.success) {
|
|
*resolved_ip = result.addr;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false; // Failed
|
|
}
|
|
|
|
extern "C" u32_t lwip_rand(void) {
|
|
return get_rand_32();
|
|
}
|