summaryrefslogtreecommitdiffstats
path: root/src/inode2filename/inode_result.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/inode2filename/inode_result.h')
-rw-r--r--src/inode2filename/inode_result.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/inode2filename/inode_result.h b/src/inode2filename/inode_result.h
new file mode 100644
index 0000000..df352fb
--- /dev/null
+++ b/src/inode2filename/inode_result.h
@@ -0,0 +1,82 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef IORAP_SRC_INODE2FILENAME_INODE_RESULT_H_
+#define IORAP_SRC_INODE2FILENAME_INODE_RESULT_H_
+
+#include "common/expected.h"
+#include "inode2filename/inode.h"
+#include "inode2filename/inode_result.h"
+#include "inode2filename/system_call.h"
+
+#include <rxcpp/rx.hpp>
+
+#include <memory>
+#include <optional>
+#include <string>
+#include <vector>
+namespace iorap::inode2filename {
+
+// Tuple of (Inode -> (Filename|Errno))
+struct InodeResult {
+ // We set this error when all root directories have been searched and
+ // yet we still could not find a corresponding filename for the inode under search.
+ static constexpr int kCouldNotFindFilename = ENOKEY;
+
+ // An initial inode->filename mapping was found, but subsequent verification for it failed.
+ static constexpr int kVerificationFailed = EKEYEXPIRED;
+
+ // There is always an inode, but sometimes we may fail to resolve the filename.
+ Inode inode;
+ // Value: Contains the filename (with a root directory as a prefix).
+ // Error: Contains the errno, usually one of the above, otherwise some system error.
+ iorap::expected<std::string /*filename*/, int /*errno*/> data;
+
+ static InodeResult makeSuccess(Inode inode, std::string filename) {
+ return InodeResult{inode, std::move(filename)};
+ }
+
+ static InodeResult makeFailure(Inode inode, int err_no) {
+ return InodeResult{inode, iorap::unexpected{err_no}};
+ }
+
+ constexpr explicit operator bool() const {
+ return data.has_value();
+ }
+
+ constexpr bool operator==(const InodeResult& other) const {
+ if (inode == other.inode) {
+ if (data && other.data) {
+ return *data == *other.data;
+ } else if (!data && !other.data) {
+ return data.error() == other.data.error();
+ }
+ // TODO: operator== for expected
+ }
+ return false;
+ }
+
+ constexpr bool operator!=(const InodeResult& other) const {
+ return !(*this == other);
+ }
+
+ // Returns a human-readable error message, or 'nullopt' if there was no error.
+ std::optional<std::string_view> ErrorMessage() const;
+};
+
+std::ostream& operator<<(std::ostream& os, const InodeResult& result);
+
+} // namespace iorap::inode2filename
+
+#endif // IORAP_SRC_INODE2FILENAME_INODE_RESULT_H_ \ No newline at end of file