The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

ipc: Add ability for service to be launched by systemd socket activation.

+91 -16
+2
CMakeLists.txt
··· 35 35 find_package(Threads) 36 36 find_package(ZLIB) 37 37 find_package(cJSON) 38 + find_package(Systemd) 38 39 39 40 # @TODO Turn into a find_package LIBUVC file. 40 41 pkg_check_modules(LIBUVC libuvc) ··· 72 73 cmake_dependent_option(BUILD_WITH_DBUS "Enable dbus support (for BLE support)" ON "DBUS_FOUND" OFF) 73 74 cmake_dependent_option(BUILD_COMPOSITOR_MAIN "Build main compositor host" ON "BUILD_WITH_WAYLAND OR BUILD_WITH_XCB" OFF) 74 75 cmake_dependent_option(XRT_BUILD_IPC "Build OpenXR runtime target" ON "BUILD_COMPOSITOR_MAIN" OFF) 76 + cmake_dependent_option(XRT_HAVE_SYSTEMD "Enable systemd support (for socket activation of service)" ON "Systemd_FOUND AND XRT_BUILD_IPC" OFF) 75 77 cmake_dependent_option(BUILD_TARGET_OPENXR "Build OpenXR runtime target" ON "BUILD_COMPOSITOR_MAIN OR XRT_BUILD_IPC" OFF) 76 78 77 79 # Most users won't touch these.
+18 -9
cmake/FindSystemd.cmake
··· 15 15 # 16 16 #============================================================================= 17 17 # Copyright (c) 2015 Jari Vetoniemi 18 + # Copyright (c) 2020 Collabora, Ltd. 18 19 # 19 20 # Distributed under the OSI-approved BSD License (the "License"); 20 21 # ··· 24 25 #============================================================================= 25 26 26 27 include(FeatureSummary) 27 - set_package_properties(Systemd PROPERTIES 28 - URL "http://freedesktop.org/wiki/Software/systemd/" 29 - DESCRIPTION "System and Service Manager") 28 + set_package_properties( 29 + Systemd PROPERTIES 30 + URL "http://freedesktop.org/wiki/Software/systemd/" 31 + DESCRIPTION "System and Service Manager") 30 32 31 33 find_package(PkgConfig) 32 34 pkg_check_modules(PC_SYSTEMD QUIET libsystemd) 33 - find_library(SYSTEMD_LIBRARIES NAMES systemd ${PC_SYSTEMD_LIBRARY_DIRS}) 34 - find_path(SYSTEMD_INCLUDE_DIRS systemd/sd-login.h HINTS ${PC_SYSTEMD_INCLUDE_DIRS}) 35 - 36 - set(SYSTEMD_DEFINITIONS ${PC_SYSTEMD_CFLAGS_OTHER}) 35 + find_library( 36 + SYSTEMD_LIBRARY 37 + NAMES systemd 38 + HINTS ${PC_SYSTEMD_LIBRARY_DIRS}) 39 + find_path(SYSTEMD_INCLUDE_DIR systemd/sd-login.h 40 + HINTS ${PC_SYSTEMD_INCLUDE_DIRS}) 37 41 38 42 include(FindPackageHandleStandardArgs) 39 - find_package_handle_standard_args(SYSTEMD DEFAULT_MSG SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES) 40 - mark_as_advanced(SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES SYSTEMD_DEFINITIONS) 43 + find_package_handle_standard_args(Systemd DEFAULT_MSG SYSTEMD_INCLUDE_DIR 44 + SYSTEMD_LIBRARY) 45 + if(SYSTEMD_FOUND) 46 + set(SYSTEMD_LIBRARIES ${SYSTEMD_LIBRARY}) 47 + set(SYSTEMD_INCLUDE_DIRS ${SYSTEMD_INCLUDE_DIR}) 48 + set(SYSTEMD_DEFINITIONS ${PC_SYSTEMD_CFLAGS_OTHER}) 49 + endif()
+2
src/xrt/include/xrt/xrt_config_have.h.cmake_in
··· 26 26 #cmakedefine XRT_HAVE_SDL2 27 27 28 28 #cmakedefine XRT_HAVE_OPENHMD 29 + 30 + #cmakedefine XRT_HAVE_SYSTEMD
+7
src/xrt/ipc/CMakeLists.txt
··· 75 75 aux_util 76 76 rt 77 77 ) 78 + 79 + if(XRT_HAVE_SYSTEMD) 80 + target_include_directories(ipc_server PRIVATE 81 + ${SYSTEMD_INCLUDE_DIRS}) 82 + target_link_libraries(ipc_server PRIVATE 83 + ${SYSTEMD_LIBRARIES}) 84 + endif()
+3
src/xrt/ipc/ipc_server.h
··· 156 156 // Should we exit when a client disconnects. 157 157 bool exit_on_disconnect; 158 158 159 + //! Were we launched by socket activation, instead of explicitly? 160 + bool launched_by_socket; 161 + 159 162 bool print_debug; 160 163 bool print_spew; 161 164
+59 -7
src/xrt/ipc/ipc_server_process.c
··· 12 12 #include "xrt/xrt_device.h" 13 13 #include "xrt/xrt_instance.h" 14 14 #include "xrt/xrt_compositor.h" 15 + #include "xrt/xrt_config_have.h" 15 16 16 17 #include "util/u_var.h" 17 18 #include "util/u_misc.h" ··· 36 37 #include <errno.h> 37 38 #include <stdio.h> 38 39 40 + #ifdef XRT_HAVE_SYSTEMD 41 + #include <systemd/sd-daemon.h> 42 + #endif 39 43 40 44 /* 41 45 * ··· 68 72 xrt_instance_destroy(&s->xinst); 69 73 70 74 if (s->listen_socket > 0) { 75 + // Close socket on exit 71 76 close(s->listen_socket); 72 77 s->listen_socket = -1; 73 78 } ··· 174 179 } 175 180 176 181 static int 177 - init_listen_socket(struct ipc_server *s) 182 + get_systemd_socket(struct ipc_server *s, int *out_fd) 183 + { 184 + #ifdef XRT_HAVE_SYSTEMD 185 + // We may have been launched with socket activation 186 + int num_fds = sd_listen_fds(0); 187 + if (num_fds > 1) { 188 + fprintf(stderr, 189 + "Too many file descriptors passed by systemd.\n"); 190 + return -1; 191 + } 192 + if (num_fds == 1) { 193 + *out_fd = SD_LISTEN_FDS_START + 0; 194 + s->launched_by_socket = true; 195 + printf("Got existing socket from systemd.\n"); 196 + } 197 + #endif 198 + return 0; 199 + } 200 + static int 201 + create_listen_socket(struct ipc_server *s, int *out_fd) 178 202 { 203 + // no fd provided 179 204 struct sockaddr_un addr; 180 205 int fd, ret; 181 206 ··· 202 227 close(fd); 203 228 return ret; 204 229 } 230 + printf("Created listening socket.\n"); 231 + *out_fd = fd; 232 + return 0; 233 + } 205 234 235 + static int 236 + init_listen_socket(struct ipc_server *s) 237 + { 238 + int fd = -1, ret; 239 + s->listen_socket = -1; 240 + 241 + ret = get_systemd_socket(s, &fd); 242 + if (ret < 0) { 243 + return ret; 244 + } 245 + 246 + if (fd == -1) { 247 + ret = create_listen_socket(s, &fd); 248 + if (ret < 0) { 249 + return ret; 250 + } 251 + } 206 252 // All ok! 207 253 s->listen_socket = fd; 254 + printf("Listening socket is fd %d\n", s->listen_socket); 208 255 209 256 return fd; 210 257 } ··· 221 268 222 269 struct epoll_event ev = {0}; 223 270 224 - ev.events = EPOLLIN; 225 - ev.data.fd = 0; // stdin 226 - ret = epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, 0, &ev); 227 - if (ret < 0) { 228 - fprintf(stderr, "ERROR: epoll_ctl(stdin) failed '%i'\n", ret); 229 - return ret; 271 + if (!s->launched_by_socket) { 272 + // Can't do this when launched by systemd socket activation by 273 + // default 274 + ev.events = EPOLLIN; 275 + ev.data.fd = 0; // stdin 276 + ret = epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, 0, &ev); 277 + if (ret < 0) { 278 + fprintf(stderr, "ERROR: epoll_ctl(stdin) failed '%i'\n", 279 + ret); 280 + return ret; 281 + } 230 282 } 231 283 232 284 ev.events = EPOLLIN;