hostname: do not use gethostbyname() for "hostname -s"
authorMichael Tokarev <mjt@tls.msk.ru>
Tue, 17 Dec 2013 18:13:45 +0000 (19:13 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 17 Dec 2013 18:13:45 +0000 (19:13 +0100)
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 <mjt@tls.msk.ru>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/hostname.c

index d2516b5fb904c6f46e77d534dee78dd4369bdb77..b3e3522426bc8aceee9a9868fc2dfff1928e201f 100644 (file)
@@ -106,7 +106,7 @@ 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;
@@ -134,7 +134,7 @@ 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;
@@ -159,6 +159,9 @@ int hostname_main(int argc UNUSED_PARAM, char **argv)
                                bb_putchar('\n');
                        }
                }
+       } else if (opts & OPT_s) {
+               strchrnul(buf, '.')[0] = '\0';
+               puts(buf);
        } else if (opts & OPT_F) {
                /* Set the hostname */
                do_sethostname(hostname_str, 1);