# HG changeset patch # User Gerd Moellmann # Date 974291674 0 # Node ID 280f5481715b0974223e3cd0c62fe00841b24155 # Parent daa344c3f13241ead0ca7ac5ea9b3d964b36665c (directory_files_internal) [EAGAIN || EINTR]: Retry reading the directory if readdir returns null and errno is EAGAIN or EINTR. diff -r daa344c3f132 -r 280f5481715b src/dired.c --- 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);