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