# HG changeset patch # User Bruno Haible # Date 1322917754 -3600 # Node ID b5b93138d21d34bcf2d6e131332a6840c5933689 # Parent 5c82a0f82eef3be520206b3017de29c13ac14f3b Tweak last commit. * lib/sethostname.c: Don't include . (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. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2011-12-03 Bruno Haible + + Tweak last commit. + * lib/sethostname.c: Don't include . + (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 New module 'sethostname'. diff --git a/doc/glibc-functions/sethostname.texi b/doc/glibc-functions/sethostname.texi --- 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: diff --git a/lib/sethostname.c b/lib/sethostname.c --- a/lib/sethostname.c +++ b/lib/sethostname.c @@ -26,7 +26,6 @@ #include #include -#include #include /* 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 diff --git a/m4/sethostname.m4 b/m4/sethostname.m4 --- a/m4/sethostname.m4 +++ b/m4/sethostname.m4 @@ -6,13 +6,13 @@ # Ensure # - the sethostname() function, +# - the HOST_NAME_MAX macro in . 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 diff --git a/modules/sethostname b/modules/sethostname --- a/modules/sethostname +++ b/modules/sethostname @@ -22,8 +22,6 @@ Include: -Link: - License: LGPLv2+