X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=m4%2Flstat.m4;h=c5e72b81e824f4a84378145699b6a2968973f591;hb=781cacd451d6fdd0f8b9c03c9651726f3cac8743;hp=9ca2402a40661d3028129ef77d8ed0d1e5a5460c;hpb=1e05b2826c458d3b1750ec36bc44e49596ef46d8;p=gnulib.git diff --git a/m4/lstat.m4 b/m4/lstat.m4 index 9ca2402a4..c5e72b81e 100644 --- a/m4/lstat.m4 +++ b/m4/lstat.m4 @@ -1,51 +1,73 @@ -#serial 2 +# serial 26 + +# Copyright (C) 1997-2001, 2003-2014 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) does this. This behavior is allowed by POSIX. -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 -# include - - 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 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 ])