[En-Nut-Discussion] NutDnsGetHostByName dotted quad hostname
Coleman Brumley
cbrumley at polarsoft.biz
Fri Feb 27 17:06:26 CET 2015
Harald,
Thank you for the feedback.
> This is not fully correct. inet_addr() returns not 0, but INADDR_NONE
> ((uint32_t)-1) in case of an error.
Good catch, thank you.
> Your alternative, calling NutDnsGetResource() first and then
> inet_addr() should be avoided. The latter is a short calculation while
> the first initiates a lengthy DNS query.
You're absolutely correct. The first method is much more efficient. I only
included the latter to allow some precedence in how it was called.
Coleman
> -----Original Message-----
> From: Harald Kipp [mailto:harald.kipp at egnite.de]
> Sent: Friday, February 27, 2015 7:01 AM
> To: cbrumley at polarsoft.biz; Ethernut User Chat (English)
> Subject: Re: [En-Nut-Discussion] NutDnsGetHostByName dotted quad
> hostname
>
> Hi Coleman,
>
> On 24.02.2015 18:14, Coleman Brumley wrote:
> > In working with DNS name resolution recently (4.10.3), I realized that
> > NutDnsGetHostByName doesn't accept hostnames in IPv4 dotted quad
> format.
> >
> > Since gethostbyname() allows it, and the dotted quad format is an
> > accepted hostname per RFC1123, I was thinking it would be nice if
> > NutDnsGetHostByName did the same thing.
>
> Typically I implement my own local gethostbyname() and do not use
> NutDnsGetHostByName() directly. The advantage is, that I have a single
> routine to report any DNS error (see below).
>
>
> > u_long NutDnsGetHostByName(CONST u_char * hostname) {
> > u_long ip=0;
> > ip=inet_addr(hostname);
> > if(ip==0)
> > ip=NutDnsGetResource(hostname, 1);
> > return ip;
> > }
>
> This is not fully correct. inet_addr() returns not 0, but INADDR_NONE
> ((uint32_t)-1) in case of an error.
>
> Your alternative, calling NutDnsGetResource() first and then inet_addr()
> should be avoided. The latter is a short calculation while the first
initiates a
> lengthy DNS query.
>
>
> uint32_t GetHostIp(const char *host)
> {
> uint32_t ip = 0;
>
> if (host && *host) {
> ip = inet_addr(host);
> if (ip == (uint32_t) -1) {
> ip = NutDnsGetHostByName((uint8_t *) host);
> if (ip == 0) {
> syslog(LOG_WARN, "DNS query for %s failed", host);
> }
> }
> }
> return ip;
> }
>
> Anyway, the DNS part has some room for improvements. For example, the
> host name parameter should have been a char pointer, not a pointer to
> uint8_t. I think that this has been a leftover from a general fix.
> Initially Nut/OS defined all strings as u_char, which was a bad decision.
>
> But today's compilers are very picky about signed/unsigned mismatch.
> Changing this now would cause a lot of trouble for existing code.
>
> Regards,
>
> Harald
More information about the En-Nut-Discussion
mailing list