diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c704ec..ed36dc9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,9 +8,11 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -Wall -Wextra") -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) +option(USE_USER_BUS "Uses user bus" OFF) + find_package(Git REQUIRED) # Set version number and update submodules @@ -46,5 +48,9 @@ message("LogiOps Version Number: ${LOGIOPS_VERSION}") add_definitions( -DLOGIOPS_VERSION="${LOGIOPS_VERSION}") +if(USE_USER_BUS) + add_definitions(-DUSE_USER_BUS) +endif() + add_subdirectory(src/ipcgull) add_subdirectory(src/logid) diff --git a/README.md b/README.md index 9f3caff..2e31024 100644 --- a/README.md +++ b/README.md @@ -33,12 +33,18 @@ To build this project, run: ```bash mkdir build cd build -cmake .. +cmake -DCMAKE_BUILD_TYPE=Release .. make ``` To install, run `sudo make install` after building. You can set the daemon to start at boot by running `sudo systemctl enable logid` or `sudo systemctl enable --now logid` if you want to enable and start the daemon. +## Development + +The project may only run as root, but for development purposes, you may find it +convenient to run as non-root on the user bus. You must compile with the CMake +flag `-DUSE_USER_BUS=ON` to use the user bus. + ## Donate This program is (and will always be) provided free of charge. If you would like to support the development of this project by donating, you can donate to my Ko-Fi below. diff --git a/src/logid/CMakeLists.txt b/src/logid/CMakeLists.txt index 4dc86f2..a2fcd9b 100644 --- a/src/logid/CMakeLists.txt +++ b/src/logid/CMakeLists.txt @@ -69,6 +69,7 @@ add_executable(logid set_target_properties(logid PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) pkg_check_modules(PC_EVDEV libevdev REQUIRED) +pkg_check_modules(DBUS "dbus-1") pkg_check_modules(SYSTEMD "systemd") pkg_check_modules(LIBCONFIG libconfig REQUIRED) pkg_check_modules(LIBUDEV libudev REQUIRED) @@ -88,13 +89,17 @@ target_link_libraries(logid ${CMAKE_THREAD_LIBS_INIT} ${EVDEV_LIBRARY} config++ install(TARGETS logid DESTINATION bin) -if (SYSTEMD_FOUND AND "${SYSTEMD_SERVICES_INSTALL_DIR}" STREQUAL "") - execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} - --variable=systemdsystemunitdir systemd - OUTPUT_VARIABLE SYSTEMD_SERVICES_INSTALL_DIR) - string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_SERVICES_INSTALL_DIR - "${SYSTEMD_SERVICES_INSTALL_DIR}") - configure_file(logid.service.cmake ${CMAKE_BINARY_DIR}/logid.service) +if (SYSTEMD_FOUND) + if ("${SYSTEMD_SERVICES_INSTALL_DIR}" STREQUAL "") + execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} + --variable=systemdsystemunitdir systemd + OUTPUT_VARIABLE SYSTEMD_SERVICES_INSTALL_DIR) + string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_SERVICES_INSTALL_DIR + "${SYSTEMD_SERVICES_INSTALL_DIR}") + endif () + + # Install systemd service + configure_file(logid.service.in ${CMAKE_BINARY_DIR}/logid.service) message(STATUS "systemd units will be installed at ${SYSTEMD_SERVICES_INSTALL_DIR}") install(FILES ${CMAKE_BINARY_DIR}/logid.service DESTINATION ${SYSTEMD_SERVICES_INSTALL_DIR} @@ -102,3 +107,14 @@ if (SYSTEMD_FOUND AND "${SYSTEMD_SERVICES_INSTALL_DIR}" STREQUAL "") elseif (NOT SYSTEMD_FOUND AND SYSTEMD_SERVICES_INSTALL_DIR) message(FATAL_ERROR "systemd is not found w/ pkg-config but SYSTEMD_SERVICES_INSTALL_DIR is defined.") endif () + +if(DBUS_FOUND) + # Install DBus conf + # TODO: Is there a better way of setting the system policy directory? + set(DBUS_SYSTEM_POLICY_INSTALL_DIR "/usr/share/dbus-1/system.d") + configure_file(logiops-dbus.conf.in ${CMAKE_BINARY_DIR}/pizza.pixl.LogiOps.conf) + message(STATUS "dbus system policy will be installed at ${DBUS_SYSTEM_POLICY_INSTALL_DIR}") + install(FILES ${CMAKE_BINARY_DIR}/pizza.pixl.LogiOps.conf + DESTINATION ${DBUS_SYSTEM_POLICY_INSTALL_DIR} + COMPONENT cp) +endif() \ No newline at end of file diff --git a/src/logid/logid.cpp b/src/logid/logid.cpp index 20fed87..4babd3f 100644 --- a/src/logid/logid.cpp +++ b/src/logid/logid.cpp @@ -142,7 +142,13 @@ int main(int argc, char** argv) { config = std::make_shared(); } - auto server = ipcgull::make_server(SERVICE_ROOT_NAME, server_root_node, ipcgull::IPCGULL_USER); +#ifdef USE_USER_BUS + auto server_bus = ipcgull::IPCGULL_USER; +#else + auto server_bus = ipcgull::IPCGULL_SYSTEM; +#endif + + auto server = ipcgull::make_server(SERVICE_ROOT_NAME, server_root_node, server_bus); //Create a virtual input device try { @@ -161,6 +167,7 @@ int main(int argc, char** argv) { server->start(); } catch (ipcgull::connection_failed& e) { logPrintf(ERROR, "Lost IPC connection, terminating."); + return EXIT_FAILURE; } return EXIT_SUCCESS; diff --git a/src/logid/logid.service.cmake b/src/logid/logid.service.in similarity index 87% rename from src/logid/logid.service.cmake rename to src/logid/logid.service.in index dd4e09b..0da2c27 100644 --- a/src/logid/logid.service.cmake +++ b/src/logid/logid.service.in @@ -8,7 +8,6 @@ Wants=multi-user.target Type=simple ExecStart=${CMAKE_INSTALL_PREFIX}/bin/logid User=root -ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure [Install] diff --git a/src/logid/logiops-dbus.conf.in b/src/logid/logiops-dbus.conf.in new file mode 100644 index 0000000..075b51f --- /dev/null +++ b/src/logid/logiops-dbus.conf.in @@ -0,0 +1,16 @@ + + + + + + + + + + + + + +