diff --git a/src/ebusd/main.cpp b/src/ebusd/main.cpp index d9bb90dc..54803402 100644 --- a/src/ebusd/main.cpp +++ b/src/ebusd/main.cpp @@ -662,7 +662,7 @@ void closePidFile() { /** * Helper method performing shutdown. */ -void shutdown() { +void shutdown(bool error = false) { // stop main loop and all dependent components if (s_mainLoop) { delete s_mainLoop; @@ -691,7 +691,7 @@ void shutdown() { logNotice(lf_main, "ebusd stopped"); closeLogFile(); - exit(EXIT_SUCCESS); + exit(error ? EXIT_FAILURE : EXIT_SUCCESS); } /** @@ -929,7 +929,7 @@ void readMessage(Message* message) { } } -void executeInstructions(MessageMap* messages, bool verbose) { +result_t executeInstructions(MessageMap* messages, bool verbose) { string errorDescription; result_t result = messages->resolveConditions(verbose, &errorDescription); if (result != RESULT_OK) { @@ -946,6 +946,7 @@ void executeInstructions(MessageMap* messages, bool verbose) { } logNotice(lf_main, "found messages: %d (%d conditional on %d conditions, %d poll, %d update)", messages->size(), messages->sizeConditional(), messages->sizeConditions(), messages->sizePoll(), messages->sizePassive()); + return result; } result_t loadDefinitionsFromConfigPath(FileReader* reader, const string& filename, bool verbose, @@ -993,7 +994,7 @@ result_t loadConfigFiles(MessageMap* messages, bool verbose, bool denyRecursive) getResultCode(result), errorDescription.c_str()); } messages->unlock(); - return RESULT_OK; + return opt.checkConfig ? result : RESULT_OK; } result_t loadScanConfigFile(MessageMap* messages, symbol_t address, bool verbose, string* relativeFile) { @@ -1256,7 +1257,7 @@ int main(int argc, char* argv[]) { logNotice(lf_main, PACKAGE_STRING "." REVISION " performing configuration check..."); result_t result = loadConfigFiles(s_messageMap, true, opt.scanConfig && arg_index < argc); - executeInstructions(s_messageMap, true); + result_t overallResult = executeInstructions(s_messageMap, true); MasterSymbolString master; SlaveSymbolString slave; while (result == RESULT_OK && opt.scanConfig && arg_index < argc) { @@ -1268,21 +1269,33 @@ int main(int argc, char* argv[]) { Message* message = s_messageMap->getScanMessage(address); if (!message) { logError(lf_main, "invalid scan address %2.2x", address); + if (overallResult == RESULT_OK) { + overallResult = RESULT_ERR_INVALID_ADDR; + } } else { message->storeLastData(master, slave); string file; result_t res = loadScanConfigFile(s_messageMap, address, true, &file); - executeInstructions(s_messageMap, true); + result_t instrRes = executeInstructions(s_messageMap, true); if (res == RESULT_OK) { logInfo(lf_main, "scan config %2.2x: file %s loaded", address, file.c_str()); + } else if (overallResult == RESULT_OK) { + overallResult = res; + } + if (overallResult == RESULT_OK && instrRes != RESULT_OK) { + overallResult = instrRes; } } } + if (result != RESULT_OK) { + overallResult = result; + } if (result == RESULT_OK && opt.dumpConfig) { logNotice(lf_main, "configuration dump:"); s_messageMap->dump(true, &cout); } - shutdown(); + + shutdown(overallResult != RESULT_OK); return 0; } diff --git a/src/ebusd/main.h b/src/ebusd/main.h old mode 100755 new mode 100644 index f662879d..97717af0 --- a/src/ebusd/main.h +++ b/src/ebusd/main.h @@ -120,8 +120,9 @@ result_t loadScanConfigFile(MessageMap* messages, symbol_t address, bool verbose * Helper method for executing all loaded and resolvable instructions. * @param messages the @a MessageMap instance. * @param verbose whether to verbosely log all problems. + * @return the result code. */ -void executeInstructions(MessageMap* messages, bool verbose = false); +result_t executeInstructions(MessageMap* messages, bool verbose = false); /** * Helper method for loading definitions from a relative file from the config path/URL.