On Monday 09 December 2013 18:56:43 Michael Tokarev wrote:
> There's no reason to call gethostbyname() on the value returned
> by uname() when asked just for a short name of a host.  This may
> also be wrong, when uname is set to one value, but in /etc/hosts
> (or elsewhere) the "canonical" name is different.  This is often
> the case for localhost entry in /etc/hosts:
> 
>   127.0.0.1   localhost       myname
> 
> With this content of /etc/hosts, and uname being set to myname,
> busybox hostname -s will return localhost, while regular
> hostname utility returns myname.
> 
> Fix this by not calling gethostbyname() for the simple `hostname -s'
> use.
> 
> Signed-off-by: Michael Tokarev <m...@tls.msk.ru>
> 
> diff --git a/networking/hostname.c b/networking/hostname.c
> index d2516b5..1e68116 100644
> --- a/networking/hostname.c
> +++ b/networking/hostname.c
> @@ -106,12 +106,13 @@ int hostname_main(int argc UNUSED_PARAM, char **argv)
>               OPT_i = 0x4,
>               OPT_s = 0x8,
>               OPT_F = 0x10,
> -             OPT_dfis = 0xf,
> +             OPT_dfi = 0x7,
>       };
>  
>       unsigned opts;
>       char *buf;
>       char *hostname_str;
> +     char *p;
>  
>  #if ENABLE_LONG_OPTS
>       applet_long_options =
> @@ -134,10 +135,9 @@ int hostname_main(int argc UNUSED_PARAM, char **argv)
>       if (applet_name[0] == 'd') /* dnsdomainname? */
>               opts = OPT_d;
>  
> -     if (opts & OPT_dfis) {
> +     if (opts & OPT_dfi) {
>               /* Cases when we need full hostname (or its part) */
>               struct hostent *hp;
> -             char *p;
>  
>               hp = xgethostbyname(buf);
>               p = strchrnul(hp->h_name, '.');
> @@ -159,6 +159,10 @@ int hostname_main(int argc UNUSED_PARAM, char **argv)
>                               bb_putchar('\n');
>                       }
>               }
> +     } else if (opts & OPT_s) {
> +             p = strchrnul(buf, '.');
> +             *p = '\0';
> +             puts(buf);
>       } else if (opts & OPT_F) {
>               /* Set the hostname */
>               do_sethostname(hostname_str, 1);

Hi,
I cannot reproduce the case you show with busybox hostname
and /etc/hosts on debian 7:

$ echo $HOSTNAME
debian
$ cat /etc/hostname
debian
$ cat /etc/hosts
127.0.0.1 localhost debian
$ hostname
debian
$ hostname -s
debian
$ ./busybox hostname
debian
$ ./busybox hostname -s
debian

Even modifying /etc/hosts makes no difference:

$ echo $HOSTNAME
debian
$ cat /etc/hostname
debian
$ cat /etc/hosts
127.0.0.1 localhost hosts.file.debian
$ hostname
debian
$ hostname -s
debian
$ ./busybox hostname
debian
$ ./busybox hostname -s
debian


So now I'm wondering where "(or elsewhere)" could be?

One interesting difference between busybox's hostname and
real hostname pops up if we change hostname on the fly:
su
hostname prova
debian:/home/tito# hostname
prova
debian:/home/tito# hostname -s
prova
debian:/home/tito# ./busybox hostname
prova
debian:/home/tito# ./busybox hostname -s
hostname: prova: Unknown host

This in fact is fixed by your patch:

debian:~/Desktop/SourceCode/busybox$ ./busybox hostname
prova
debian:~/Desktop/SourceCode/busybox$ ./busybox hostname -s
prova

BTW.: It is better if you attach patches as my or your email client
ate the tabs and the patch doesn't apply cleanly.

Ciao,
Tito





_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to