* 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-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'.
@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.
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:
#include <errno.h>
#include <stdio.h>
-#include <string.h>
#include <limits.h>
/* Set up to LEN chars of NAME as system hostname.
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;
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
# 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
Include:
<unistd.h>
-Link:
-
License:
LGPLv2+