2 # See if we need to provide linkat replacement.
4 dnl Copyright (C) 2009-2010 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])
15 AC_REQUIRE([gl_FUNC_LINK_FOLLOWS_SYMLINK])
16 AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
17 AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
18 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
19 AC_CHECK_FUNCS_ONCE([linkat symlink])
20 AC_CHECK_HEADERS_ONCE([sys/param.h])
21 if test $ac_cv_func_linkat = no; then
26 AC_CACHE_CHECK([whether linkat(,AT_SYMLINK_FOLLOW) works],
27 [gl_cv_func_linkat_follow],
28 [rm -rf conftest.f1 conftest.f2
30 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
34 /* Linux added linkat in 2.6.16, but did not add AT_SYMLINK_FOLLOW
35 until 2.6.18. Always replace linkat to support older kernels. */
38 ]], [return linkat (AT_FDCWD, "conftest.f1", AT_FDCWD, "conftest.f2",
39 AT_SYMLINK_FOLLOW);])],
40 [gl_cv_func_linkat_follow=yes],
41 [gl_cv_func_linkat_follow="need runtime check"])
42 rm -rf conftest.f1 conftest.f2])
43 AC_CACHE_CHECK([whether linkat handles trailing slash correctly],
44 [gl_cv_func_linkat_slash],
45 [rm -rf conftest.a conftest.b conftest.c conftest.d
56 /* Create a regular file. */
57 fd = open ("conftest.a", O_CREAT | O_EXCL | O_WRONLY, 0600);
60 if (write (fd, "hello", 5) < 5)
64 /* Test whether hard links are supported on the current
66 if (linkat (AT_FDCWD, "conftest.a", AT_FDCWD, "conftest.b",
67 AT_SYMLINK_FOLLOW) < 0)
69 /* Test whether a trailing "/" is treated like "/.". */
70 if (linkat (AT_FDCWD, "conftest.a/", AT_FDCWD, "conftest.c",
71 AT_SYMLINK_FOLLOW) == 0)
73 if (linkat (AT_FDCWD, "conftest.a", AT_FDCWD, "conftest.d/",
74 AT_SYMLINK_FOLLOW) == 0)
78 [gl_cv_func_linkat_slash=yes],
79 [gl_cv_func_linkat_slash=no],
80 [# Guess yes on glibc systems, no otherwise.
82 *-gnu*) gl_cv_func_linkat_slash="guessing yes";;
83 *) gl_cv_func_linkat_slash="guessing no";;
86 rm -rf conftest.a conftest.b conftest.c conftest.d])
87 case "$gl_cv_func_linkat_slash" in
88 *yes) gl_linkat_slash_bug=0 ;;
89 *) gl_linkat_slash_bug=1 ;;
91 if test "$gl_cv_func_linkat_follow" != yes \
92 || test $gl_linkat_slash_bug = 1; then
95 AC_DEFINE_UNQUOTED([LINKAT_TRAILING_SLASH_BUG], [$gl_linkat_slash_bug],
96 [Define to 1 if linkat fails to recognize a trailing slash.])