error: depend on stdio
[gnulib.git] / m4 / lstat.m4
index 3b7bdfb..5f4db64 100644 (file)
@@ -1,51 +1,73 @@
-#serial 2
+# serial 26
+
+# Copyright (C) 1997-2001, 2003-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
 dnl From Jim Meyering.
-dnl Determine whether lstat has the bug that it succeeds when given the
-dnl zero-length file name argument.  The lstat from SunOS4.1.4 and the Hurd
-dnl (as of 1998-11-01) do this.
-dnl
-dnl If it does, then define HAVE_LSTAT_EMPTY_STRING_BUG and arrange to
-dnl compile the wrapper function.
-dnl
 
-AC_DEFUN(jm_FUNC_LSTAT,
+AC_DEFUN([gl_FUNC_LSTAT],
 [
- AC_CACHE_CHECK([whether lstat accepts an empty string],
-  jm_cv_func_lstat_empty_string_bug,
-  [AC_TRY_RUN([
-#   include <sys/types.h>
-#   include <sys/stat.h>
-
-    int
-    main ()
-    {
-      struct stat sbuf;
-      exit (lstat ("", &sbuf) ? 1 : 0);
-    }
-         ],
-        jm_cv_func_lstat_empty_string_bug=yes,
-        jm_cv_func_lstat_empty_string_bug=no,
-        dnl When crosscompiling, assume lstat is broken.
-        jm_cv_func_lstat_empty_string_bug=yes)
-  ])
-  if test $jm_cv_func_lstat_empty_string_bug = yes; then
+  AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+  dnl If lstat does not exist, the replacement <sys/stat.h> does
+  dnl "#define lstat stat", and lstat.c is a no-op.
+  AC_CHECK_FUNCS_ONCE([lstat])
+  if test $ac_cv_func_lstat = yes; then
+    AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
+    case "$gl_cv_func_lstat_dereferences_slashed_symlink" in
+      *no)
+        REPLACE_LSTAT=1
+        ;;
+    esac
+  else
+    HAVE_LSTAT=0
+  fi
+])
 
-    LIBOBJS="$LIBOBJS lstat.o"
+# Prerequisites of lib/lstat.c.
+AC_DEFUN([gl_PREREQ_LSTAT], [:])
 
-    if test $jm_cv_func_lstat_empty_string_bug = yes; then
-      if test x = y; then
-       # This code is deliberately never run via ./configure.
-       # FIXME: this is a hack to make autoheader put the corresponding
-       # HAVE_* undef for this symbol in config.h.in.  This saves me the
-       # trouble of having to maintain the #undef in acconfig.h manually.
-       AC_CHECK_FUNCS(LSTAT_EMPTY_STRING_BUG)
-      fi
-      # Defining it this way (rather than via AC_DEFINE) short-circuits the
-      # autoheader check -- autoheader doesn't know it's already been taken
-      # care of by the hack above.
-      ac_kludge=HAVE_LSTAT_EMPTY_STRING_BUG
-      AC_DEFINE_UNQUOTED($ac_kludge)
-    fi
-  fi
+AC_DEFUN([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK],
+[
+  dnl We don't use AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK any more, because it
+  dnl is no longer maintained in Autoconf and because it invokes AC_LIBOBJ.
+  AC_CACHE_CHECK([whether lstat correctly handles trailing slash],
+    [gl_cv_func_lstat_dereferences_slashed_symlink],
+    [rm -f conftest.sym conftest.file
+     echo >conftest.file
+     if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then
+       AC_RUN_IFELSE(
+         [AC_LANG_PROGRAM(
+            [AC_INCLUDES_DEFAULT],
+            [[struct stat sbuf;
+              /* Linux will dereference the symlink and fail, as required by
+                 POSIX.  That is better in the sense that it means we will not
+                 have to compile and use the lstat wrapper.  */
+              return lstat ("conftest.sym/", &sbuf) == 0;
+            ]])],
+         [gl_cv_func_lstat_dereferences_slashed_symlink=yes],
+         [gl_cv_func_lstat_dereferences_slashed_symlink=no],
+         [case "$host_os" in
+                    # Guess yes on glibc systems.
+            *-gnu*) gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;;
+                    # If we don't know, assume the worst.
+            *)      gl_cv_func_lstat_dereferences_slashed_symlink="guessing no" ;;
+          esac
+         ])
+     else
+       # If the 'ln -s' command failed, then we probably don't even
+       # have an lstat function.
+       gl_cv_func_lstat_dereferences_slashed_symlink="guessing no"
+     fi
+     rm -f conftest.sym conftest.file
+    ])
+  case "$gl_cv_func_lstat_dereferences_slashed_symlink" in
+    *yes)
+      AC_DEFINE_UNQUOTED([LSTAT_FOLLOWS_SLASHED_SYMLINK], [1],
+        [Define to 1 if 'lstat' dereferences a symlink specified
+         with a trailing slash.])
+      ;;
+  esac
 ])