From d178a0d7e4d070ff809bc53da9aa0c9ef4dc412e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 1 Oct 2003 01:25:06 +0000 Subject: [PATCH] Implemented new Directory::IsEmpty() method. Amiga-FFS Directory::Lookup() now only creates a HashIterator if needed. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4887 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../file_systems/amiga_ffs/Directory.cpp | 16 +++++++++---- .../loader/file_systems/amiga_ffs/Directory.h | 1 + .../loader/file_systems/bfs/Directory.cpp | 24 +++++++++++++++++++ .../boot/loader/file_systems/bfs/Directory.h | 1 + 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/kernel/boot/loader/file_systems/amiga_ffs/Directory.cpp b/src/kernel/boot/loader/file_systems/amiga_ffs/Directory.cpp index 569fdccf5e..39e42c2c5d 100644 --- a/src/kernel/boot/loader/file_systems/amiga_ffs/Directory.cpp +++ b/src/kernel/boot/loader/file_systems/amiga_ffs/Directory.cpp @@ -80,15 +80,15 @@ Directory::Close(void *cookie) Node * Directory::Lookup(const char *name, bool traverseLinks) { - HashIterator iterator(fVolume.Device(), fNode); - if (iterator.InitCheck() != B_OK) - return NULL; - if (!strcmp(name, ".")) { Acquire(); return this; } + HashIterator iterator(fVolume.Device(), fNode); + if (iterator.InitCheck() != B_OK) + return NULL; + iterator.Goto(fNode.HashIndexFor(fVolume.Type(), name)); NodeBlock *node; @@ -140,6 +140,14 @@ Directory::Rewind(void *cookie) } +bool +Directory::IsEmpty() +{ + int32 index; + return fNode.FirstHashValue(index) == -1; +} + + status_t Directory::GetName(char *name, size_t size) const { diff --git a/src/kernel/boot/loader/file_systems/amiga_ffs/Directory.h b/src/kernel/boot/loader/file_systems/amiga_ffs/Directory.h index 0476dbcd37..62d61f36de 100644 --- a/src/kernel/boot/loader/file_systems/amiga_ffs/Directory.h +++ b/src/kernel/boot/loader/file_systems/amiga_ffs/Directory.h @@ -32,6 +32,7 @@ class Directory : public ::Directory { virtual status_t GetNextEntry(void *cookie, char *nameBuffer, size_t bufferSize); virtual status_t GetNextNode(void *cookie, Node **_node); virtual status_t Rewind(void *cookie); + virtual bool IsEmpty(); virtual status_t GetName(char *name, size_t size) const; diff --git a/src/kernel/boot/loader/file_systems/bfs/Directory.cpp b/src/kernel/boot/loader/file_systems/bfs/Directory.cpp index e2c69c1240..402764392b 100644 --- a/src/kernel/boot/loader/file_systems/bfs/Directory.cpp +++ b/src/kernel/boot/loader/file_systems/bfs/Directory.cpp @@ -128,6 +128,30 @@ Directory::Rewind(void *cookie) } +bool +Directory::IsEmpty() +{ + TreeIterator iterator(&fTree); + + // index and attribute directories are really empty when they are + // empty - directories for standard files always contain ".", and + // "..", so we need to ignore those two + + uint32 count = 0; + char name[BPLUSTREE_MAX_KEY_LENGTH]; + uint16 length; + off_t id; + while (iterator.GetNextEntry(name, &length, B_FILE_NAME_LENGTH, &id) == B_OK) { + if (fStream.Mode() & (S_ATTR_DIR | S_INDEX_DIR)) + return false; + + if (++count > 2 || strcmp(".", name) && strcmp("..", name)) + return false; + } + return true; +} + + status_t Directory::GetName(char *name, size_t size) const { diff --git a/src/kernel/boot/loader/file_systems/bfs/Directory.h b/src/kernel/boot/loader/file_systems/bfs/Directory.h index b252278f97..06555bc8ff 100644 --- a/src/kernel/boot/loader/file_systems/bfs/Directory.h +++ b/src/kernel/boot/loader/file_systems/bfs/Directory.h @@ -32,6 +32,7 @@ class Directory : public ::Directory { virtual status_t GetNextEntry(void *cookie, char *nameBuffer, size_t bufferSize); virtual status_t GetNextNode(void *cookie, Node **_node); virtual status_t Rewind(void *cookie); + virtual bool IsEmpty(); virtual status_t GetName(char *name, size_t size) const;