--- findcmd.c
+++ findcmd.c	2009-06-04 12:03:16.094615177 +0200
@@ -93,7 +93,22 @@ file_status (name)
 
   r = FS_EXISTS;
 
-#if defined (AFS)
+#if defined (HAVE_EACCESS)	/* FreeBSD, GLIBC_2.4+ */
+
+  /* For support of ACL's use eaccess(3) if found e.g. glibc 2.4 and up:
+   * Like  access(2), euidaccess(3) checks permissions and existence of the
+   * file identified by its argument pathname.  However, whereas access(2),
+   * performs checks using the real user and group identifiers of the pro-
+   * cess, euidaccess(3) uses the effective identifiers.
+   * eaccess(3) is a synonym for euidaccess(3), provided for compatibility
+   * with some other systems. */
+  if (eaccess (name, X_OK) == 0)
+      r |= FS_EXECABLE;
+  if (eaccess (name, R_OK) == 0)
+      r |= FS_READABLE;
+
+#elif defined (AFS)
+
   /* We have to use access(2) to determine access because AFS does not
      support Unix file system semantics.  This may produce wrong
      answers for non-AFS files when ruid != euid.  I hate AFS. */
@@ -102,8 +117,7 @@ file_status (name)
   if (access (name, R_OK) == 0)
     r |= FS_READABLE;
 
-  return r;
-#else /* !AFS */
+#else /* !AFS && !HAVE_EACCESS */
 
   /* Find out if the file is actually executable.  By definition, the
      only other criteria is that the file has an execute bit set that
@@ -146,8 +160,8 @@ file_status (name)
 	r |= FS_READABLE;
     }
 
+#endif /* !AFS && !HAVE_EACCESS */
   return r;
-#endif /* !AFS */
 }
 
 /* Return non-zero if FILE exists and is executable.
--- lib/sh/eaccess.c
+++ lib/sh/eaccess.c	2009-06-04 11:59:33.165901707 +0200
@@ -201,7 +201,7 @@ sh_eaccess (path, mode)
   if (path_is_devfd (path))
     return (sh_stataccess (path, mode));
 
-#if defined (HAVE_EACCESS)		/* FreeBSD */
+#if defined (HAVE_EACCESS)		/* FreeBSD, GLIBC_2.4+ */
   return (eaccess (path, mode));
 #elif defined (EFF_ONLY_OK)		/* SVR4(?), SVR4.2 */
   return access (path, mode|EFF_ONLY_OK);