EndSection returns Result<Success>
Allow it to fail. When there is an error for a section ending,
print the error pointing to the line where the section starts.
Bug: 69050941
Test: boot, init_tests
Change-Id: I1d8ed25f4b74cc9ac24d38b8075751c7d606aea8
diff --git a/init/parser.cpp b/init/parser.cpp
index 8a4e798..6ddb09f 100644
--- a/init/parser.cpp
+++ b/init/parser.cpp
@@ -50,12 +50,24 @@
state.nexttoken = 0;
SectionParser* section_parser = nullptr;
+ int section_start_line = -1;
std::vector<std::string> args;
+ auto end_section = [&] {
+ if (section_parser == nullptr) return;
+
+ if (auto result = section_parser->EndSection(); !result) {
+ LOG(ERROR) << filename << ": " << section_start_line << ": " << result.error();
+ }
+
+ section_parser = nullptr;
+ section_start_line = -1;
+ };
+
for (;;) {
switch (next_token(&state)) {
case T_EOF:
- if (section_parser) section_parser->EndSection();
+ end_section();
return;
case T_NEWLINE:
state.line++;
@@ -65,18 +77,18 @@
// uevent.
for (const auto& [prefix, callback] : line_callbacks_) {
if (android::base::StartsWith(args[0], prefix.c_str())) {
- if (section_parser) section_parser->EndSection();
+ end_section();
if (auto result = callback(std::move(args)); !result) {
LOG(ERROR) << filename << ": " << state.line << ": " << result.error();
}
- section_parser = nullptr;
break;
}
}
if (section_parsers_.count(args[0])) {
- if (section_parser) section_parser->EndSection();
+ end_section();
section_parser = section_parsers_[args[0]].get();
+ section_start_line = state.line;
if (auto result =
section_parser->ParseSection(std::move(args), filename, state.line);
!result) {