gethostname.c: change to report ENAMETOOLONG error when buflen is less

change to behaviour the same as glibc for the check about buflen

Change-Id: I98265a8fe441df6fed2527686f89b087364ca53d
Signed-off-by: Yongqin Liu <yongqin.liu@linaro.org>
diff --git a/libc/Android.mk b/libc/Android.mk
index 893738a..345a1f3 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -43,7 +43,6 @@
     bionic/ether_aton.c \
     bionic/ether_ntoa.c \
     bionic/fts.c \
-    bionic/gethostname.c \
     bionic/getpriority.c \
     bionic/if_indextoname.c \
     bionic/if_nametoindex.c \
@@ -120,6 +119,7 @@
     bionic/getauxval.cpp \
     bionic/getcwd.cpp \
     bionic/getentropy_linux.c \
+    bionic/gethostname.cpp \
     bionic/getpgrp.cpp \
     bionic/getpid.cpp \
     bionic/gettid.cpp \
diff --git a/libc/bionic/gethostname.c b/libc/bionic/gethostname.cpp
similarity index 78%
rename from libc/bionic/gethostname.c
rename to libc/bionic/gethostname.cpp
index 5d3d7d9..962fea1 100644
--- a/libc/bionic/gethostname.c
+++ b/libc/bionic/gethostname.cpp
@@ -25,27 +25,24 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
+
 #include <errno.h>
-#include <unistd.h>
 #include <string.h>
 #include <sys/utsname.h>
+#include <unistd.h>
 
-int gethostname(char*  buff, size_t  buflen)
-{
-    struct utsname  name;
-    int             result = 0;
+int gethostname(char* buf, size_t n) {
+  struct utsname name;
+  if (uname(&name) == -1) {
+    return -1;
+  }
 
-    result = uname(&name);
-    if (result != -1)
-    {
-        int  namelen = strlen(name.nodename);
+  size_t name_length = static_cast<size_t>(strlen(name.nodename) + 1);
+  if (name_length > n) {
+    errno = ENAMETOOLONG;
+    return -1;
+  }
 
-        if ((int)buflen < namelen+1) {
-            errno = EINVAL;
-            result = -1;
-        } else {
-            memcpy( buff, name.nodename, namelen+1 );
-        }
-    }
-    return result;
+  memcpy(buf, name.nodename, name_length);
+  return 0;
 }
diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp
index a5b92f8..19d4017 100644
--- a/tests/unistd_test.cpp
+++ b/tests/unistd_test.cpp
@@ -482,21 +482,23 @@
 
 TEST(unistd, gethostname) {
   char hostname[HOST_NAME_MAX + 1];
-
   memset(hostname, 0, sizeof(hostname));
 
+  // Can we get the hostname with a big buffer?
   ASSERT_EQ(0, gethostname(hostname, HOST_NAME_MAX));
+
+  // Can we get the hostname with a right-sized buffer?
+  errno = 0;
+  ASSERT_EQ(0, gethostname(hostname, strlen(hostname) + 1));
+
+  // Does uname(2) agree?
   utsname buf;
   ASSERT_EQ(0, uname(&buf));
   ASSERT_EQ(0, strncmp(hostname, buf.nodename, SYS_NMLN));
   ASSERT_GT(strlen(hostname), 0U);
 
+  // Do we correctly detect truncation?
   errno = 0;
   ASSERT_EQ(-1, gethostname(hostname, strlen(hostname)));
   ASSERT_EQ(ENAMETOOLONG, errno);
-
-  errno = 0;
-  ASSERT_EQ(0, gethostname(hostname, -2));
-  ASSERT_EQ(0, errno);
-  GTEST_LOG_(INFO) << "hostname=" << hostname << "\n";
 }