Don't crash on EREMOTEIO in FileReader
Change-Id: I050e57dc08a9ba4b4606101c30f8c0132b4ed106
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/util/file.cc b/aos/util/file.cc
index 52657a9..973ab3c 100644
--- a/aos/util/file.cc
+++ b/aos/util/file.cc
@@ -200,11 +200,19 @@
PCHECK(file_.get() != -1) << ": opening " << filename;
}
-absl::Span<char> FileReader::ReadContents(absl::Span<char> buffer) {
+std::optional<absl::Span<char>> FileReader::ReadContents(
+ absl::Span<char> buffer) {
PCHECK(0 == lseek(file_.get(), 0, SEEK_SET));
const ssize_t result = read(file_.get(), buffer.data(), buffer.size());
+ if (result < 0) {
+ // Read timeout for an i2c request returns this.
+ if (errno == EREMOTEIO) {
+ return std::nullopt;
+ }
+ }
+
PCHECK(result >= 0);
- return {buffer.data(), static_cast<size_t>(result)};
+ return absl::Span<char>{buffer.data(), static_cast<size_t>(result)};
}
FileWriter::FileWriter(std::string_view filename, mode_t permissions)
@@ -216,21 +224,25 @@
// absl::SimpleAtoi doesn't interpret a leading 0x as hex, which we need here.
// Instead, we use the flatbufers API, which unfortunately relies on NUL
// termination.
-int32_t FileReader::ReadInt32() {
+std::optional<int32_t> FileReader::ReadInt32() {
// Maximum characters for a 32-bit integer, +1 for the NUL.
// Hex is the same size with the leading 0x.
std::array<char, 11> buffer;
int32_t result;
- const auto string_span =
+ const std::optional<absl::Span<char>> string_span =
ReadContents(absl::Span<char>(buffer.data(), buffer.size())
.subspan(0, buffer.size() - 1));
+ if (!string_span.has_value()) {
+ return std::nullopt;
+ }
+
// Verify we found the newline.
- CHECK_EQ(buffer[string_span.size() - 1], '\n');
+ CHECK_EQ(buffer[string_span->size() - 1], '\n');
// Truncate the newline.
- buffer[string_span.size() - 1] = '\0';
+ buffer[string_span->size() - 1] = '\0';
CHECK(flatbuffers::StringToNumber(buffer.data(), &result))
<< ": Error parsing string to integer: "
- << std::string_view(string_span.data(), string_span.size());
+ << std::string_view(string_span->data(), string_span->size());
return result;
}