Blame m4/fcntl-o.m4

Packit Service 4684c1
# fcntl-o.m4 serial 6
Packit Service 4684c1
dnl Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc.
Packit Service 4684c1
dnl This file is free software; the Free Software Foundation
Packit Service 4684c1
dnl gives unlimited permission to copy and/or distribute it,
Packit Service 4684c1
dnl with or without modifications, as long as this notice is preserved.
Packit Service 4684c1
Packit Service 4684c1
dnl Written by Paul Eggert.
Packit Service 4684c1
Packit Service 4684c1
AC_PREREQ([2.60])
Packit Service 4684c1
Packit Service 4684c1
# Test whether the flags O_NOATIME and O_NOFOLLOW actually work.
Packit Service 4684c1
# Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise.
Packit Service 4684c1
# Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise.
Packit Service 4684c1
AC_DEFUN([gl_FCNTL_O_FLAGS],
Packit Service 4684c1
[
Packit Service 4684c1
  dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW.
Packit Service 4684c1
  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
Packit Service 4684c1
Packit Service 4684c1
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 4684c1
  AC_CHECK_HEADERS_ONCE([unistd.h])
Packit Service 4684c1
  AC_CHECK_FUNCS_ONCE([symlink])
Packit Service 4684c1
  AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h],
Packit Service 4684c1
    [AC_RUN_IFELSE(
Packit Service 4684c1
       [AC_LANG_PROGRAM(
Packit Service 4684c1
          [[#include <sys/types.h>
Packit Service 4684c1
           #include <sys/stat.h>
Packit Service 4684c1
           #if HAVE_UNISTD_H
Packit Service 4684c1
           # include <unistd.h>
Packit Service 4684c1
           #else /* on Windows with MSVC */
Packit Service 4684c1
           # include <io.h>
Packit Service 4684c1
           # include <stdlib.h>
Packit Service 4684c1
           # defined sleep(n) _sleep ((n) * 1000)
Packit Service 4684c1
           #endif
Packit Service 4684c1
           #include <fcntl.h>
Packit Service 4684c1
           #ifndef O_NOATIME
Packit Service 4684c1
            #define O_NOATIME 0
Packit Service 4684c1
           #endif
Packit Service 4684c1
           #ifndef O_NOFOLLOW
Packit Service 4684c1
            #define O_NOFOLLOW 0
Packit Service 4684c1
           #endif
Packit Service 4684c1
           static int const constants[] =
Packit Service 4684c1
            {
Packit Service 4684c1
              O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
Packit Service 4684c1
              O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
Packit Service 4684c1
            };
Packit Service 4684c1
          ]],
Packit Service 4684c1
          [[
Packit Service 4684c1
            int result = !constants;
Packit Service 4684c1
            #if HAVE_SYMLINK
Packit Service 4684c1
            {
Packit Service 4684c1
              static char const sym[] = "conftest.sym";
Packit Service 4684c1
              if (symlink ("/dev/null", sym) != 0)
Packit Service 4684c1
                result |= 2;
Packit Service 4684c1
              else
Packit Service 4684c1
                {
Packit Service 4684c1
                  int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0);
Packit Service 4684c1
                  if (fd >= 0)
Packit Service 4684c1
                    {
Packit Service 4684c1
                      close (fd);
Packit Service 4684c1
                      result |= 4;
Packit Service 4684c1
                    }
Packit Service 4684c1
                }
Packit Service 4684c1
              if (unlink (sym) != 0 || symlink (".", sym) != 0)
Packit Service 4684c1
                result |= 2;
Packit Service 4684c1
              else
Packit Service 4684c1
                {
Packit Service 4684c1
                  int fd = open (sym, O_RDONLY | O_NOFOLLOW);
Packit Service 4684c1
                  if (fd >= 0)
Packit Service 4684c1
                    {
Packit Service 4684c1
                      close (fd);
Packit Service 4684c1
                      result |= 4;
Packit Service 4684c1
                    }
Packit Service 4684c1
                }
Packit Service 4684c1
              unlink (sym);
Packit Service 4684c1
            }
Packit Service 4684c1
            #endif
Packit Service 4684c1
            {
Packit Service 4684c1
              static char const file[] = "confdefs.h";
Packit Service 4684c1
              int fd = open (file, O_RDONLY | O_NOATIME);
Packit Service 4684c1
              if (fd < 0)
Packit Service 4684c1
                result |= 8;
Packit Service 4684c1
              else
Packit Service 4684c1
                {
Packit Service 4684c1
                  struct stat st0;
Packit Service 4684c1
                  if (fstat (fd, &st0) != 0)
Packit Service 4684c1
                    result |= 16;
Packit Service 4684c1
                  else
Packit Service 4684c1
                    {
Packit Service 4684c1
                      char c;
Packit Service 4684c1
                      sleep (1);
Packit Service 4684c1
                      if (read (fd, &c, 1) != 1)
Packit Service 4684c1
                        result |= 24;
Packit Service 4684c1
                      else
Packit Service 4684c1
                        {
Packit Service 4684c1
                          if (close (fd) != 0)
Packit Service 4684c1
                            result |= 32;
Packit Service 4684c1
                          else
Packit Service 4684c1
                            {
Packit Service 4684c1
                              struct stat st1;
Packit Service 4684c1
                              if (stat (file, &st1) != 0)
Packit Service 4684c1
                                result |= 40;
Packit Service 4684c1
                              else
Packit Service 4684c1
                                if (st0.st_atime != st1.st_atime)
Packit Service 4684c1
                                  result |= 64;
Packit Service 4684c1
                            }
Packit Service 4684c1
                        }
Packit Service 4684c1
                    }
Packit Service 4684c1
                }
Packit Service 4684c1
            }
Packit Service 4684c1
            return result;]])],
Packit Service 4684c1
       [gl_cv_header_working_fcntl_h=yes],
Packit Service 4684c1
       [case $? in #(
Packit Service 4684c1
        4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
Packit Service 4684c1
        64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
Packit Service 4684c1
        68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
Packit Service 4684c1
         *) gl_cv_header_working_fcntl_h='no';;
Packit Service 4684c1
        esac],
Packit Service 4684c1
       [case "$host_os" in
Packit Service 4684c1
                  # Guess 'no' on native Windows.
Packit Service 4684c1
          mingw*) gl_cv_header_working_fcntl_h='no' ;;
Packit Service 4684c1
          *)      gl_cv_header_working_fcntl_h=cross-compiling ;;
Packit Service 4684c1
        esac
Packit Service 4684c1
       ])
Packit Service 4684c1
    ])
Packit Service 4684c1
Packit Service 4684c1
  case $gl_cv_header_working_fcntl_h in #(
Packit Service 4684c1
  *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
Packit Service 4684c1
  *) ac_val=1;;
Packit Service 4684c1
  esac
Packit Service 4684c1
  AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val],
Packit Service 4684c1
    [Define to 1 if O_NOATIME works.])
Packit Service 4684c1
Packit Service 4684c1
  case $gl_cv_header_working_fcntl_h in #(
Packit Service 4684c1
  *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
Packit Service 4684c1
  *) ac_val=1;;
Packit Service 4684c1
  esac
Packit Service 4684c1
  AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val],
Packit Service 4684c1
    [Define to 1 if O_NOFOLLOW works.])
Packit Service 4684c1
])