Blame gnulib/m4/fcntl-o.m4

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