Mercurial > emacs
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);