blob: 286e666cab7fb0f94bfd6f410d27b9c691f2eabd [file] [log] [blame]
// Copyright 2018 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 <fcntl.h>
#include <string>
#include <lib/fxl/files/unique_fd.h>
#include <lib/fxl/strings/string_view.h>
namespace ledger {
// Abstraction for a path rooted at a file descriptor.
// This class doesn't take ownership of the file descriptor and it is expected
// that the file descriptor will outlive this class and any sub path created
// from it.
class DetachedPath {
// If |path| is absolute, DetachedPath is equivalent to it. If |path| is
// relative, it is resolved with |root_fd| as reference. See |openat(2)|.
explicit DetachedPath(int root_fd = AT_FDCWD, std::string path = ".");
// If |path| is absolute, DetachedPath is equivalent to it. If |path| is
// relative, it is resolved relative to the current working directory.
explicit DetachedPath(std::string path);
DetachedPath(const DetachedPath& other);
DetachedPath(DetachedPath&& other) noexcept;
DetachedPath& operator=(const DetachedPath& other);
DetachedPath& operator=(DetachedPath&& /*unused*/) noexcept;
// The file descriptor to the base directory of this path.
int root_fd() const { return root_fd_; };
// The relative path to |root_fd|.
const std::string& path() const { return path_; };
// A |DetachedPath| representing the |path| appended to the current path.
DetachedPath SubPath(fxl::StringView path) const;
// A |DetachedPath| representing all the |path| in |components| appended to
// the current path.
DetachedPath SubPath(std::initializer_list<fxl::StringView> components) const;
// Opens a UniqueFD at the current path. If the operation fails, the returned
// UniqueFd will be invalid.
fxl::UniqueFD OpenFD(DetachedPath* detatched_path) const;
int root_fd_;
std::string path_;
} // namespace ledger