From 601b1d5d9933a6e9fce9e78f9c70c6ad60b610eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Thu, 23 Jan 1997 20:11:08 +0100 Subject: [PATCH] Added several variants of readdir_r. Rev: src/modules/files/efuns.c:1.11 --- src/modules/files/efuns.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/modules/files/efuns.c b/src/modules/files/efuns.c index 75467c2094..19fc4013c7 100644 --- a/src/modules/files/efuns.c +++ b/src/modules/files/efuns.c @@ -194,18 +194,49 @@ void f_get_dir(INT32 args) int e; int num_files=0; char *bufptr=buffer; + int err; THREADS_ALLOW(); while(1) { /* Should have code for the POSIX variant here also */ +#ifdef HAVE_SOLARIS_READDIR_R + /* Solaris readdir_r returns the second arg on success, + * and returns NULL on error or at end of dir. + */ do { d=readdir_r(dir, tmp); } while ((!d) && ((errno == EAGAIN)||(errno == EINTR))); if (!d) { + /* Solaris readdir_r seems to set errno to ENOENT sometimes. + */ + err = (errno == ENOENT)?0:errno; break; } +#elif defined(HAVE_HPUX_READDIR_R) + /* HPUX's readdir_r returns an int instead: + * + * 0 - Successfull operation. + * -1 - End of directory or encountered an error (sets errno). + */ + if (readdir_r(dir, tmp)) { + d = NULL; + err = errno; + break; + } else { + d = tmp; + } +#elif defined(HAVE_POSIX_READDIR_R) + /* POSIX readdir_r returns 0 on success, and ERRNO on failure. + * at end of dir it sets the third arg to NULL. + */ + if ((err = readdir_r(dir, tmp, &d)) || !d) { + break; + } +#else +#error Unknown readdir_r variant +#endif if(d->d_name[0]=='.') { if(!d->d_name[1]) continue; @@ -220,8 +251,8 @@ void f_get_dir(INT32 args) num_files++; } THREADS_DISALLOW(); - if ((!d) && (errno != ENOENT)) { - error("get_dir(): readdir_r() failed: %d\n", errno); + if ((!d) && err) { + error("get_dir(): readdir_r() failed: %d\n", err); } for(e=0;e<num_files;e++) { -- GitLab