Commit 252c88c5 authored by jan.koester's avatar jan.koester
Browse files

test

parent fbe4ab9d
Loading
Loading
Loading
Loading
+8 −6
Changes for CMakeLists.txt: 8 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -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
@@ -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"
+3 −7
Changes for src/main.cpp: 3 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -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;
        }
    }
@@ -51,7 +47,7 @@ int main(int argc, char **argv) {

    signal(SIGPIPE, SIG_IGN);

    init.loadConfig(configPath);
    init.loadConfig("");

    return init.run();
}
+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>
@@ -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;
    }