[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