Blame m4/fcntl-o.m4

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