dinitcheck: return EXIT_FAILURE if problem found
authorDavin McCall <davmac@davmac.org>
Fri, 22 Nov 2019 14:40:32 +0000 (14:40 +0000)
committerDavin McCall <davmac@davmac.org>
Fri, 22 Nov 2019 14:40:32 +0000 (14:40 +0000)
TODO
src/dinitcheck.cc
src/igr-tests/check-basic/run-test.sh
src/igr-tests/check-cycle/run-test.sh

diff --git a/TODO b/TODO
index 964d14a69c931016b9baf54741d3054b4f227bcf..e6cad604a3e238cb8463211df8a9541171fea043 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,15 +1,21 @@
 For version 0.8.0:
 ------------------
+* provide a way to check configuration for errors (dinitcheck command) [DONE]
 * Easy way to reload service description (including if service is running, where possible).
-* provide a way to check configuration for errors (dinitcheck command) [In progress]
-  - man page
-  - circular dependency checks
 * report process launch failure reason (stage & errno) via dinitctl.
 * "chain-to" can result in an unbreakable loop if the chain is circular. Chained services should not be
   started during shutdown to prevent this (also avoids a race condition where the chained service is left
   running when everything else has shutdown).
 * Show "activated" state in "dinitctl list" output
 
+For version 0.9.+:
+------------------
+* Service description sanity checks:
+  - Service type not specified
+    - maybe default to 'internal' if command not specified
+  - service command not specified
+  - errors should also be reported by dinitcheck
+
 For version 1.0:
 ----------------
 * Service description parse errors should report line number
index 60fe609dd1427f7f5895ea3203f22ce0d077cb03..a27a8e446e45ffa2a2cfa212b4b47e064c4c7ba4 100644 (file)
@@ -61,6 +61,8 @@ template <typename T> bool contains(std::vector<T> vec, const T& elem)
     return std::find(vec.begin(), vec.end(), elem) != vec.end();
 }
 
+static bool errors_found = false;
+
 int main(int argc, char **argv)
 {
     using namespace std;
@@ -133,6 +135,7 @@ int main(int argc, char **argv)
         }
         catch (service_load_exc &exc) {
             std::cerr << "Unable to load service '" << name << "': " << exc.exc_description << "\n";
+            errors_found = true;
         }
     }
 
@@ -191,6 +194,7 @@ int main(int argc, char **argv)
     }
 
     if (!service_chain.empty()) {
+        errors_found = true;
         std::cerr << "Found dependency cycle:\n";
         for (auto chain_link : service_chain) {
             std::cerr << "    " << std::get<0>(chain_link)->name << " ->\n";
@@ -200,23 +204,26 @@ int main(int argc, char **argv)
 
     // TODO additional: check chain-to, other lint
 
-    return 0;
+    return errors_found ? EXIT_FAILURE : EXIT_SUCCESS;
 }
 
 static void report_service_description_exc(service_description_exc &exc)
 {
     std::cerr << "Service '" << exc.service_name << "': " << exc.exc_description << "\n";
+    errors_found = true;
 }
 
 static void report_error(std::system_error &exc, const std::string &service_name)
 {
     std::cerr << "Service '" << service_name << "', error reading service description: " << exc.what() << "\n";
+    errors_found = true;
 }
 
 static void report_dir_error(const char *service_name, const std::string &dirpath)
 {
     std::cerr << "Service '" << service_name << "', error reading dependencies from directory " << dirpath
             << ": " << strerror(errno) << "\n";
+    errors_found = true;
 }
 
 // Process a dependency directory - filenames contained within correspond to service names which
index d75048ca351fc47deea3ef29e0b640f41f38206f..7a71ebf18ada9783ff4071f8a5dd4fed9286caad 100755 (executable)
@@ -1,6 +1,7 @@
 #!/bin/sh
 
 ../../dinitcheck -d sd > output.txt 2>&1
+if [ $? != 1 ]; then exit 1; fi
 
 STATUS=FAIL
 if cmp -s expected.txt output.txt; then
index d75048ca351fc47deea3ef29e0b640f41f38206f..7a71ebf18ada9783ff4071f8a5dd4fed9286caad 100755 (executable)
@@ -1,6 +1,7 @@
 #!/bin/sh
 
 ../../dinitcheck -d sd > output.txt 2>&1
+if [ $? != 1 ]; then exit 1; fi
 
 STATUS=FAIL
 if cmp -s expected.txt output.txt; then