dirfd.m4 2.59 KB
Newer Older
Paul Eggert's avatar
Paul Eggert committed
1
# serial 26   -*- Autoconf -*-
Paul Eggert's avatar
Paul Eggert committed
2 3 4

dnl Find out how to get the file descriptor associated with an open DIR*.

Paul Eggert's avatar
Paul Eggert committed
5
# Copyright (C) 2001-2006, 2008-2020 Free Software Foundation, Inc.
Paul Eggert's avatar
Paul Eggert committed
6 7 8 9 10 11 12 13 14
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.

dnl From Jim Meyering

AC_DEFUN([gl_FUNC_DIRFD],
[
  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
Paul Eggert's avatar
Paul Eggert committed
15
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Paul Eggert's avatar
Paul Eggert committed
16 17 18 19 20 21 22 23 24 25 26 27 28

  dnl Persuade glibc <dirent.h> to declare dirfd().
  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])

  AC_CHECK_FUNCS([dirfd])
  AC_CHECK_DECLS([dirfd], , ,
    [[#include <sys/types.h>
      #include <dirent.h>]])
  if test $ac_cv_have_decl_dirfd = no; then
    HAVE_DECL_DIRFD=0
  fi

  AC_CACHE_CHECK([whether dirfd is a macro],
Paul Eggert's avatar
Paul Eggert committed
29
    [gl_cv_func_dirfd_macro],
Paul Eggert's avatar
Paul Eggert committed
30 31 32 33 34 35
    [AC_EGREP_CPP([dirent_header_defines_dirfd], [
#include <sys/types.h>
#include <dirent.h>
#ifdef dirfd
 dirent_header_defines_dirfd
#endif],
Paul Eggert's avatar
Paul Eggert committed
36 37
       [gl_cv_func_dirfd_macro=yes],
       [gl_cv_func_dirfd_macro=no])])
Paul Eggert's avatar
Paul Eggert committed
38

Paul Eggert's avatar
Paul Eggert committed
39 40 41 42 43
  # Use the replacement if we have no function or macro with that name,
  # or if OS/2 kLIBC whose dirfd() does not work.
  # Replace only if the system declares dirfd already.
  case $ac_cv_func_dirfd,$gl_cv_func_dirfd_macro,$host_os,$ac_cv_have_decl_dirfd in
    no,no,*,yes | *,*,os2*,yes)
Paul Eggert's avatar
Paul Eggert committed
44
      REPLACE_DIRFD=1
Paul Eggert's avatar
Paul Eggert committed
45 46 47
      AC_DEFINE([REPLACE_DIRFD], [1],
        [Define to 1 if gnulib's dirfd() replacement is used.]);;
  esac
Paul Eggert's avatar
Paul Eggert committed
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
])

dnl Prerequisites of lib/dirfd.c.
AC_DEFUN([gl_PREREQ_DIRFD],
[
  AC_CACHE_CHECK([how to get the file descriptor associated with an open DIR*],
                 [gl_cv_sys_dir_fd_member_name],
    [
      dirfd_save_CFLAGS=$CFLAGS
      for ac_expr in d_fd dd_fd; do

        CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr"
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
           #include <sys/types.h>
           #include <dirent.h>]],
          [[DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME;]])],
          [dir_fd_found=yes]
        )
        CFLAGS=$dirfd_save_CFLAGS
        test "$dir_fd_found" = yes && break
      done
      test "$dir_fd_found" = yes || ac_expr=no_such_member

      gl_cv_sys_dir_fd_member_name=$ac_expr
    ]
  )
  if test $gl_cv_sys_dir_fd_member_name != no_such_member; then
    AC_DEFINE_UNQUOTED([DIR_FD_MEMBER_NAME],
      [$gl_cv_sys_dir_fd_member_name],
      [the name of the file descriptor member of DIR])
  fi
  AH_VERBATIM([DIR_TO_FD],
              [#ifdef DIR_FD_MEMBER_NAME
# define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME)
#else
# define DIR_TO_FD(Dir_p) -1
#endif
])
])