2009-12-08 Eric Blake <ebb9@byu.net>
+ fchdir: fix logic bugs
+ * m4/fchdir.m4 (gl_FUNC_FCHDIR): Fix logic bug.
+ * tests/test-fchdir.c (main): Enhance test.
+ * lib/fchdir.c (rpl_fstat): Always provide if fchdir replacement
+ is in use.
+
dup2: fix logic bugs
* lib/dup2.c (dup2): Fix logic bugs. Use HAVE_DUP2 rather than
REPLACE_DUP2 to decide when rpl_dup2 is needed.
/* Return stat information about FD in STATBUF. Needed when
rpl_open() used a dummy file to work around an open() that can't
normally visit directories. */
-#if REPLACE_OPEN_DIRECTORY
-# undef fstat
+#undef fstat
int
rpl_fstat (int fd, struct stat *statbuf)
{
- if (0 <= fd && fd < dirs_allocated && dirs[fd].name != NULL)
+ if (REPLACE_OPEN_DIRECTORY
+ && 0 <= fd && fd < dirs_allocated && dirs[fd].name != NULL)
return stat (dirs[fd].name, statbuf);
return fstat (fd, statbuf);
}
-#endif
/* Override opendir() and closedir(), to keep track of the open file
descriptors. Needed because there is a function dirfd(). */
-# fchdir.m4 serial 10
+# fchdir.m4 serial 11
dnl Copyright (C) 2006-2009 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
AC_CACHE_CHECK([whether open can visit directories],
[gl_cv_func_open_directory_works],
[AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <fcntl.h>
-]], [return open(".", O_RDONLY);])],
+]], [return open(".", O_RDONLY) < 0;])],
[gl_cv_func_open_directory_works=yes],
[gl_cv_func_open_directory_works=no],
[gl_cv_func_open_directory_works="guessing no"])])
#include <stdlib.h>
#include <string.h>
+#include "cloexec.h"
+
#define ASSERT(expr) \
do \
{ \
int new_fd = dup (fd);
ASSERT (0 <= new_fd);
ASSERT (close (fd) == 0);
- fd = new_fd;
+ ASSERT (dup2 (new_fd, fd) == fd);
+ ASSERT (close (new_fd) == 0);
+ ASSERT (dup_cloexec (fd) == new_fd);
+ ASSERT (dup2 (new_fd, fd) == fd);
+ ASSERT (close (new_fd) == 0);
}
}