#include #include #include #include #include #include #include #include "session_manager.h" #include "sessionmanageradaptor.h" // generated by qt6_add_dbus_adaptor // Async-signal-safe shutdown via socketpair static int sigFd[2]; static void signalHandler(int) { char c = 1; write(sigFd[0], &c, 1); } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); app.setApplicationName("ollie-kde"); app.setOrganizationName("ollie"); // Set up signal handling via socketpair (async-signal-safe) if (socketpair(AF_UNIX, SOCK_STREAM, 0, sigFd) != 0) { qCritical() << "Cannot create signal socketpair"; return 1; } auto *sigNotifier = new QSocketNotifier(sigFd[1], QSocketNotifier::Read, &app); QObject::connect(sigNotifier, &QSocketNotifier::activated, &app, [&]() { char c; read(sigFd[1], &c, 1); qDebug() << "Received shutdown signal, exiting gracefully..."; app.quit(); }); signal(SIGTERM, signalHandler); signal(SIGINT, signalHandler); // Create the session manager (initializes ollie core) SessionManager manager; // Create the D-Bus adaptor (generated from XML) new SessionManagerAdaptor(&manager); // Register on the session bus QDBusConnection bus = QDBusConnection::sessionBus(); if (!bus.isConnected()) { qCritical() << "Cannot connect to D-Bus session bus"; return 1; } if (!bus.registerService("org.ollie.SessionManager")) { qCritical() << "Cannot register D-Bus service org.ollie.SessionManager:" << bus.lastError().message(); return 1; } if (!bus.registerObject("/org/ollie/SessionManager", &manager)) { qCritical() << "Cannot register D-Bus object /org/ollie/SessionManager:" << bus.lastError().message(); return 1; } qDebug() << "ollie-kde daemon started on D-Bus: org.ollie.SessionManager"; int rc = app.exec(); qDebug() << "ollie-kde daemon exiting"; return rc; }