Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions fs/localfs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,8 +316,9 @@ namespace fs
virtual dirent* get() override
{
if (direntp) {
memcpy(&m_dirent, direntp, sizeof(m_dirent));
return &m_dirent;
memcpy(&m_dirent, direntp,
std::min(sizeof(m_dirent), (size_t)direntp->d_reclen));
return &m_dirent;
}
return direntp;
}
Expand Down
37 changes: 19 additions & 18 deletions fs/path.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -254,13 +254,14 @@ namespace fs
}
int ret = next();
if (ret < 0)
m_path = {0, 0};
m_path_len = 0;
}
int Walker::enter_dir()
{
auto dir = m_filesystem->opendir(m_path_buffer);
if (!dir)
LOG_ERRNO_RETURN(0, -1, "failed to opendir(`)", m_path);
LOG_ERRNO_RETURN(0, -1, "failed to opendir(`)",
std::string_view(m_path_buffer, m_path_len));
m_stack.emplace(dir);
return 0;
}
Expand All @@ -273,36 +274,36 @@ namespace fs
struct stat st;
auto ret = m_filesystem->lstat(m_path_buffer, &st);
if (ret < 0)
LOG_ERRNO_RETURN(0, -1, "failed to lstat '`'", m_path);
LOG_ERRNO_RETURN(0, -1, "failed to lstat '`'",
std::string_view(m_path_buffer, m_path_len));
return S_ISDIR(st.st_mode);
}
return 0;
}
void Walker::path_push_back(string_view s)
{
auto len0 = m_path.length();
void Walker::path_push_back(string_view s) {
auto len0 = m_path_len;
auto len1 = s.length();
assert(len0 + len1 < sizeof(m_path_buffer) - 1);
memcpy(m_path_buffer + len0, s.data(), len1 + 1);
m_path = string_view(m_path_buffer, len0 + len1);
m_path_len = len0 + len1;
}
void Walker::path_pop_back(size_t len1)
{
auto len0 = m_path.length();
void Walker::path_pop_back(size_t len1) {
auto len0 = m_path_len;
assert(len0 > len1);
len0 -= len1;
m_path_buffer[len0] = '\0';
m_path = string_view(m_path_buffer, len0);
m_path_len = len0;
}
int Walker::next()
{
again:
if (m_path.empty()) return -1;
if (m_path.back() != '/')
if (m_path_len == 0) return -1;
std::string_view path(m_path_buffer, m_path_len);
if (path.back() != '/')
{
auto m = m_path.rfind('/');
if (m != m_path.npos) {
auto len0 = m_path.length();
auto m = path.rfind('/');
if (m != path.npos) {
auto len0 = path.length();
path_pop_back(len0 - m - 1);
m_stack.top()->next();
}
Expand All @@ -321,10 +322,10 @@ namespace fs
m_stack.pop();
if (m_stack.empty())
{
m_path.remove_prefix(m_path.length());
m_path_len = 0;
return -1; // finished walking
}
assert(m_path.back() == '/');
assert(m_path_buffer[m_path_len - 1] == '/');
path_pop_back(1);
goto again;
}
Expand Down
10 changes: 7 additions & 3 deletions fs/path.h
Original file line number Diff line number Diff line change
Expand Up @@ -168,13 +168,17 @@ namespace fs
{
public:
Walker(IFileSystem* fs, string_view path);
string_view path() { return m_path; }
string_view path() { return {m_path_buffer, m_path_len}; }
string_view get() { return path(); }
bool valid() { return !m_path.empty(); }
bool valid() { return m_path_len; }
int next();

protected:
string_view m_path;
<<<<<<< HEAD
size_t m_path_len;
=======
size_t m_path_len = 0;
>>>>>>> 143de49 (fix on path Walker)
IFileSystem* m_filesystem;
std::stack<std::unique_ptr<DIR>> m_stack;
char m_path_buffer[PATH_MAX];
Expand Down
Loading