Imported Upstream version 1.3.14
[debian/gzip] / m4 / fcntl_h.m4
1 # serial 6
2 # Configure fcntl.h.
3 dnl Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc.
4 dnl This file is free software; the Free Software Foundation
5 dnl gives unlimited permission to copy and/or distribute it,
6 dnl with or without modifications, as long as this notice is preserved.
7
8 dnl Written by Paul Eggert.
9
10 AC_DEFUN([gl_FCNTL_H],
11 [
12   AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
13   AC_REQUIRE([gl_FCNTL_O_FLAGS])
14   gl_CHECK_NEXT_HEADERS([fcntl.h])
15   FCNTL_H='fcntl.h'
16   AC_SUBST([FCNTL_H])
17 ])
18
19 # Test whether the flags O_NOATIME and O_NOFOLLOW actually work.
20 # Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise.
21 # Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise.
22 AC_DEFUN([gl_FCNTL_O_FLAGS],
23 [
24   dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW.
25   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
26   AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h],
27     [AC_RUN_IFELSE(
28        [AC_LANG_PROGRAM(
29           [[#include <sys/types.h>
30            #include <sys/stat.h>
31            #include <unistd.h>
32            #include <fcntl.h>
33            #ifndef O_NOATIME
34             #define O_NOATIME 0
35            #endif
36            #ifndef O_NOFOLLOW
37             #define O_NOFOLLOW 0
38            #endif
39            static int const constants[] =
40             {
41               O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
42               O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
43             };
44           ]],
45           [[
46             int status = !constants;
47             {
48               static char const sym[] = "conftest.sym";
49               if (symlink (".", sym) != 0
50                   || close (open (sym, O_RDONLY | O_NOFOLLOW)) == 0)
51                 status |= 32;
52               unlink (sym);
53             }
54             {
55               static char const file[] = "confdefs.h";
56               int fd = open (file, O_RDONLY | O_NOATIME);
57               char c;
58               struct stat st0, st1;
59               if (fd < 0
60                   || fstat (fd, &st0) != 0
61                   || sleep (1) != 0
62                   || read (fd, &c, 1) != 1
63                   || close (fd) != 0
64                   || stat (file, &st1) != 0
65                   || st0.st_atime != st1.st_atime)
66                 status |= 64;
67             }
68             return status;]])],
69        [gl_cv_header_working_fcntl_h=yes],
70        [case $? in #(
71         32) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
72         64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
73         96) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
74          *) gl_cv_header_working_fcntl_h='no';;
75         esac],
76        [gl_cv_header_working_fcntl_h=cross-compiling])])
77
78   case $gl_cv_header_working_fcntl_h in #(
79   *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
80   *) ac_val=1;;
81   esac
82   AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val],
83     [Define to 1 if O_NOATIME works.])
84
85   case $gl_cv_header_working_fcntl_h in #(
86   *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
87   *) ac_val=1;;
88   esac
89   AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val],
90     [Define to 1 if O_NOFOLLOW works.])
91 ])
92
93 AC_DEFUN([gl_FCNTL_MODULE_INDICATOR],
94 [
95   dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
96   AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
97   GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
98 ])
99
100 AC_DEFUN([gl_FCNTL_H_DEFAULTS],
101 [
102   GNULIB_OPEN=0;    AC_SUBST([GNULIB_OPEN])
103   GNULIB_OPENAT=0;  AC_SUBST([GNULIB_OPENAT])
104   dnl Assume proper GNU behavior unless another module says otherwise.
105   HAVE_OPENAT=1;    AC_SUBST([HAVE_OPENAT])
106   REPLACE_OPEN=0;   AC_SUBST([REPLACE_OPEN])
107   REPLACE_OPENAT=0; AC_SUBST([REPLACE_OPENAT])
108 ])