dup2.m4 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #serial 16
  2. dnl Copyright (C) 2002, 2005, 2007, 2009-2011 Free Software Foundation, Inc.
  3. dnl This file is free software; the Free Software Foundation
  4. dnl gives unlimited permission to copy and/or distribute it,
  5. dnl with or without modifications, as long as this notice is preserved.
  6. AC_DEFUN([gl_FUNC_DUP2],
  7. [
  8. AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
  9. AC_REQUIRE([AC_CANONICAL_HOST])
  10. m4_ifdef([gl_FUNC_DUP2_OBSOLETE], [
  11. AC_CHECK_FUNCS_ONCE([dup2])
  12. if test $ac_cv_func_dup2 = no; then
  13. HAVE_DUP2=0
  14. fi
  15. ], [
  16. AC_DEFINE([HAVE_DUP2], [1], [Define to 1 if you have the 'dup2' function.])
  17. ])
  18. if test $HAVE_DUP2 = 1; then
  19. AC_CACHE_CHECK([whether dup2 works], [gl_cv_func_dup2_works],
  20. [AC_RUN_IFELSE([
  21. AC_LANG_PROGRAM([[#include <unistd.h>
  22. #include <fcntl.h>
  23. #include <errno.h>]],
  24. [int result = 0;
  25. #ifdef FD_CLOEXEC
  26. if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1)
  27. result |= 1;
  28. #endif
  29. if (dup2 (1, 1) == 0)
  30. result |= 2;
  31. #ifdef FD_CLOEXEC
  32. if (fcntl (1, F_GETFD) != FD_CLOEXEC)
  33. result |= 4;
  34. #endif
  35. close (0);
  36. if (dup2 (0, 0) != -1)
  37. result |= 8;
  38. /* Many gnulib modules require POSIX conformance of EBADF. */
  39. if (dup2 (2, 1000000) == -1 && errno != EBADF)
  40. result |= 16;
  41. return result;
  42. ])
  43. ],
  44. [gl_cv_func_dup2_works=yes], [gl_cv_func_dup2_works=no],
  45. [case "$host_os" in
  46. mingw*) # on this platform, dup2 always returns 0 for success
  47. gl_cv_func_dup2_works=no;;
  48. cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0
  49. gl_cv_func_dup2_works=no;;
  50. linux*) # On linux between 2008-07-27 and 2009-05-11, dup2 of a
  51. # closed fd may yield -EBADF instead of -1 / errno=EBADF.
  52. gl_cv_func_dup2_works=no;;
  53. freebsd*) # on FreeBSD 6.1, dup2(1,1000000) gives EMFILE, not EBADF.
  54. gl_cv_func_dup2_works=no;;
  55. haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC.
  56. gl_cv_func_dup2_works=no;;
  57. *) gl_cv_func_dup2_works=yes;;
  58. esac])
  59. ])
  60. if test "$gl_cv_func_dup2_works" = no; then
  61. REPLACE_DUP2=1
  62. fi
  63. fi
  64. dnl Replace dup2() for supporting the gnulib-defined fchdir() function,
  65. dnl to keep fchdir's bookkeeping up-to-date.
  66. m4_ifdef([gl_FUNC_FCHDIR], [
  67. gl_TEST_FCHDIR
  68. if test $HAVE_FCHDIR = 0; then
  69. REPLACE_DUP2=1
  70. fi
  71. ])
  72. ])
  73. # Prerequisites of lib/dup2.c.
  74. AC_DEFUN([gl_PREREQ_DUP2], [])