
6 Jun
2024
6 Jun
'24
2:19 p.m.
On 6/6/24 08:29, Ilias Apalodimas wrote:
Hi Jerome,
[...]
+static ulong start; +static ip_addr_t host_ipaddr; +static bool done;
+static void do_dns_tmr(void *arg) +{
dns_tmr();
+}
+static void dns_cb(const char *name, const ip_addr_t *ipaddr, void *arg) +{
char *var = (char *)arg;
const char *
Fixed in v3.
char *ipstr = ip4addr_ntoa(ipaddr);
done = true;
if (!ipaddr) {
printf("DNS: host not found\n");
host_ipaddr.addr = 0;
return;
}
if (var)
env_set(var, ipstr);
printf("%s\n", ipstr);
+}
+int do_dns(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) +{
bool has_server = false;
ip_addr_t ipaddr;
ip_addr_t ns;
char *nsenv;
char *name;
char *var;
int ret;
if (argc == 1 || argc > 3)
return CMD_RET_USAGE;
if (argc >= 2)
name = argv[1];
if (argc == 3)
var = argv[2];
dns_init();
nsenv = env_get("dnsip");
if (nsenv && ipaddr_aton(nsenv, &ns)) {
dns_setserver(0, &ns);
has_server = true;
}
nsenv = env_get("dnsip2");
if (nsenv && ipaddr_aton(nsenv, &ns)) {
dns_setserver(1, &ns);
has_server = true;
}
if (!has_server) {
log_err("No valid name server (dnsip/dnsip2)\n");
return CMD_RET_FAILURE;
}
done = false;
ret = dns_gethostbyname(name, &ipaddr, dns_cb, var);
if (ret == ERR_OK) {
dns_cb(name, &ipaddr, var);
} else if (ret == ERR_INPROGRESS) {
start = get_timer(0);
sys_timeout(DNS_RESEND_MS, do_dns_tmr, NULL);
do {
eth_rx();
if (done)
break;
sys_check_timeouts();
if (ctrlc()) {
printf("\nAbort\n");
break;
}
} while (get_timer(start) < DNS_TIMEOUT_MS);
sys_untimeout(do_dns_tmr, NULL);
}
Looking at the lwip code there are other ret values than just ERR_OK, ERR_INPROGRESS. Should we have an 'else' handling the rest?
Not needed, since in this case we will reach the next line 'if (done && host_ipaddr.addr != 0)' which is the true success condition.
Thanks,
--
Jerome