summaryrefslogtreecommitdiff
path: root/src/rm.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>1997-10-19 03:09:40 +0000
committerJim Meyering <jim@meyering.net>1997-10-19 03:09:40 +0000
commita7e650ac125477a58e335da72265a14f6eb531d7 (patch)
tree49c6ee2dddeeab85b84ae4a403c3d96324d8fb14 /src/rm.c
parent53e807719a85db054b9a457f9001f620caf53ec1 (diff)
downloadcoreutils-a7e650ac125477a58e335da72265a14f6eb531d7.tar.xz
(remove_cwd_entries): Entries in table of processed dir
entries are not malloc'd, so don't have hash cleanup free them. Rewind dirp upon NULL readdir, required for at least SunOS.
Diffstat (limited to 'src/rm.c')
-rw-r--r--src/rm.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/rm.c b/src/rm.c
index 29b6f1200..a333cd1a9 100644
--- a/src/rm.c
+++ b/src/rm.c
@@ -573,17 +573,30 @@ remove_cwd_entries (void)
enum RM_status tmp_status;
struct dirent *dp;
+/* FILE should be skipped if it is `.' or `..', or if it is in
+ the table, HT, of entries we've already processed. */
+#define SKIPPABLE(Ht, File) (DOT_OR_DOTDOT(File) \
+ || (Ht && hash_query_in_table (Ht, File)))
+
dp = readdir (dirp);
if (dp == NULL)
- break;
+ {
+ /* Since we have probably modified the directory since it
+ was opened, readdir returning NULL does not necessarily
+ mean we have read the last entry. Rewind it and check
+ again. This happens on SunOS4.1.4 with 254 or more files
+ in a directory. */
+ rewinddir (dirp);
+ while ((dp = readdir (dirp)) && SKIPPABLE (ht, dp->d_name))
+ {
+ /* empty */
+ }
+ }
- /* Skip this entry if it's `.' or `..'. */
- if (DOT_OR_DOTDOT (dp->d_name))
- continue;
+ if (dp == NULL)
+ break;
- /* Skip this entry if it's in the table of ones we've already
- processed. */
- if (ht && hash_query_in_table (ht, (dp)->d_name))
+ if (SKIPPABLE (ht, dp->d_name))
continue;
fspec_init_dp (&fs, dp);
@@ -611,7 +624,7 @@ remove_cwd_entries (void)
if (ht == NULL)
{
- ht = hash_initialize (HT_INITIAL_CAPACITY, free,
+ ht = hash_initialize (HT_INITIAL_CAPACITY, NULL,
hash_pjw, hash_compare_strings);
if (ht == NULL)
error (1, 0, _("Memory exhausted"));