summaryrefslogtreecommitdiff
path: root/src/dired.c
diff options
context:
space:
mode:
authorGerd Moellmann <gerd@gnu.org>2001-03-08 14:16:36 +0000
committerGerd Moellmann <gerd@gnu.org>2001-03-08 14:16:36 +0000
commita129898ea0ceab3773edd12673e44e3a5c12a38f (patch)
tree4ce6ab62c0c4f181e20852f34312d6c957951bc4 /src/dired.c
parenta047042afe970998d3db99a98238bf6e647e75b8 (diff)
downloademacs-a129898ea0ceab3773edd12673e44e3a5c12a38f.tar.gz
(directory_files_internal): Handle EAGAIN more
efficiently.
Diffstat (limited to 'src/dired.c')
-rw-r--r--src/dired.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/dired.c b/src/dired.c
index ce2e5cb95b2..9deb44d3914 100644
--- a/src/dired.c
+++ b/src/dired.c
@@ -133,6 +133,7 @@ directory_files_internal_unwind (dh)
/* Function shared by Fdirectory_files and Fdirectory_files_and_attributes.
When ATTRS is zero, return a list of directory filenames; when
non-zero, return a list of directory filenames and their attributes. */
+
Lisp_Object
directory_files_internal (directory, full, match, nosort, attrs)
Lisp_Object directory, full, match, nosort;
@@ -209,9 +210,19 @@ directory_files_internal (directory, full, match, nosort, attrs)
#endif /* not VMS */
/* Loop reading blocks until EOF or error. */
- errno = 0;
- while ((dp = readdir (d)) != NULL)
+ for (;;)
{
+ errno = 0;
+ dp = readdir (d);
+
+#ifdef EAGAIN
+ if (dp == NULL && errno == EAGAIN)
+ continue;
+#endif
+
+ if (dp == NULL)
+ break;
+
if (DIRENTRY_NONEMPTY (dp))
{
int len;
@@ -299,9 +310,6 @@ directory_files_internal (directory, full, match, nosort, attrs)
}
retry_p = 0;
-#ifdef EAGAIN
- retry_p |= errno == EAGAIN;
-#endif
#ifdef EINTR
retry_p |= errno == EINTR;
#endif