2 # See if we need to provide linkat replacement.
4 dnl Copyright (C) 2009-2011 Free Software Foundation, Inc.
5 dnl This file is free software; the Free Software Foundation
6 dnl gives unlimited permission to copy and/or distribute it,
7 dnl with or without modifications, as long as this notice is preserved.
9 # Written by Eric Blake.
11 AC_DEFUN([gl_FUNC_LINKAT],
13 AC_REQUIRE([gl_FUNC_OPENAT])
14 AC_REQUIRE([gl_FUNC_LINK_FOLLOWS_SYMLINK])
15 AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
16 AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
17 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
18 AC_CHECK_FUNCS_ONCE([linkat symlink])
19 AC_CHECK_HEADERS_ONCE([sys/param.h])
20 if test $ac_cv_func_linkat = no; then
23 AC_CACHE_CHECK([whether linkat(,AT_SYMLINK_FOLLOW) works],
24 [gl_cv_func_linkat_follow],
25 [rm -rf conftest.f1 conftest.f2
27 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
31 /* Linux added linkat in 2.6.16, but did not add AT_SYMLINK_FOLLOW
32 until 2.6.18. Always replace linkat to support older kernels. */
35 ]], [return linkat (AT_FDCWD, "conftest.f1", AT_FDCWD, "conftest.f2",
36 AT_SYMLINK_FOLLOW);])],
37 [gl_cv_func_linkat_follow=yes],
38 [gl_cv_func_linkat_follow="need runtime check"])
39 rm -rf conftest.f1 conftest.f2])
40 AC_CACHE_CHECK([whether linkat handles trailing slash correctly],
41 [gl_cv_func_linkat_slash],
42 [rm -rf conftest.a conftest.b conftest.c conftest.d
52 /* Create a regular file. */
53 fd = open ("conftest.a", O_CREAT | O_EXCL | O_WRONLY, 0600);
56 if (write (fd, "hello", 5) < 5)
60 /* Test whether hard links are supported on the current
62 if (linkat (AT_FDCWD, "conftest.a", AT_FDCWD, "conftest.b",
63 AT_SYMLINK_FOLLOW) < 0)
66 /* Test whether a trailing "/" is treated like "/.". */
67 if (linkat (AT_FDCWD, "conftest.a/", AT_FDCWD, "conftest.c",
68 AT_SYMLINK_FOLLOW) == 0)
70 if (linkat (AT_FDCWD, "conftest.a", AT_FDCWD, "conftest.d/",
71 AT_SYMLINK_FOLLOW) == 0)
75 [gl_cv_func_linkat_slash=yes],
76 [gl_cv_func_linkat_slash=no],
77 [# Guess yes on glibc systems, no otherwise.
79 *-gnu*) gl_cv_func_linkat_slash="guessing yes";;
80 *) gl_cv_func_linkat_slash="guessing no";;
83 rm -rf conftest.a conftest.b conftest.c conftest.d])
84 case "$gl_cv_func_linkat_slash" in
85 *yes) gl_linkat_slash_bug=0 ;;
86 *) gl_linkat_slash_bug=1 ;;
88 if test "$gl_cv_func_linkat_follow" != yes \
89 || test $gl_linkat_slash_bug = 1; then
91 AC_DEFINE_UNQUOTED([LINKAT_TRAILING_SLASH_BUG], [$gl_linkat_slash_bug],
92 [Define to 1 if linkat fails to recognize a trailing slash.])