diff --git a/apps/init.cpp b/apps/init.cpp index cc7a8e69..dbb722ea 100644 --- a/apps/init.cpp +++ b/apps/init.cpp @@ -224,7 +224,7 @@ static Result load_services() { auto dir = TRY(os::Directory::open("/etc/init")); - auto services = TRY(dir->list(os::Directory::Filter::ParentAndBase)); + auto services = TRY(dir->list_names(os::Directory::Filter::ParentAndBase)); sort(services.begin(), services.end(), String::compare); for (const auto& entry : services) TRY(load_service({ dir->fd(), entry.view() })); diff --git a/libos/include/os/Directory.h b/libos/include/os/Directory.h index 6f295ff0..d2eeb195 100644 --- a/libos/include/os/Directory.h +++ b/libos/include/os/Directory.h @@ -21,7 +21,17 @@ namespace os Result next(Filter filter); - Result> list(Filter filter); + Result> list_names(Filter filter); + + struct Entry + { + String name; + mode_t mode; + usize size; + time_t mtime; + }; + + Result> list(Filter filter); void rewind(); diff --git a/libos/src/Directory.cpp b/libos/src/Directory.cpp index 55c599f0..78716eb2 100644 --- a/libos/src/Directory.cpp +++ b/libos/src/Directory.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -54,7 +55,7 @@ namespace os return String::from_cstring(ent->d_name); } - Result> Directory::list(Filter filter) + Result> Directory::list_names(Filter filter) { Vector result; @@ -66,6 +67,31 @@ namespace os return result; } + Result> Directory::list(Filter filter) + { + Vector result; + + rewind(); + + String name {}; + while ((name = TRY(next(filter))), !name.is_empty()) + { + struct stat st; + TRY(FileSystem::stat({ dirfd(m_dirp), name.chars() }, st, false)); + + Directory::Entry entry { + .name = move(name), + .mode = st.st_mode, + .size = (usize)st.st_size, + .mtime = st.st_mtime, + }; + + TRY(result.try_append(move(entry))); + } + + return result; + } + void Directory::rewind() { rewinddir(m_dirp); diff --git a/libos/src/FileSystem.cpp b/libos/src/FileSystem.cpp index 5b6dc748..f86de484 100644 --- a/libos/src/FileSystem.cpp +++ b/libos/src/FileSystem.cpp @@ -62,7 +62,7 @@ namespace os::FileSystem auto dir = TRY(os::Directory::open(path)); - Vector entries = TRY(dir->list(os::Directory::Filter::ParentAndBase)); + Vector entries = TRY(dir->list_names(os::Directory::Filter::ParentAndBase)); for (const auto& entry : entries) { TRY(remove_tree({ dir->fd(), entry.view() })); }