and treat it as an EOF return.
* sysdeps/unix/readdir_r.c: Likewise.
2002-08-27 Roland McGrath <roland@redhat.com>
+ * sysdeps/unix/readdir.c: If getdents fails with ENOENT, restore errno
+ and treat it as an EOF return.
+ * sysdeps/unix/readdir_r.c: Likewise.
+
* sysdeps/gnu/errlist-compat.awk: Include <bits/wordsize.h> in output.
From Alexandre Oliva <aoliva@redhat.com>.
* sysdeps/gnu/errlist-compat.c: Regenerated.
-/* Copyright (C) 1991,92,93,94,95,96,97,99,2000 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,93,94,95,96,97,99,2000,02
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
bytes = __GETDENTS (dirp->fd, dirp->data, maxread);
if (bytes <= 0)
{
+ /* On some systems getdents fails with ENOENT when the
+ open directory has been rmdir'd already. POSIX.1
+ requires that we treat this condition like normal EOF. */
+ if (bytes < 0 && errno == ENOENT)
+ bytes = 0;
+
/* Don't modifiy errno when reaching EOF. */
if (bytes == 0)
__set_errno (saved_errno);
-/* Copyright (C) 1991,92,93,94,95,96,97,98,99,2000 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,93,94,95,96,97,98,99,2000,02
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
{
DIRENT_TYPE *dp;
size_t reclen;
+ const int saved_errno = errno;
__libc_lock_lock (dirp->lock);
bytes = __GETDENTS (dirp->fd, dirp->data, maxread);
if (bytes <= 0)
{
+ /* On some systems getdents fails with ENOENT when the
+ open directory has been rmdir'd already. POSIX.1
+ requires that we treat this condition like normal EOF. */
+ if (bytes < 0 && errno == ENOENT)
+ {
+ bytes = 0;
+ __set_errno (saved_errno);
+ }
+
dp = NULL;
/* Reclen != 0 signals that an error occurred. */
reclen = bytes != 0;