summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2003-05-02 10:44:32 +0000
committerJim Meyering <jim@meyering.net>2003-05-02 10:44:32 +0000
commit4f6fe96afec9b2693564131d5e135a6e193f5a71 (patch)
tree0553a397575fd10b228d6ef41e3279a91f2a2822
parente25854fbd7bb9a59908dd04ea39d8d23d4f765ae (diff)
downloadcoreutils-4f6fe96afec9b2693564131d5e135a6e193f5a71.tar.xz
Factor out common code.
(readdir_ignoring_dotdirs): New function. (is_empty_dir): Use it here. (remove_cwd_entries): Use it here.
-rw-r--r--src/remove.c49
1 files changed, 25 insertions, 24 deletions
diff --git a/src/remove.c b/src/remove.c
index eac7cfa10..a8be3dac9 100644
--- a/src/remove.c
+++ b/src/remove.c
@@ -508,34 +508,37 @@ AD_is_removable (Dirstack_state const *ds, char const *file)
return ! (top->unremovable && hash_lookup (top->unremovable, file));
}
+/* A wrapper for readdir so that callers don't see entries for `.' or `..'. */
+static struct dirent *
+readdir_ignoring_dotdirs (DIR *dirp)
+{
+ while (1)
+ {
+ struct dirent *dp = readdir (dirp);
+ if (dp == NULL || ! DOT_OR_DOTDOT (dp->d_name))
+ return dp;
+ }
+}
+
+/* Return nonzero if DIR is determined to be an empty directory
+ or if opendir or readdir fails. */
static bool
is_empty_dir (char const *dir)
{
DIR *dirp = opendir (dir);
+ struct dirent *dp;
+ int saved_errno;
+
if (dirp == NULL)
return false;
- while (1)
- {
- struct dirent *dp;
- const char *f;
-
- errno = 0;
- dp = readdir (dirp);
- if (dp == NULL)
- {
- int saved_errno = errno;
- closedir (dirp);
- return saved_errno == 0 ? true : false;
- }
-
- f = dp->d_name;
- if ( ! DOT_OR_DOTDOT (f))
- {
- closedir (dirp);
- return false;
- }
- }
+ errno = 0;
+ dp = readdir_ignoring_dotdirs (dirp);
+ saved_errno = errno;
+ closedir (dirp);
+ if (dp != NULL)
+ return false;
+ return saved_errno == 0 ? true : false;
}
/* Prompt whether to remove FILENAME, if required via a combination of
@@ -824,7 +827,7 @@ remove_cwd_entries (Dirstack_state *ds, char **subdir, struct stat *subdir_sb,
/* Set errno to zero so we can distinguish between a readdir failure
and when readdir simply finds that there are no more entries. */
errno = 0;
- if ((dp = readdir (dirp)) == NULL)
+ if ((dp = readdir_ignoring_dotdirs (dirp)) == NULL)
{
if (errno)
{
@@ -840,8 +843,6 @@ remove_cwd_entries (Dirstack_state *ds, char **subdir, struct stat *subdir_sb,
}
f = dp->d_name;
- if (DOT_OR_DOTDOT (f))
- continue;
/* Skip files we've already tried/failed to remove. */
if ( ! AD_is_removable (ds, f))