hrev54456 adds 1 changeset to branch 'master'
old head: f79386adb739142a42fe95fcda428c42878cd252
new head: 788899a8c2ecd992efec63d9b0e614a4f988db07
overview:
https://git.haiku-os.org/haiku/log/?qt=range&q=788899a8c2ec+%5Ef79386adb739
----------------------------------------------------------------------------
788899a8c2ec: ufs2: All directories are read sucessfully.
Change-Id: I87d3d77d48396ecd0e8fa649169f6e899d161f66
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3028
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>
[ Suhel Mehta <mehtasuhel@xxxxxxxxx> ]
----------------------------------------------------------------------------
Revision: hrev54456
Commit: 788899a8c2ecd992efec63d9b0e614a4f988db07
URL: https://git.haiku-os.org/haiku/commit/?id=788899a8c2ec
Author: Suhel Mehta <mehtasuhel@xxxxxxxxx>
Date: Sun Jul 12 18:48:29 2020 UTC
Committer: Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Wed Jul 22 07:42:04 2020 UTC
----------------------------------------------------------------------------
2 files changed, 29 insertions(+), 62 deletions(-)
.../file_systems/ufs2/DirectoryIterator.cpp | 86 ++++++--------------
.../kernel/file_systems/ufs2/DirectoryIterator.h | 5 +-
----------------------------------------------------------------------------
diff --git a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp
b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp
index 36dd4d3d82..272be1ad8e 100644
--- a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp
+++ b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp
@@ -10,7 +10,7 @@
#include "Inode.h"
-#define TRACE_UFS2
+//#define TRACE_UFS2
#ifdef TRACE_UFS2
# define TRACE(x...) dprintf("\33[34mufs2:\33[0m " x)
#else
@@ -24,12 +24,11 @@ DirectoryIterator::DirectoryIterator(Inode* inode)
:
fInode(inode)
{
+ fOffset = fInode->GetBlockPointer() * MINBSIZE;
TRACE("DirectoryIterator::DirectoryIterator() \n");
}
-int DirectoryIterator::countDir = 0;
-
DirectoryIterator::~DirectoryIterator()
{
}
@@ -45,86 +44,55 @@ DirectoryIterator::InitCheck()
status_t
DirectoryIterator::Lookup(const char* name, size_t length, ino_t* _id)
{
- int count = 0;
if (strcmp(name, ".") == 0) {
*_id = fInode->ID();
return B_OK;
- } else if (strcmp(name, "..") == 0) {
- if (fInode->ID() == 1)
- *_id = fInode->ID();
+ }
- /* else
- *_id = fInode->Parent();*/
+ char getname[B_FILE_NAME_LENGTH];
+ status_t status;
+ while(true) {
+ status = GetNext(getname, &length, _id);
+ if (status != B_OK)
+ return status;
+ if (strcmp(getname, name) == 0)
+ return B_OK;
}
- while(_GetNext(name, &length, _id, count) != B_OK) {
- count++;
- }
- return B_OK;
+
}
status_t
DirectoryIterator::GetNext(char* name, size_t* _nameLength, ino_t* _id)
{
- TRACE("In GetNext function\n");
- int64_t offset = fInode->GetBlockPointer() * MINBSIZE;
dir direct;
- dir_info direct_info;
int fd = fInode->GetVolume()->Device();
- if (read_pos(fd, offset, &direct_info,
- sizeof(dir_info)) != sizeof(dir_info)) {
- return B_BAD_DATA;
- }
- offset = offset + sizeof(dir_info) + 16 * countDir;
- if (read_pos(fd, offset, &direct, sizeof(dir)) != sizeof(dir)) {
+ if (read_pos(fd, fOffset, &direct, sizeof(dir)) != sizeof(dir)) {
return B_BAD_DATA;
}
- if (direct.next_ino != 0) {
- strlcpy(name, direct.name, sizeof(name));
- *_id = direct.next_ino;
- *_nameLength = direct.namlen;
- countDir++;
- return B_OK;
+ int remainder = direct.namlen % 4;
+ if(remainder != 0) {
+ remainder = 4 - remainder;
+ remainder = direct.namlen + remainder;
+ } else {
+ remainder = direct.namlen + 4;
}
- countDir = 0;
- return B_ENTRY_NOT_FOUND;
-}
+ fOffset = fOffset + 8 + remainder;
-status_t
-DirectoryIterator::_GetNext(const char* name, size_t* _nameLength,
- ino_t* _id, int count)
-{
- TRACE("In GetNext function\n");
- int64_t offset = fInode->GetBlockPointer() * MINBSIZE;
- dir direct;
- dir_info direct_info;
- int fd = fInode->GetVolume()->Device();
- if (read_pos(fd, offset, &direct_info,
- sizeof(dir_info)) != sizeof(dir_info)) {
- return B_BAD_DATA;
- }
- if(strcmp(name, "..") == 0)
- {
- *_id = direct_info.dotdot_ino;
- return B_OK;
- }
-
- offset = offset + sizeof(dir_info) + (16 * count);
- if (read_pos(fd, offset, &direct, sizeof(dir)) != sizeof(dir)) {
- return B_BAD_DATA;
- }
+ if (direct.next_ino > 0) {
+ TRACE("direct.next_ino %d\n",direct.next_ino);
- char getname;
- strlcpy(&getname, direct.name, sizeof(name));
- if(strcmp(name, &getname) == 0) {
+ strlcpy(name, direct.name, remainder);
*_id = direct.next_ino;
+ *_nameLength = direct.namlen;
return B_OK;
}
- else {
+
return B_ENTRY_NOT_FOUND;
- }
+
}
+
diff --git a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h
b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h
index 5da9f9fa0c..72fe3a744c 100644
--- a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h
+++ b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h
@@ -47,13 +47,12 @@ public:
status_t GetNext(char* name,
size_t* _nameLength,
ino_t* _id);
status_t _GetNext(const char*
name, size_t* _nameLength,
-
ino_t* _id, int count);
+
ino_t* _id, int64_t* offset);
dir* DirectContent() {
return direct; }
dir_info* DirectInfo() { return
direct_info; }
- static int countDir;
private:
-
+ int fCountDir;
int64 fOffset;
cluster_t fCluster;
Inode* fInode;