#include #include #include #include #include #ifndef __APPLE__ /* prctl is Linux only */ #include #endif #include #include #include #include #include #include #include #include #include #include #include "HyperionConfig.h" #include #include #include #include #ifdef ENABLE_X11 #include #endif #include "hyperiond.h" #include "systray.h" using namespace commandline; #define PERM0664 QFileDevice::ReadOwner | QFileDevice::ReadGroup | QFileDevice::ReadOther | QFileDevice::WriteOwner | QFileDevice::WriteGroup void signal_handler(const int signum) { /// Hyperion instance Hyperion* _hyperion = Hyperion::getInstance(); if(signum == SIGCHLD) { // only quit when a registered child process is gone // currently this feature is not active ... return; } else if (signum == SIGUSR1) { if (_hyperion != nullptr) { _hyperion->setComponentState(hyperion::COMP_SMOOTHING, false); _hyperion->setComponentState(hyperion::COMP_LEDDEVICE, false); } return; } else if (signum == SIGUSR2) { if (_hyperion != nullptr) { _hyperion->setComponentState(hyperion::COMP_LEDDEVICE, true); _hyperion->setComponentState(hyperion::COMP_SMOOTHING, true); } return; } QCoreApplication::quit(); // reset signal handler to default (in case this handler is not capable of stopping) signal(signum, SIG_DFL); } void startNewHyperion(int parentPid, std::string hyperionFile, std::string configFile) { pid_t childPid = fork(); // child pid should store elsewhere for later use if ( childPid == 0 ) { sleep(3); execl(hyperionFile.c_str(), hyperionFile.c_str(), "--parent", QString::number(parentPid).toStdString().c_str(), configFile.c_str(), NULL); exit(0); } } QCoreApplication* createApplication(int &argc, char *argv[]) { bool isGuiApp = false; bool forceNoGui = false; // command line for (int i = 1; i < argc; ++i) { if (qstrcmp(argv[i], "--desktop") == 0) { isGuiApp = true; } else if (qstrcmp(argv[i], "--service") == 0) { isGuiApp = false; forceNoGui = true; } } // on osx/windows gui always available #if defined(__APPLE__) || defined(__WIN32__) isGuiApp = true && ! forceNoGui; #else if (!forceNoGui) { // if x11, then test if xserver is available #ifdef ENABLE_X11 Display* dpy = XOpenDisplay(NULL); if (dpy != NULL) { XCloseDisplay(dpy); isGuiApp = true; } #endif } #endif if (isGuiApp) { QApplication* app = new QApplication(argc, argv); app->setApplicationDisplayName("Hyperion"); app->setWindowIcon(QIcon(":/hyperion-icon-32px.png")); return app; } QCoreApplication* app = new QCoreApplication(argc, argv); app->setApplicationName("Hyperion"); app->setApplicationVersion(HYPERION_VERSION); return app; } int main(int argc, char** argv) { setenv("AVAHI_COMPAT_NOWARN", "1", 1); // initialize main logger and set global log level Logger* log = Logger::getInstance("MAIN"); Logger::setLogLevel(Logger::WARNING); // Initialising QCoreApplication QScopedPointer app(createApplication(argc, argv)); bool isGuiApp = (qobject_cast(app.data()) != 0 && QSystemTrayIcon::isSystemTrayAvailable()); signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); signal(SIGABRT, signal_handler); signal(SIGCHLD, signal_handler); signal(SIGPIPE, signal_handler); signal(SIGUSR1, signal_handler); signal(SIGUSR2, signal_handler); // force the locale setlocale(LC_ALL, "C"); QLocale::setDefault(QLocale::c()); Parser parser("Hyperion Daemon"); parser.addHelpOption(); BooleanOption & versionOption = parser.add(0x0, "version", "Show version information"); Option & rootPathOption = parser.add