Skip to content

Commit 143de49

Browse files
committed
fix on path Walker
1 parent 30f0b3b commit 143de49

3 files changed

Lines changed: 25 additions & 23 deletions

File tree

fs/localfs.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,8 +316,9 @@ namespace fs
316316
virtual dirent* get() override
317317
{
318318
if (direntp) {
319-
memcpy(&m_dirent, direntp, sizeof(m_dirent));
320-
return &m_dirent;
319+
memcpy(&m_dirent, direntp,
320+
std::min(sizeof(m_dirent), (size_t)direntp->d_reclen));
321+
return &m_dirent;
321322
}
322323
return direntp;
323324
}

fs/path.cpp

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,14 @@ namespace fs
254254
}
255255
int ret = next();
256256
if (ret < 0)
257-
m_path = {0, 0};
257+
m_path_len = 0;
258258
}
259259
int Walker::enter_dir()
260260
{
261261
auto dir = m_filesystem->opendir(m_path_buffer);
262262
if (!dir)
263-
LOG_ERRNO_RETURN(0, -1, "failed to opendir(`)", m_path);
263+
LOG_ERRNO_RETURN(0, -1, "failed to opendir(`)",
264+
std::string_view(m_path_buffer, m_path_len));
264265
m_stack.emplace(dir);
265266
return 0;
266267
}
@@ -273,36 +274,36 @@ namespace fs
273274
struct stat st;
274275
auto ret = m_filesystem->lstat(m_path_buffer, &st);
275276
if (ret < 0)
276-
LOG_ERRNO_RETURN(0, -1, "failed to lstat '`'", m_path);
277+
LOG_ERRNO_RETURN(0, -1, "failed to lstat '`'",
278+
std::string_view(m_path_buffer, m_path_len));
277279
return S_ISDIR(st.st_mode);
278280
}
279281
return 0;
280282
}
281-
void Walker::path_push_back(string_view s)
282-
{
283-
auto len0 = m_path.length();
283+
void Walker::path_push_back(string_view s) {
284+
auto len0 = m_path_len;
284285
auto len1 = s.length();
285286
assert(len0 + len1 < sizeof(m_path_buffer) - 1);
286287
memcpy(m_path_buffer + len0, s.data(), len1 + 1);
287-
m_path = string_view(m_path_buffer, len0 + len1);
288+
m_path_len = len0 + len1;
288289
}
289-
void Walker::path_pop_back(size_t len1)
290-
{
291-
auto len0 = m_path.length();
290+
void Walker::path_pop_back(size_t len1) {
291+
auto len0 = m_path_len;
292292
assert(len0 > len1);
293293
len0 -= len1;
294294
m_path_buffer[len0] = '\0';
295-
m_path = string_view(m_path_buffer, len0);
295+
m_path_len = len0;
296296
}
297297
int Walker::next()
298298
{
299299
again:
300-
if (m_path.empty()) return -1;
301-
if (m_path.back() != '/')
300+
if (m_path_len == 0) return -1;
301+
std::string_view path(m_path_buffer, m_path_len);
302+
if (path.back() != '/')
302303
{
303-
auto m = m_path.rfind('/');
304-
if (m != m_path.npos) {
305-
auto len0 = m_path.length();
304+
auto m = path.rfind('/');
305+
if (m != path.npos) {
306+
auto len0 = path.length();
306307
path_pop_back(len0 - m - 1);
307308
m_stack.top()->next();
308309
}
@@ -321,10 +322,10 @@ namespace fs
321322
m_stack.pop();
322323
if (m_stack.empty())
323324
{
324-
m_path.remove_prefix(m_path.length());
325+
m_path_len = 0;
325326
return -1; // finished walking
326327
}
327-
assert(m_path.back() == '/');
328+
assert(m_path_buffer[m_path_len - 1] == '/');
328329
path_pop_back(1);
329330
goto again;
330331
}

fs/path.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,13 @@ namespace fs
168168
{
169169
public:
170170
Walker(IFileSystem* fs, string_view path);
171-
string_view path() { return m_path; }
171+
string_view path() { return {m_path_buffer, m_path_len}; }
172172
string_view get() { return path(); }
173-
bool valid() { return !m_path.empty(); }
173+
bool valid() { return m_path_len; }
174174
int next();
175175

176176
protected:
177-
string_view m_path;
177+
size_t m_path_len = 0;
178178
IFileSystem* m_filesystem;
179179
std::stack<std::unique_ptr<DIR>> m_stack;
180180
char m_path_buffer[PATH_MAX];

0 commit comments

Comments
 (0)