Loading CMakeLists.txt +8 −6 Changes for CMakeLists.txt: 8 added lines, 6 removed lines. Original line number Diff line number Diff line Loading @@ -5,7 +5,12 @@ project(syslite VERSION 0.1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(libconfplus REQUIRED) # Compile-time configuration (no runtime config dependencies) set(SYSLITE_UNIT_DIR "/etc/syslite/services" CACHE STRING "Service unit file directory") set(SYSLITE_DEFAULT_TARGET "multi-user.target" CACHE STRING "Default boot target") set(SYSLITE_TTY_COUNT 3 CACHE STRING "Number of TTYs to spawn") configure_file(config.h.in ${CMAKE_BINARY_DIR}/config.h) add_executable(syslite src/main.cpp Loading @@ -17,12 +22,9 @@ add_executable(syslite target_include_directories(syslite PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_BINARY_DIR} ) target_link_libraries(syslite PRIVATE confplus::confplus dl ) target_link_libraries(syslite PRIVATE) install(TARGETS syslite DESTINATION sbin) install(FILES data/syslite.yaml DESTINATION etc/syslite) config.h.in 0 → 100644 +7 −0 Changes for config.h.in: 7 added lines, 0 removed lines. Original line number Diff line number Diff line #pragma once // syslite compile-time configuration defaults #define SYSLITE_UNIT_DIR "@SYSLITE_UNIT_DIR@" #define SYSLITE_DEFAULT_TARGET "@SYSLITE_DEFAULT_TARGET@" #define SYSLITE_TTY_COUNT @SYSLITE_TTY_COUNT@ #define SYSLITE_HOSTNAME_FILE "/etc/hostname" src/main.cpp +3 −7 Changes for src/main.cpp: 3 added lines, 7 removed lines. Original line number Diff line number Diff line Loading @@ -20,15 +20,11 @@ static void sigRebootHandler(int) { } int main(int argc, char **argv) { std::string configPath = "yaml:/etc/syslite/syslite.yaml"; for (int i = 1; i < argc; ++i) { if ((std::strcmp(argv[i], "-c") == 0 || std::strcmp(argv[i], "--config") == 0) && i + 1 < argc) { configPath = argv[++i]; } else if (std::strcmp(argv[i], "-h") == 0 || std::strcmp(argv[i], "--help") == 0) { if (std::strcmp(argv[i], "-h") == 0 || std::strcmp(argv[i], "--help") == 0) { std::cout << "syslite — lightweight Linux init system\n" << " -h, --help Show help\n" << " -c, --config Config file path (default: yaml:/etc/syslite/syslite.yaml)\n"; << " Config is compile-time (no runtime config files needed)\n"; return 0; } } Loading @@ -51,7 +47,7 @@ int main(int argc, char **argv) { signal(SIGPIPE, SIG_IGN); init.loadConfig(configPath); init.loadConfig(""); return init.run(); } src/syslite.cpp +8 −64 Changes for src/syslite.cpp: 8 added lines, 64 removed lines. Original line number Diff line number Diff line #include "syslite.h" #include <confplus/conf.h> #include <confplus/exception.h> #include "config.h" #include <iostream> #include <fstream> Loading @@ -21,74 +19,20 @@ namespace syslite { std::atomic<bool> Init::doReboot{false}; Init::Init() : _unitDir("/etc/syslite/services") , _defaultTarget("multi-user.target") , _numTtys(3) : _unitDir(SYSLITE_UNIT_DIR) , _defaultTarget(SYSLITE_DEFAULT_TARGET) , _numTtys(SYSLITE_TTY_COUNT) {} Init::~Init() {} bool Init::loadConfig(const std::string &configPath) { try { confplus::Config conf(configPath); // /SYSLITE/HOSTNAME auto *key = conf.getKey("/SYSLITE/HOSTNAME"); if (key) _hostname = conf.getValue(key, 0); // /SYSLITE/UNIT_DIR — where .service files live key = conf.getKey("/SYSLITE/UNIT_DIR"); if (key) _unitDir = conf.getValue(key, 0); // /SYSLITE/DEFAULT_TARGET key = conf.getKey("/SYSLITE/DEFAULT_TARGET"); if (key) _defaultTarget = conf.getValue(key, 0); // /SYSLITE/TTY/COUNT — number of TTYs to spawn key = conf.getKey("/SYSLITE/TTY/COUNT"); if (key) _numTtys = conf.getIntValue(key, 0); // /SYSLITE/TTY/COMMAND — custom getty command (optional) std::string ttyCmd; key = conf.getKey("/SYSLITE/TTY/COMMAND"); if (key) ttyCmd = conf.getValue(key, 0); // Register TTYs bool Init::loadConfig(const std::string &) { // Configuration is compile-time (config.h). Hostname from /etc/hostname. // Register TTYs based on compiled-in count. for (int i = 1; i <= _numTtys; ++i) { std::string dev = "/dev/tty" + std::to_string(i); _ttys.addTty(dev, ttyCmd); } // Also check for extra service directories // /SYSLITE/EXTRA_UNIT_DIRS/[0..n] key = conf.getKey("/SYSLITE/EXTRA_UNIT_DIRS"); if (key) { for (size_t i = 0; i < key->getElements(); ++i) { std::string dir = conf.getValue(key, i); if (!dir.empty()) _services.loadDirectory(dir); } } } catch (confplus::ConfException &e) { std::cerr << "[syslite] Config error: " << e.what() << std::endl; // Use defaults — config is optional } catch (...) { std::cerr << "[syslite] Failed to load config, using defaults" << std::endl; _ttys.addTty(dev); } // If no TTYs configured via config, set defaults if (_numTtys > 0 && _ttys.ttyCount() == 0) { for (int i = 1; i <= _numTtys; ++i) { _ttys.addTty("/dev/tty" + std::to_string(i)); } } return true; } Loading Loading
CMakeLists.txt +8 −6 Changes for CMakeLists.txt: 8 added lines, 6 removed lines. Original line number Diff line number Diff line Loading @@ -5,7 +5,12 @@ project(syslite VERSION 0.1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(libconfplus REQUIRED) # Compile-time configuration (no runtime config dependencies) set(SYSLITE_UNIT_DIR "/etc/syslite/services" CACHE STRING "Service unit file directory") set(SYSLITE_DEFAULT_TARGET "multi-user.target" CACHE STRING "Default boot target") set(SYSLITE_TTY_COUNT 3 CACHE STRING "Number of TTYs to spawn") configure_file(config.h.in ${CMAKE_BINARY_DIR}/config.h) add_executable(syslite src/main.cpp Loading @@ -17,12 +22,9 @@ add_executable(syslite target_include_directories(syslite PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_BINARY_DIR} ) target_link_libraries(syslite PRIVATE confplus::confplus dl ) target_link_libraries(syslite PRIVATE) install(TARGETS syslite DESTINATION sbin) install(FILES data/syslite.yaml DESTINATION etc/syslite)
config.h.in 0 → 100644 +7 −0 Changes for config.h.in: 7 added lines, 0 removed lines. Original line number Diff line number Diff line #pragma once // syslite compile-time configuration defaults #define SYSLITE_UNIT_DIR "@SYSLITE_UNIT_DIR@" #define SYSLITE_DEFAULT_TARGET "@SYSLITE_DEFAULT_TARGET@" #define SYSLITE_TTY_COUNT @SYSLITE_TTY_COUNT@ #define SYSLITE_HOSTNAME_FILE "/etc/hostname"
src/main.cpp +3 −7 Changes for src/main.cpp: 3 added lines, 7 removed lines. Original line number Diff line number Diff line Loading @@ -20,15 +20,11 @@ static void sigRebootHandler(int) { } int main(int argc, char **argv) { std::string configPath = "yaml:/etc/syslite/syslite.yaml"; for (int i = 1; i < argc; ++i) { if ((std::strcmp(argv[i], "-c") == 0 || std::strcmp(argv[i], "--config") == 0) && i + 1 < argc) { configPath = argv[++i]; } else if (std::strcmp(argv[i], "-h") == 0 || std::strcmp(argv[i], "--help") == 0) { if (std::strcmp(argv[i], "-h") == 0 || std::strcmp(argv[i], "--help") == 0) { std::cout << "syslite — lightweight Linux init system\n" << " -h, --help Show help\n" << " -c, --config Config file path (default: yaml:/etc/syslite/syslite.yaml)\n"; << " Config is compile-time (no runtime config files needed)\n"; return 0; } } Loading @@ -51,7 +47,7 @@ int main(int argc, char **argv) { signal(SIGPIPE, SIG_IGN); init.loadConfig(configPath); init.loadConfig(""); return init.run(); }
src/syslite.cpp +8 −64 Changes for src/syslite.cpp: 8 added lines, 64 removed lines. Original line number Diff line number Diff line #include "syslite.h" #include <confplus/conf.h> #include <confplus/exception.h> #include "config.h" #include <iostream> #include <fstream> Loading @@ -21,74 +19,20 @@ namespace syslite { std::atomic<bool> Init::doReboot{false}; Init::Init() : _unitDir("/etc/syslite/services") , _defaultTarget("multi-user.target") , _numTtys(3) : _unitDir(SYSLITE_UNIT_DIR) , _defaultTarget(SYSLITE_DEFAULT_TARGET) , _numTtys(SYSLITE_TTY_COUNT) {} Init::~Init() {} bool Init::loadConfig(const std::string &configPath) { try { confplus::Config conf(configPath); // /SYSLITE/HOSTNAME auto *key = conf.getKey("/SYSLITE/HOSTNAME"); if (key) _hostname = conf.getValue(key, 0); // /SYSLITE/UNIT_DIR — where .service files live key = conf.getKey("/SYSLITE/UNIT_DIR"); if (key) _unitDir = conf.getValue(key, 0); // /SYSLITE/DEFAULT_TARGET key = conf.getKey("/SYSLITE/DEFAULT_TARGET"); if (key) _defaultTarget = conf.getValue(key, 0); // /SYSLITE/TTY/COUNT — number of TTYs to spawn key = conf.getKey("/SYSLITE/TTY/COUNT"); if (key) _numTtys = conf.getIntValue(key, 0); // /SYSLITE/TTY/COMMAND — custom getty command (optional) std::string ttyCmd; key = conf.getKey("/SYSLITE/TTY/COMMAND"); if (key) ttyCmd = conf.getValue(key, 0); // Register TTYs bool Init::loadConfig(const std::string &) { // Configuration is compile-time (config.h). Hostname from /etc/hostname. // Register TTYs based on compiled-in count. for (int i = 1; i <= _numTtys; ++i) { std::string dev = "/dev/tty" + std::to_string(i); _ttys.addTty(dev, ttyCmd); } // Also check for extra service directories // /SYSLITE/EXTRA_UNIT_DIRS/[0..n] key = conf.getKey("/SYSLITE/EXTRA_UNIT_DIRS"); if (key) { for (size_t i = 0; i < key->getElements(); ++i) { std::string dir = conf.getValue(key, i); if (!dir.empty()) _services.loadDirectory(dir); } } } catch (confplus::ConfException &e) { std::cerr << "[syslite] Config error: " << e.what() << std::endl; // Use defaults — config is optional } catch (...) { std::cerr << "[syslite] Failed to load config, using defaults" << std::endl; _ttys.addTty(dev); } // If no TTYs configured via config, set defaults if (_numTtys > 0 && _ttys.ttyCount() == 0) { for (int i = 1; i <= _numTtys; ++i) { _ttys.addTty("/dev/tty" + std::to_string(i)); } } return true; } Loading