Mercurial > hg > octave-nkf > gnulib-hg
annotate m4/linkat.m4 @ 14079:97fc9a21a8fb
maint: update almost all copyright ranges to include 2011
Run the new "make update-copyright" rule.
author | Jim Meyering <meyering@redhat.com> |
---|---|
date | Sat, 01 Jan 2011 20:17:23 +0100 |
parents | d5a74c6ec06b |
children | ec1d0cf8bdba |
rev | line source |
---|---|
13918
d5a74c6ec06b
Put more information about failed tests into the test return codes.
Bruno Haible <bruno@clisp.org>
parents:
13514
diff
changeset
|
1 # serial 4 |
12068 | 2 # See if we need to provide linkat replacement. |
3 | |
14079
97fc9a21a8fb
maint: update almost all copyright ranges to include 2011
Jim Meyering <meyering@redhat.com>
parents:
13918
diff
changeset
|
4 dnl Copyright (C) 2009-2011 Free Software Foundation, Inc. |
12068 | 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. | |
8 | |
9 # Written by Eric Blake. | |
10 | |
11 AC_DEFUN([gl_FUNC_LINKAT], | |
12 [ | |
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]) | |
13514
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
18 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles |
12068 | 19 AC_CHECK_FUNCS_ONCE([linkat symlink]) |
20 AC_CHECK_HEADERS_ONCE([sys/param.h]) | |
21 if test $ac_cv_func_linkat = no; then | |
22 HAVE_LINKAT=0 | |
23 AC_LIBOBJ([linkat]) | |
24 AC_LIBOBJ([at-func2]) | |
12120 | 25 else |
26 AC_CACHE_CHECK([whether linkat(,AT_SYMLINK_FOLLOW) works], | |
27 [gl_cv_func_linkat_follow], | |
28 [rm -rf conftest.f1 conftest.f2 | |
29 touch conftest.f1 | |
30 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ | |
31 #include <fcntl.h> | |
32 #include <unistd.h> | |
33 #ifdef __linux__ | |
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. */ | |
36 choke me | |
37 #endif | |
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]) | |
13514
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
43 AC_CACHE_CHECK([whether linkat handles trailing slash correctly], |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
44 [gl_cv_func_linkat_slash], |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
45 [rm -rf conftest.a conftest.b conftest.c conftest.d |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
46 AC_RUN_IFELSE( |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
47 [AC_LANG_PROGRAM( |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
48 [[#include <unistd.h> |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
49 #include <fcntl.h> |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
50 #include <errno.h> |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
51 #include <stdio.h> |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
52 ]], |
13918
d5a74c6ec06b
Put more information about failed tests into the test return codes.
Bruno Haible <bruno@clisp.org>
parents:
13514
diff
changeset
|
53 [[int result; |
d5a74c6ec06b
Put more information about failed tests into the test return codes.
Bruno Haible <bruno@clisp.org>
parents:
13514
diff
changeset
|
54 int fd; |
13514
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
55 /* Create a regular file. */ |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
56 fd = open ("conftest.a", O_CREAT | O_EXCL | O_WRONLY, 0600); |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
57 if (fd < 0) |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
58 return 1; |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
59 if (write (fd, "hello", 5) < 5) |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
60 return 2; |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
61 if (close (fd) < 0) |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
62 return 3; |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
63 /* Test whether hard links are supported on the current |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
64 device. */ |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
65 if (linkat (AT_FDCWD, "conftest.a", AT_FDCWD, "conftest.b", |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
66 AT_SYMLINK_FOLLOW) < 0) |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
67 return 0; |
13918
d5a74c6ec06b
Put more information about failed tests into the test return codes.
Bruno Haible <bruno@clisp.org>
parents:
13514
diff
changeset
|
68 result = 0; |
13514
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
69 /* Test whether a trailing "/" is treated like "/.". */ |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
70 if (linkat (AT_FDCWD, "conftest.a/", AT_FDCWD, "conftest.c", |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
71 AT_SYMLINK_FOLLOW) == 0) |
13918
d5a74c6ec06b
Put more information about failed tests into the test return codes.
Bruno Haible <bruno@clisp.org>
parents:
13514
diff
changeset
|
72 result |= 4; |
13514
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
73 if (linkat (AT_FDCWD, "conftest.a", AT_FDCWD, "conftest.d/", |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
74 AT_SYMLINK_FOLLOW) == 0) |
13918
d5a74c6ec06b
Put more information about failed tests into the test return codes.
Bruno Haible <bruno@clisp.org>
parents:
13514
diff
changeset
|
75 result |= 8; |
d5a74c6ec06b
Put more information about failed tests into the test return codes.
Bruno Haible <bruno@clisp.org>
parents:
13514
diff
changeset
|
76 return result; |
13514
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
77 ]])], |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
78 [gl_cv_func_linkat_slash=yes], |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
79 [gl_cv_func_linkat_slash=no], |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
80 [# Guess yes on glibc systems, no otherwise. |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
81 case "$host_os" in |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
82 *-gnu*) gl_cv_func_linkat_slash="guessing yes";; |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
83 *) gl_cv_func_linkat_slash="guessing no";; |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
84 esac |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
85 ]) |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
86 rm -rf conftest.a conftest.b conftest.c conftest.d]) |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
87 case "$gl_cv_func_linkat_slash" in |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
88 *yes) gl_linkat_slash_bug=0 ;; |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
89 *) gl_linkat_slash_bug=1 ;; |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
90 esac |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
91 if test "$gl_cv_func_linkat_follow" != yes \ |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
92 || test $gl_linkat_slash_bug = 1; then |
12120 | 93 REPLACE_LINKAT=1 |
94 AC_LIBOBJ([linkat]) | |
13514
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
95 AC_DEFINE_UNQUOTED([LINKAT_TRAILING_SLASH_BUG], [$gl_linkat_slash_bug], |
6154fce586b6
linkat: Work around AIX 7.1 bug.
Bruno Haible <bruno@clisp.org>
parents:
12559
diff
changeset
|
96 [Define to 1 if linkat fails to recognize a trailing slash.]) |
12120 | 97 fi |
12068 | 98 fi |
99 ]) |