Factor out service directory option processing
[oweals/dinit.git] / src / dinit.cc
index 03afa7f7e7954723a9c2b277fe50ef5ce6cd48f4..8fb405a5c9430f98bd68f4b55d047e1cc75e92a0 100644 (file)
@@ -31,6 +31,7 @@
 #include "dinit-socket.h"
 #include "static-string.h"
 #include "dinit-utmp.h"
+#include "options-processing.h"
 
 #include "mconfig.h"
 
@@ -197,13 +198,13 @@ int dinit_main(int argc, char **argv)
     
     am_pid_one = (getpid() == 1);
     am_system_init = (getuid() == 0);
-    const char * service_dir = nullptr;
-    bool service_dir_dynamic = false; // service_dir dynamically allocated?
     const char * env_file = nullptr;
     bool control_socket_path_set = false;
     bool env_file_set = false;
     bool log_specified = false;
 
+    service_dir_opt service_dir_opts;
+
     // list of services to start
     list<const char *> services_to_start;
     
@@ -227,7 +228,7 @@ int dinit_main(int argc, char **argv)
                 }
                 else if (strcmp(argv[i], "--services-dir") == 0 || strcmp(argv[i], "-d") == 0) {
                     if (++i < argc) {
-                        service_dir = argv[i];
+                        service_dir_opts.set_specified_service_dir(argv[i]);
                     }
                     else {
                         cerr << "dinit: '--services-dir' (-d) requires an argument" << endl;
@@ -351,24 +352,6 @@ int dinit_main(int argc, char **argv)
         }
     }
     
-    /* service directory name */
-    if (service_dir == nullptr && ! am_system_init) {
-        const char * userhome = get_user_home();
-        if (userhome != nullptr) {
-            const char * user_home = get_user_home();
-            size_t user_home_len = strlen(user_home);
-            size_t dinit_d_len = strlen("/dinit.d");
-            size_t full_len = user_home_len + dinit_d_len + 1;
-            char *service_dir_w = new char[full_len];
-            std::memcpy(service_dir_w, user_home, user_home_len);
-            std::memcpy(service_dir_w + user_home_len, "/dinit.d", dinit_d_len);
-            service_dir_w[full_len - 1] = 0;
-
-            service_dir = service_dir_w;
-            service_dir_dynamic = true;
-        }
-    }
-    
     if (services_to_start.empty()) {
         services_to_start.push_back("boot");
     }
@@ -419,19 +402,11 @@ int dinit_main(int argc, char **argv)
     
     log_flush_timer.add_timer(event_loop, dasynq::clock_type::MONOTONIC);
 
-    bool add_all_service_dirs = false;
-    if (service_dir == nullptr) {
-        service_dir = "/etc/dinit.d";
-        add_all_service_dirs = true;
-    }
+    service_dir_opts.build_paths();
 
     /* start requested services */
-    services = new dirload_service_set(service_dir, service_dir_dynamic);
-    if (add_all_service_dirs) {
-        services->add_service_dir("/usr/local/lib/dinit.d", false);
-        services->add_service_dir("/lib/dinit.d", false);
-    }
-    
+    services = new dirload_service_set(std::move(service_dir_opts.get_paths()));
+
     init_log(services, log_is_syslog);
     if (am_system_init) {
         log(loglevel_t::INFO, false, "starting system");