* sysdeps/unix/readdir.c: If getdents fails with ENOENT, restore errno
authorRoland McGrath <roland@gnu.org>
Wed, 28 Aug 2002 03:26:52 +0000 (03:26 +0000)
committerRoland McGrath <roland@gnu.org>
Wed, 28 Aug 2002 03:26:52 +0000 (03:26 +0000)
and treat it as an EOF return.
* sysdeps/unix/readdir_r.c: Likewise.

ChangeLog
sysdeps/unix/readdir.c
sysdeps/unix/readdir_r.c

index 2356fda..8154f91 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 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.
index dc015d2..4a0f089 100644 (file)
@@ -1,4 +1,5 @@
-/* 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
@@ -64,6 +65,12 @@ __READDIR (DIR *dirp)
          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);
index f4d7aad..f84709e 100644 (file)
@@ -1,4 +1,5 @@
-/* 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
@@ -40,6 +41,7 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result)
 {
   DIRENT_TYPE *dp;
   size_t reclen;
+  const int saved_errno = errno;
 
   __libc_lock_lock (dirp->lock);
 
@@ -62,6 +64,15 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result)
          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;