Blame extension/m4/dirfd.m4

Packit Service f629e6
# serial 22   -*- Autoconf -*-
Packit Service f629e6
Packit Service f629e6
dnl Find out how to get the file descriptor associated with an open DIR*.
Packit Service f629e6
Packit Service f629e6
# Copyright (C) 2001-2006, 2008-2013 Free Software Foundation, Inc.
Packit Service f629e6
# This file is free software; the Free Software Foundation
Packit Service f629e6
# gives unlimited permission to copy and/or distribute it,
Packit Service f629e6
# with or without modifications, as long as this notice is preserved.
Packit Service f629e6
Packit Service f629e6
dnl From Jim Meyering
Packit Service f629e6
dnl Simplified for gawk
Packit Service f629e6
Packit Service f629e6
AC_DEFUN([GAWK_FUNC_DIRFD],
Packit Service f629e6
[
Packit Service f629e6
dnl  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
Packit Service f629e6
Packit Service f629e6
  dnl Persuade glibc <dirent.h> to declare dirfd().
Packit Service f629e6
  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
Packit Service f629e6
Packit Service f629e6
  AC_CHECK_FUNCS([dirfd])
Packit Service f629e6
  AC_CHECK_DECLS([dirfd], , ,
Packit Service f629e6
    [[#include <sys/types.h>
Packit Service f629e6
      #include <dirent.h>]])
Packit Service f629e6
  if test $ac_cv_have_decl_dirfd = no; then
Packit Service f629e6
    HAVE_DECL_DIRFD=0
Packit Service f629e6
  fi
Packit Service f629e6
Packit Service f629e6
  AC_CACHE_CHECK([whether dirfd is a macro],
Packit Service f629e6
    gl_cv_func_dirfd_macro,
Packit Service f629e6
    [AC_EGREP_CPP([dirent_header_defines_dirfd], [
Packit Service f629e6
#include <sys/types.h>
Packit Service f629e6
#include <dirent.h>
Packit Service f629e6
#ifdef dirfd
Packit Service f629e6
 dirent_header_defines_dirfd
Packit Service f629e6
#endif],
Packit Service f629e6
       gl_cv_func_dirfd_macro=yes,
Packit Service f629e6
       gl_cv_func_dirfd_macro=no)])
Packit Service f629e6
Packit Service f629e6
  # Use the replacement only if we have no function or macro with that name.
Packit Service f629e6
  if test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no; then
Packit Service f629e6
    if test $ac_cv_have_decl_dirfd = yes; then
Packit Service f629e6
      # If the system declares dirfd already, let's declare rpl_dirfd instead.
Packit Service f629e6
      REPLACE_DIRFD=1
Packit Service f629e6
    fi
Packit Service f629e6
  fi
Packit Service f629e6
])
Packit Service f629e6
Packit Service f629e6
dnl Prerequisites of lib/dirfd.c.
Packit Service f629e6
AC_DEFUN([GAWK_PREREQ_DIRFD],
Packit Service f629e6
[
Packit Service f629e6
  AC_CACHE_CHECK([how to get the file descriptor associated with an open DIR*],
Packit Service f629e6
                 [gl_cv_sys_dir_fd_member_name],
Packit Service f629e6
    [
Packit Service f629e6
      dirfd_save_CFLAGS=$CFLAGS
Packit Service f629e6
      for ac_expr in d_fd dd_fd; do
Packit Service f629e6
Packit Service f629e6
        CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr"
Packit Service f629e6
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
Packit Service f629e6
           #include <sys/types.h>
Packit Service f629e6
           #include <dirent.h>]],
Packit Service f629e6
          [[DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME;]])],
Packit Service f629e6
          [dir_fd_found=yes]
Packit Service f629e6
        )
Packit Service f629e6
        CFLAGS=$dirfd_save_CFLAGS
Packit Service f629e6
        test "$dir_fd_found" = yes && break
Packit Service f629e6
      done
Packit Service f629e6
      test "$dir_fd_found" = yes || ac_expr=no_such_member
Packit Service f629e6
Packit Service f629e6
      gl_cv_sys_dir_fd_member_name=$ac_expr
Packit Service f629e6
    ]
Packit Service f629e6
  )
Packit Service f629e6
  if test $gl_cv_sys_dir_fd_member_name != no_such_member; then
Packit Service f629e6
    AC_DEFINE_UNQUOTED([DIR_FD_MEMBER_NAME],
Packit Service f629e6
      [$gl_cv_sys_dir_fd_member_name],
Packit Service f629e6
      [the name of the file descriptor member of DIR])
Packit Service f629e6
  fi
Packit Service f629e6
  AH_VERBATIM([DIR_TO_FD],
Packit Service f629e6
              [#ifdef DIR_FD_MEMBER_NAME
Packit Service f629e6
# define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME)
Packit Service f629e6
#else
Packit Service f629e6
# define DIR_TO_FD(Dir_p) -1
Packit Service f629e6
#endif
Packit Service f629e6
])
Packit Service f629e6
])