changeset 16145:b5b93138d21d

Tweak last commit. * lib/sethostname.c: Don't include <string.h>. (sethostname): No need to copy the argument string to the stack. Don't call clearerr. Preserve errno when fprintf failed. * m4/sethostname.m4 (gl_FUNC_SETHOSTNAME): Comment about HOST_NAME_MAX. Don't invoke AC_REPLACE_FUNCS. * modules/sethostname (Link): Remove empty section. * doc/glibc-functions/sethostname.texi: Gnulib does not fix the ENOSYS failure problem.
author Bruno Haible <bruno@clisp.org>
date Sat, 03 Dec 2011 14:09:14 +0100
parents 5c82a0f82eef
children caaefe18d91b
files ChangeLog doc/glibc-functions/sethostname.texi lib/sethostname.c m4/sethostname.m4 modules/sethostname
diffstat 5 files changed, 26 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2011-12-03  Bruno Haible  <bruno@clisp.org>
+
+	Tweak last commit.
+	* lib/sethostname.c: Don't include <string.h>.
+	(sethostname): No need to copy the argument string to the stack. Don't
+	call clearerr. Preserve errno when fprintf failed.
+	* m4/sethostname.m4 (gl_FUNC_SETHOSTNAME): Comment about HOST_NAME_MAX.
+	Don't invoke AC_REPLACE_FUNCS.
+	* modules/sethostname (Link): Remove empty section.
+	* doc/glibc-functions/sethostname.texi: Gnulib does not fix the ENOSYS
+	failure problem.
+
 2011-12-01  Ben Walton  <bwalton@artsci.utoronto.ca>
 
 	New module 'sethostname'.
--- a/doc/glibc-functions/sethostname.texi
+++ b/doc/glibc-functions/sethostname.texi
@@ -9,6 +9,7 @@
 @item
 This function is missing on some platforms:
 Minix 3.1.8, Cygwin, mingw, MSVC 9, Interix 3.5, BeOS.
+Note that the Gnulib replacement may fail with ENOSYS on some platforms.
 @item
 This function is not declared on some platforms:
 AIX 7.1, OSF/1 5.1, Solaris 10.
@@ -16,8 +17,6 @@
 On Solaris 10, the first argument is @code{char *} instead of
 @code{const char *} and the second parameter is @code{int} instead of
 @code{size_t}.
-@item
-On some platforms the Gnulib replacement always fails with ENOSYS.
 @end itemize
 
 Portability problems not fixed by Gnulib:
--- a/lib/sethostname.c
+++ b/lib/sethostname.c
@@ -26,7 +26,6 @@
 
 #include <errno.h>
 #include <stdio.h>
-#include <string.h>
 #include <limits.h>
 
 /* Set up to LEN chars of NAME as system hostname.
@@ -43,12 +42,6 @@
       return -1;
     }
 
-  /* NAME does not need to be null terminated so leave room to terminate
-     regardless of input. */
-  char hostname[HOST_NAME_MAX + 1];
-  memcpy ((void *) hostname, (const void *) name, len);
-  hostname[len] = '\0';
-
 #ifdef __minix /* Minix */
   {
     FILE *hostf;
@@ -63,24 +56,28 @@
       r = -1;
     else
       {
-        fprintf (hostf, "%s\n", hostname);
+        fprintf (hostf, "%.*s\n", (int) len, name);
         if (ferror (hostf))
           {
-            clearerr (hostf);
+            /* Close hostf, preserving the errno from the fprintf call.  */
+            int saved_errno = errno;
+            fclose (hostf);
+            errno = saved_errno;
             r = -1;
           }
-
-        /* use return value of fclose for function return value as it
-           matches our needs.  fclose will also set errno on
-           failure */
-        r = fclose (hostf);
+        else
+          {
+            if (fclose (hostf))
+              /* fclose sets errno on failure.  */
+              r = -1;
+          }
       }
 
     return r;
   }
 #else
   /* For platforms that we don't have a better option for, simply bail
-     out */
+     out.  */
   errno = ENOSYS;
   return -1;
 #endif
--- a/m4/sethostname.m4
+++ b/m4/sethostname.m4
@@ -6,13 +6,13 @@
 
 # Ensure
 # - the sethostname() function,
+# - the HOST_NAME_MAX macro in <limits.h>.
 AC_DEFUN([gl_FUNC_SETHOSTNAME],
 [
   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
 
   gl_PREREQ_HOST_NAME_MAX
 
-  AC_REPLACE_FUNCS([sethostname])
   AC_CHECK_FUNCS([sethostname])
   if test $ac_cv_func_sethostname = no; then
     HAVE_SETHOSTNAME=0
--- a/modules/sethostname
+++ b/modules/sethostname
@@ -22,8 +22,6 @@
 Include:
 <unistd.h>
 
-Link:
-
 License:
 LGPLv2+