diff options
author | Roman Perepelitsa <roman.perepelitsa@gmail.com> | 2021-08-18 18:05:04 +0300 |
---|---|---|
committer | Roman Perepelitsa <roman.perepelitsa@gmail.com> | 2021-08-18 18:05:04 +0300 |
commit | ec44300155e99268cb2b23deb7e789d0bb4b1723 (patch) | |
tree | 766bee13af37a2cab40fe5ceadbf7cb5b9d7b6b4 /gitstatus/src/dir.cc | |
parent | 25e5f5985f0b977461c0d14663a910363684014e (diff) | |
parent | 80ec734a953d930838ea6839923c97c3da880a0d (diff) |
Merge commit '80ec734a953d930838ea6839923c97c3da880a0d'
Diffstat (limited to 'gitstatus/src/dir.cc')
-rw-r--r-- | gitstatus/src/dir.cc | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/gitstatus/src/dir.cc b/gitstatus/src/dir.cc index e7ce7141..39cf1c2c 100644 --- a/gitstatus/src/dir.cc +++ b/gitstatus/src/dir.cc @@ -106,14 +106,14 @@ bool ListDir(int dir_fd, Arena& arena, std::vector<char*>& entries, bool precomp }; constexpr size_t kBufSize = 8 << 10; - entries.clear(); + const size_t orig_size = entries.size(); while (true) { char* buf = static_cast<char*>(arena.Allocate(kBufSize, alignof(linux_dirent64))); // Save 256 bytes for the rainy day. int n = syscall(SYS_getdents64, dir_fd, buf, kBufSize - 256); if (n < 0) { - entries.clear(); + entries.resize(orig_size); return false; } for (int pos = 0; pos < n;) { @@ -131,9 +131,9 @@ bool ListDir(int dir_fd, Arena& arena, std::vector<char*>& entries, bool precomp } if (case_sensitive) { - SortEntries<true>(entries.data(), entries.data() + entries.size()); + SortEntries<true>(entries.data() + orig_size, entries.data() + entries.size()); } else { - SortEntries<false>(entries.data(), entries.data() + entries.size()); + SortEntries<false>(entries.data() + orig_size, entries.data() + entries.size()); } return true; @@ -211,7 +211,7 @@ char* DirenvConvert(Arena& arena, struct dirent& ent, bool do_convert) { bool ListDir(int dir_fd, Arena& arena, std::vector<char*>& entries, bool precompose_unicode, bool case_sensitive) { - entries.clear(); + const size_t orig_size = entries.size(); dir_fd = dup(dir_fd); if (dir_fd < 0) return false; DIR* dir = fdopendir(dir_fd); @@ -225,10 +225,10 @@ bool ListDir(int dir_fd, Arena& arena, std::vector<char*>& entries, bool precomp entries.push_back(DirenvConvert(arena, *ent, precompose_unicode)); } if (errno) { - entries.clear(); + entries.resize(orig_size); return false; } - StrSort(entries.data(), entries.data() + entries.size(), case_sensitive); + StrSort(entries.data() + orig_size, entries.data() + entries.size(), case_sensitive); return true; } |