1# fcntl-o.m4 serial 5 2dnl Copyright (C) 2006, 2009-2017 Free Software Foundation, Inc. 3dnl This file is free software; the Free Software Foundation 4dnl gives unlimited permission to copy and/or distribute it, 5dnl with or without modifications, as long as this notice is preserved. 6 7dnl Written by Paul Eggert. 8 9# Test whether the flags O_NOATIME and O_NOFOLLOW actually work. 10# Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise. 11# Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise. 12AC_DEFUN([gl_FCNTL_O_FLAGS], 13[ 14 dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW. 15 dnl AC_USE_SYSTEM_EXTENSIONS was introduced in autoconf 2.60 and obsoletes 16 dnl AC_GNU_SOURCE. 17 m4_ifdef([AC_USE_SYSTEM_EXTENSIONS], 18 [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])], 19 [AC_REQUIRE([AC_GNU_SOURCE])]) 20 21 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 22 AC_CHECK_HEADERS_ONCE([unistd.h]) 23 AC_CHECK_FUNCS_ONCE([symlink]) 24 AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h], 25 [AC_RUN_IFELSE( 26 [AC_LANG_PROGRAM( 27 [[#include <sys/types.h> 28 #include <sys/stat.h> 29 #if HAVE_UNISTD_H 30 # include <unistd.h> 31 #else /* on Windows with MSVC */ 32 # include <io.h> 33 # include <stdlib.h> 34 # defined sleep(n) _sleep ((n) * 1000) 35 #endif 36 #include <fcntl.h> 37 #ifndef O_NOATIME 38 #define O_NOATIME 0 39 #endif 40 #ifndef O_NOFOLLOW 41 #define O_NOFOLLOW 0 42 #endif 43 static int const constants[] = 44 { 45 O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, 46 O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY 47 }; 48 ]], 49 [[ 50 int result = !constants; 51 #if HAVE_SYMLINK 52 { 53 static char const sym[] = "conftest.sym"; 54 if (symlink ("/dev/null", sym) != 0) 55 result |= 2; 56 else 57 { 58 int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0); 59 if (fd >= 0) 60 { 61 close (fd); 62 result |= 4; 63 } 64 } 65 if (unlink (sym) != 0 || symlink (".", sym) != 0) 66 result |= 2; 67 else 68 { 69 int fd = open (sym, O_RDONLY | O_NOFOLLOW); 70 if (fd >= 0) 71 { 72 close (fd); 73 result |= 4; 74 } 75 } 76 unlink (sym); 77 } 78 #endif 79 { 80 static char const file[] = "confdefs.h"; 81 int fd = open (file, O_RDONLY | O_NOATIME); 82 if (fd < 0) 83 result |= 8; 84 else 85 { 86 struct stat st0; 87 if (fstat (fd, &st0) != 0) 88 result |= 16; 89 else 90 { 91 char c; 92 sleep (1); 93 if (read (fd, &c, 1) != 1) 94 result |= 24; 95 else 96 { 97 if (close (fd) != 0) 98 result |= 32; 99 else 100 { 101 struct stat st1; 102 if (stat (file, &st1) != 0) 103 result |= 40; 104 else 105 if (st0.st_atime != st1.st_atime) 106 result |= 64; 107 } 108 } 109 } 110 } 111 } 112 return result;]])], 113 [gl_cv_header_working_fcntl_h=yes], 114 [case $? in #( 115 4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( 116 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( 117 68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( 118 *) gl_cv_header_working_fcntl_h='no';; 119 esac], 120 [case "$host_os" in 121 # Guess 'no' on native Windows. 122 mingw*) gl_cv_header_working_fcntl_h='no' ;; 123 *) gl_cv_header_working_fcntl_h=cross-compiling ;; 124 esac 125 ]) 126 ]) 127 128 case $gl_cv_header_working_fcntl_h in #( 129 *O_NOATIME* | no | cross-compiling) ac_val=0;; #( 130 *) ac_val=1;; 131 esac 132 AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val], 133 [Define to 1 if O_NOATIME works.]) 134 135 case $gl_cv_header_working_fcntl_h in #( 136 *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( 137 *) ac_val=1;; 138 esac 139 AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val], 140 [Define to 1 if O_NOFOLLOW works.]) 141]) 142