changeset 33497:280f5481715b

(directory_files_internal) [EAGAIN || EINTR]: Retry reading the directory if readdir returns null and errno is EAGAIN or EINTR.
author Gerd Moellmann <gerd@gnu.org>
date Wed, 15 Nov 2000 12:34:34 +0000
parents daa344c3f132
children 02bf0aa33c9f
files src/dired.c
diffstat 1 files changed, 17 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/dired.c	Tue Nov 14 20:11:23 2000 +0000
+++ b/src/dired.c	Wed Nov 15 12:34:34 2000 +0000
@@ -144,6 +144,8 @@
   int needsep = 0;
   int count = specpdl_ptr - specpdl;
   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+  DIRENTRY *dp;
+  int retry_p;
 
   /* Because of file name handlers, these functions might call
      Ffuncall, and cause a GC.  */
@@ -182,6 +184,8 @@
      an error is signaled while the directory stream is open, we
      have to make sure it gets closed, and setting up an
      unwind_protect to do so would be a pain.  */
+ retry:
+  
   d = opendir (XSTRING (dirfilename)->data);
   if (d == NULL)
     report_file_error ("Opening directory", Fcons (directory, Qnil));
@@ -203,14 +207,9 @@
     needsep = 1;
 #endif /* not VMS */
 
-  /* Loop reading blocks */
-  while (1)
+  /* Loop reading blocks until EOF or error.  */
+  while ((dp = readdir (d)) != NULL)
     {
-      DIRENTRY *dp = readdir (d);
-
-      if (dp == NULL)
-	break;
-      
       if (DIRENTRY_NONEMPTY (dp))
 	{
 	  int len;
@@ -295,11 +294,22 @@
 	}
     }
 
+  retry_p = 0;
+#ifdef EAGAIN
+  retry_p |= errno == EAGAIN;
+#endif
+#ifdef EINTR
+  retry_p |= errno == EINTR;
+#endif
+
   closedir (d);
 
   /* Discard the unwind protect.  */
   specpdl_ptr = specpdl + count;
 
+  if (retry_p)
+    goto retry;
+
   if (NILP (nosort))
     list = Fsort (Fnreverse (list),
 		  attrs ? Qfile_attributes_lessp : Qstring_lessp);