From: Michael Tokarev Date: Tue, 17 Dec 2013 18:13:45 +0000 (+0100) Subject: hostname: do not use gethostbyname() for "hostname -s" X-Git-Tag: 1_22_0~8 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=e9355c43263efd8f9b31b83c4e2aeba4a82de75e;p=oweals%2Fbusybox.git hostname: do not use gethostbyname() for "hostname -s" 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 Signed-off-by: Denys Vlasenko --- diff --git a/networking/hostname.c b/networking/hostname.c index d2516b5fb..b3e352242 100644 --- a/networking/hostname.c +++ b/networking/hostname.c @@ -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);