#include "hardware/clocks.h" #include "lwip/ip_addr.h" #include "nlohmann/json.hpp" #include "pico/cyw43_arch.h" #include "pico/util/datetime.h" #include #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(); }