Subject: Re: bug#18896: regressions in coreutils 8.23 on Yosemite

From: Jack Howarth <[email-masked]>
Date: Thu, 30 Oct 2014 17:24:35 -0400

On Thu, Oct 30, 2014 at 12:01:17AM +0000, Pádraig Brady wrote:
> On 10/29/2014 11:13 PM, Jack Howarth wrote:
> >    I am finding that the single failure seen on Mavericks for the 
> > coreutils 8.23 testsuite...
> > 
> > FAIL: test-getcwd.sh
> > 
> > =====================================================
> >    GNU coreutils 8.23: gnulib-tests/test-suite.log
> > =====================================================
> 
> The above gnulib issue may occur on Yosemite too but was not run
> due to the new failures below
> 
> > when run as sudo, is replaced by two new errors and two new failures
> > under Yosemite as sudo.
> > 
> > ERROR: tests/cp/link-deref.sh
> > FAIL: tests/cp/link-no-deref.sh
> > 
> > FAIL: tests/cp/link-symlink.sh
> > 
> > ERROR: tests/ln/hard-to-sym.sh
> > 
> > ============================================================================
> > Testsuite summary for GNU coreutils 8.23
> > ============================================================================
> > # TOTAL: 563
> > # PASS:  397
> > # SKIP:  162
> > # XFAIL: 0
> > # FAIL:  2
> > # XPASS: 0
> > # ERROR: 2
> 
> All these failures and errors are due to trying to create
> a hardlink to a symlink and getting an "Operation not supported" error.
> 
> Can you send the output of this command?
>   $ grep -E "(LINK_F|LINKAT)" lib/config.h
> 

In case it helps, here is the diff being the lib/config.h files generated on
darwin13 and darwin14...

--- coreutils-config.h.darwin13	2014-10-30 17:20:17.000000000 -0400
+++ coreutils-config.h.darwin14	2014-10-30 17:19:54.000000000 -0400
@@ -748,7 +748,7 @@
 /* #undef GWINSZ_IN_SYS_PTY */
 
 /* Define to 1 if you have the `access' function. */
-#define HAVE_ACCESS 1
+/* #undef HAVE_ACCESS */
 
 /* Define to 1 if you have the `aclsort' function. */
 /* #undef HAVE_ACLSORT */
@@ -952,7 +952,7 @@
 
 /* Define to 1 if you have the declaration of `fdopendir', and to 0 if you
    don't. */
-#define HAVE_DECL_FDOPENDIR 0
+#define HAVE_DECL_FDOPENDIR 1
 
 /* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you
    don't. */
@@ -1297,7 +1297,7 @@
 /* #undef HAVE_EUIDACCESS */
 
 /* Define to 1 if you have the `faccessat' function. */
-/* #undef HAVE_FACCESSAT */
+#define HAVE_FACCESSAT 1
 
 /* Define to 1 if you have the `facl' function. */
 /* #undef HAVE_FACL */
@@ -1309,7 +1309,7 @@
 #define HAVE_FCHMOD 1
 
 /* Define to 1 if you have the `fchmodat' function. */
-/* #undef HAVE_FCHMODAT */
+#define HAVE_FCHMODAT 1
 
 /* Define to 1 if you have the `fchown' function. */
 #define HAVE_FCHOWN 1
@@ -1321,7 +1321,7 @@
 #define HAVE_FDATASYNC 1
 
 /* Define to 1 if you have the `fdopendir' function. */
-/* #undef HAVE_FDOPENDIR */
+#define HAVE_FDOPENDIR 1
 
 /* Define to 1 if you have the <features.h> header file. */
 /* #undef HAVE_FEATURES_H */
@@ -1349,7 +1349,7 @@
 #define HAVE_FSEEKO 1
 
 /* Define to 1 if you have the `fstatat' function. */
-/* #undef HAVE_FSTATAT */
+#define HAVE_FSTATAT 1
 
 /* Define to 1 if you have the `fstatfs' function. */
 #define HAVE_FSTATFS 1
@@ -1592,7 +1592,7 @@
 #define HAVE_LINK 1
 
 /* Define to 1 if you have the `linkat' function. */
-/* #undef HAVE_LINKAT */
+#define HAVE_LINKAT 1
 
 /* Define to 1 if you have the `listmntent' function. */
 /* #undef HAVE_LISTMNTENT */
@@ -1731,7 +1731,7 @@
 /* #undef HAVE_OBSTACK */
 
 /* Define to 1 if you have the `openat' function. */
-/* #undef HAVE_OPENAT */
+#define HAVE_OPENAT 1
 
 /* Define to 1 if you have the `opendir' function. */
 #define HAVE_OPENDIR 1
@@ -1813,7 +1813,7 @@
 #define HAVE_READLINK 1
 
 /* Define to 1 if you have the `readlinkat' function. */
-/* #undef HAVE_READLINKAT */
+#define HAVE_READLINKAT 1
 
 /* Define to 1 if your system has a GNU libc compatible 'realloc' function,
    and to 0 otherwise. */
@@ -2171,7 +2171,7 @@
 #define HAVE_SYMLINK 1
 
 /* Define to 1 if you have the `symlinkat' function. */
-/* #undef HAVE_SYMLINKAT */
+#define HAVE_SYMLINKAT 1
 
 /* Define to 1 if you have the `sync' function. */
 #define HAVE_SYNC 1
@@ -2338,7 +2338,7 @@
 #define HAVE_UNISTD_H 1
 
 /* Define to 1 if you have the `unlinkat' function. */
-/* #undef HAVE_UNLINKAT */
+#define HAVE_UNLINKAT 1
 
 /* Define to 1 if you have the `unsetenv' function. */
 #define HAVE_UNSETENV 1
@@ -2429,7 +2429,7 @@
 
 /* Define to 1 if fstatat (..., 0) works. For example, it does not work in AIX
    7.1. */
-/* #undef HAVE_WORKING_FSTATAT_ZERO_FLAG */
+#define HAVE_WORKING_FSTATAT_ZERO_FLAG 1
 
 /* Define to 1 if O_NOATIME works. */
 #define HAVE_WORKING_O_NOATIME 0

> What file system type are you running this one?
> 
> I suspect that this might help?
> 
> diff --git a/lib/linkat.c b/lib/linkat.c
> index 6ee30fb..fd6bd1c 100644
> --- a/lib/linkat.c
> +++ b/lib/linkat.c
> @@ -329,7 +329,8 @@ rpl_linkat (int fd1, char const *file1, int fd2, char const *file2, int flag)
>      if (0 <= have_follow_really)
>      {
>        int result = linkat (fd1, file1, fd2, file2, flag);
> -      if (!(result == -1 && errno == EINVAL))
> +      if (!(result == -1 && (errno == EINVAL || errno == ENOTSUP
> +                             || errno == EOPNOTSUPP)))
>          {
>            have_follow_really = 1;
>            return result;