2009-11-11 Eric Blake <ebb9@byu.net>
+ readlink: detect FreeBSD bug
+ * m4/readlink.m4 (gl_FUNC_READLINK): Also detect FreeBSD bug with
+ slash on symlink.
+ * doc/posix-functions/readlink.texi (readlink): Document the bug.
+ * tests/test-readlink.h (test_readlink): Enhance test.
+
symlink: detect FreeBSD bug
* m4/symlink.m4 (gl_FUNC_SYMLINK): Also detect FreeBSD bug with
slash on symlink.
@itemize
@item
Some platforms mistakenly succeed on @code{readlink("link/",buf,len)}:
-Solaris 9.
+FreeBSD 7.2, Solaris 9.
@item
On some platforms, @code{readlink} returns @code{int} instead of
@code{ssize_t}:
-# readlink.m4 serial 7
+# readlink.m4 serial 8
dnl Copyright (C) 2003, 2007, 2009 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
/* Cause compilation failure if original declaration has wrong type. */
ssize_t readlink (const char *, char *, size_t);]])],
[gl_cv_decl_readlink_works=yes], [gl_cv_decl_readlink_works=no])])
+ dnl Solaris 9 ignores trailing slash.
+ dnl FreeBSD 7.2 dereferences only one level of links with trailing slash.
AC_CACHE_CHECK([whether readlink handles trailing slash correctly],
[gl_cv_func_readlink_works],
[# We have readlink, so assume ln -s works.
ln -s conftest.no-such conftest.link
+ ln -s conftest.link conftest.lnk2
AC_RUN_IFELSE(
[AC_LANG_PROGRAM(
[[#include <unistd.h>
]], [[char buf[20];
- return readlink ("conftest.link/", buf, sizeof buf) != -1;]])],
+ return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;]])],
[gl_cv_func_readlink_works=yes], [gl_cv_func_readlink_works=no],
[gl_cv_func_readlink_works="guessing no"])
rm -f conftest.link])
errno = 0;
ASSERT (func (BASE "file/", buf, sizeof buf) == -1);
ASSERT (errno == ENOTDIR);
- ASSERT (unlink (BASE "file") == 0);
/* Now test actual symlinks. */
if (symlink (BASE "dir", BASE "link"))
{
+ ASSERT (unlink (BASE "file") == 0);
if (print)
fputs ("skipping test: symlinks not supported on this file system\n",
stderr);
errno = 0;
ASSERT (func (BASE "link/", buf, sizeof buf) == -1);
ASSERT (errno == EINVAL);
+ ASSERT (symlink (BASE "link", BASE "link2") == 0);
+ errno = 0;
+ ASSERT (func (BASE "link2/", buf, sizeof buf) == -1);
+ ASSERT (errno == EINVAL);
+ ASSERT (unlink (BASE "link2") == 0);
+ ASSERT (symlink (BASE "file", BASE "link2") == 0);
+ errno = 0;
+ ASSERT (func (BASE "link2/", buf, sizeof buf) == -1);
+ ASSERT (errno == ENOTDIR);
+ ASSERT (unlink (BASE "file") == 0);
+ ASSERT (unlink (BASE "link2") == 0);
{
/* Up till now, no readlink has been successful, so buf should be
unchanged. */