0e3988ab53f85e84e52fb0af7200c6f0a4b96481
[gnulib.git] / m4 / lstat-slash.m4
1 #serial 1
2
3 dnl From Jim Meyering.
4 dnl FIXME: describe
5
6 AC_DEFUN(jm_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK,
7 [
8  AC_CACHE_CHECK(
9   [whether lstat dereferences a symlink specified with a trailing slash],
10   jm_cv_func_lstat_dereferences_slashed_symlink,
11   [
12    rm -f conftest.sym conftest.file
13    : > conftest.file
14    if ln -s conftest.file conftest.sym; then
15      AC_TRY_RUN([
16 #     include <sys/types.h>
17 #     include <sys/stat.h>
18
19       int
20       main ()
21       {
22         struct stat sbuf;
23         /* Linux will dereference the symlink and fail.
24            That is better in the sense that it means we will not
25            have to compile and use the lstat wrapper.  */
26         exit (lstat ("conftest.sym/", &sbuf) ? 0 : 1);
27       }
28       ],
29       jm_cv_func_lstat_dereferences_slashed_symlink=yes,
30       jm_cv_func_lstat_dereferences_slashed_symlink=no,
31       dnl When crosscompiling, be pessimistic so we will end up using the
32       dnl replacement version of lstat that checkes for trailing slashes
33       dnl and calls lstat a second time when necessary.
34       jm_cv_func_lstat_dereferences_slashed_symlink=no
35      )
36    else
37      jm_cv_func_lstat_dereferences_slashed_symlink=no
38    fi
39   ])
40
41   test $jm_cv_func_lstat_dereferences_slashed_symlink = yes \
42     && zero_one=1 \
43     || zero_one=0
44   AC_DEFINE_UNQUOTED(LSTAT_FOLLOWS_SLASHED_SYMLINK, $zero_one,
45     [Define if lstat dereferences a symlink specified with a trailing slash])
46
47   if test $jm_cv_func_lstat_dereferences_slashed_symlink = no; then
48     AC_SUBST(LIBOBJS)
49     # Append lstat.o if it's not already in $LIBOBJS.
50     case "$LIBOBJS" in
51       *lstat.$ac_objext*) ;;
52       *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;;
53     esac
54   fi
55 ])