# HG changeset patch # User Eric Blake # Date 1296018376 25200 # Node ID 7b83eb00e47a2b93aaab6319e281cab0e6aa1f85 # Parent bfe8b07257a3f8197590e58a579fcfdb1fd5fa9f fcntl: work around Haiku F_DUPFD bugs * m4/fcntl.m4 (gl_FUNC_FCNTL): Also catch Haiku errno bug. * lib/fcntl.c (rpl_fcntl) [F_DUPFD]: Work around Haiku losing cloexec bit on duplication. * doc/posix-functions/fcntl.texi (fcntl): Document the bug. Signed-off-by: Eric Blake diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2011-01-26 Eric Blake + + fcntl: work around Haiku F_DUPFD bugs + * m4/fcntl.m4 (gl_FUNC_FCNTL): Also catch Haiku errno bug. + * lib/fcntl.c (rpl_fcntl) [F_DUPFD]: Work around Haiku losing + cloexec bit on duplication. + * doc/posix-functions/fcntl.texi (fcntl): Document the bug. + 2011-01-26 Bruno Haible Enable memory leak tests on AIX. diff --git a/doc/posix-functions/fcntl.texi b/doc/posix-functions/fcntl.texi --- a/doc/posix-functions/fcntl.texi +++ b/doc/posix-functions/fcntl.texi @@ -19,7 +19,12 @@ @item The @code{F_DUPFD} action of this function does not reject out-of-range targets properly on some platforms: -Cygwin 1.5.x. +Cygwin 1.5.x, Haiku. + +@item +The @code{F_DUPFD} action of this function mistakenly clears +FD_CLOEXEC on the source descriptor on some platforms: +Haiku. @item This function is missing on some platforms: diff --git a/lib/fcntl.c b/lib/fcntl.c --- a/lib/fcntl.c +++ b/lib/fcntl.c @@ -187,7 +187,21 @@ errno = EINVAL; else { + /* Haiku alpha 2 loses fd flags on original. */ + int flags = fcntl (fd, F_GETFD); + if (flags < 0) + { + result = -1; + break; + } result = fcntl (fd, action, target); + if (0 <= result && fcntl (fd, F_SETFD, flags) == -1) + { + int saved_errno = errno; + close (result); + result = -1; + errno = saved_errno; + } # if REPLACE_FCHDIR if (0 <= result) result = _gl_register_dup (fd, result); diff --git a/m4/fcntl.m4 b/m4/fcntl.m4 --- a/m4/fcntl.m4 +++ b/m4/fcntl.m4 @@ -1,4 +1,4 @@ -# fcntl.m4 serial 3 +# fcntl.m4 serial 4 dnl Copyright (C) 2009-2011 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -24,11 +24,16 @@ gl_REPLACE_FCNTL else dnl cygwin 1.5.x F_DUPFD has wrong errno, and allows negative target + dnl haiku alpha 2 F_DUPFD has wrong errno AC_CACHE_CHECK([whether fcntl handles F_DUPFD correctly], [gl_cv_func_fcntl_f_dupfd_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include -]], [[return fcntl (0, F_DUPFD, -1) != -1; +#include +]], [[int result = 0; + if (fcntl (0, F_DUPFD, -1) != -1) result |= 1; + if (errno != EINVAL) result |= 2; + return result; ]])], [gl_cv_func_fcntl_f_dupfd_works=yes], [gl_cv_func_fcntl_f_dupfd_works=no],