blob: 1397dca12710922aff9878721d71e063cc91da59 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "peridot/bin/ledger/filesystem/directory_reader.h"
#include <dirent.h>
#include <fcntl.h>
#include <functional>
#include <memory>
#include <lib/fit/function.h>
#include <lib/fxl/strings/string_view.h>
namespace ledger {
namespace {
void SafeCloseDir(DIR* dir) {
if (dir)
closedir(dir);
}
} // namespace
bool GetDirectoryEntries(const DetachedPath& directory,
fit::function<bool(fxl::StringView)> callback) {
int dir_fd = openat(directory.root_fd(), directory.path().c_str(), O_RDONLY);
if (dir_fd == -1) {
return false;
}
std::unique_ptr<DIR, decltype(&SafeCloseDir)> dir(fdopendir(dir_fd),
SafeCloseDir);
if (!dir)
return false;
for (struct dirent* entry = readdir(dir.get()); entry != nullptr;
entry = readdir(dir.get())) {
char* name = entry->d_name;
if (name[0]) {
if (name[0] == '.') {
if (!name[1] || (name[1] == '.' && !name[2])) {
// . or ..
continue;
}
}
if (!callback(fxl::StringView(name))) {
break;
}
}
}
return true;
}
} // namespace ledger