|
Sunshine master
Self-hosted game stream host for Moonlight.
|
Miscellaneous definitions for Linux. More...
#include <cerrno>#include <cstring>#include <fstream>#include <iomanip>#include <iostream>#include <sstream>#include <arpa/inet.h>#include <dlfcn.h>#include <gio/gio.h>#include <ifaddrs.h>#include <netinet/in.h>#include <netinet/udp.h>#include <pwd.h>#include <sys/resource.h>#include <sys/socket.h>#include <sys/capability.h>#include <sys/prctl.h>#include <boost/asio/ip/address.hpp>#include <boost/asio/ip/host_name.hpp>#include <boost/process/v1.hpp>#include <fcntl.h>#include <lizardbyte/common/env.h>#include <unistd.h>#include "graphics.h"#include "misc.h"#include "src/config.h"#include "src/entry_handler.h"#include "src/logging.h"#include "src/platform/common.h"#include "vaapi.h"Classes | |
| class | platf::linux_high_precision_timer |
Linux high-precision timer implementation backed by timerfd. More... | |
| class | platf::qos_t |
| Linux QoS state used to tune socket priority while streaming. More... | |
Typedefs | |
| using | platf::ifaddr_t = util::safe_ptr<ifaddrs, freeifaddrs> |
Owning pointer for getifaddrs results. | |
Enumerations | |
| enum | platf::source::source_e : std::size_t { platf::source::WAYLAND , platf::source::MAX_FLAGS } |
| Enumerates supported source options. More... | |
Functions | |
| void | platf::adjust_thread_priority (thread_priority_e priority) |
| Apply the requested scheduling priority to the current thread. | |
| std::filesystem::path | platf::appdata () |
| Performs migration if necessary, then returns the appdata directory. | |
| std::unique_ptr< high_precision_timer > | platf::create_high_precision_timer () |
| Create platform-specific timer capable of high-precision sleep. | |
| std::shared_ptr< display_t > | platf::display (mem_type_e hwdevice_type, const std::string &display_name, const video::config_t &config) |
| Get the display_t instance for the given hwdevice_type. If display_name is empty, use the first monitor that's compatible you can find If you require to use this parameter in a separate thread, make a copy of it. | |
| std::vector< std::string > | platf::display_names (mem_type_e hwdevice_type) |
| List display names accepted by the selected capture backend. | |
| void | platf::drop_elevated_privileges (bool all_caps) |
| Drop elevated privileges (e.g. system admin/nice etc.) | |
| void | platf::enable_mouse_keys () |
| Enable or disable X11 mouse keys for the current session. | |
| std::unique_ptr< deinit_t > | platf::enable_socket_qos (uintptr_t native_socket, boost::asio::ip::address &address, uint16_t port, qos_data_type_e data_type, bool dscp_tagging) |
| Enable QoS on the given socket for traffic to the specified destination. | |
| std::string | platf::find_render_node_with_display () |
| Find the DRM render node associated with the active display. | |
| std::string | platf::from_sockaddr (const sockaddr *const) |
| Convert a socket address to a printable IP address. | |
| std::pair< std::uint16_t, std::string > | platf::from_sockaddr_ex (const sockaddr *const) |
| Convert a socket address to a port and printable IP address. | |
| std::string | platf::get_host_name () |
| Returns the current computer name in UTF-8. | |
| ifaddr_t | platf::get_ifaddrs () |
| Read the local interface address list. | |
| std::string | platf::get_mac_address (const std::string_view &address) |
| Return the hardware MAC address associated with a network address. | |
| void * | dyn::handle (const std::vector< const char * > &libs) |
| Return the native handle owned by the wrapper. | |
| bool | platf::has_elevated_privileges (bool all_caps) |
| Check is the current process is running with elevated privileges (e.g. system admin/etc.) | |
| std::unique_ptr< deinit_t > | platf::init () |
| Initialize the platform-specific high precision timer. | |
| int | dyn::load (void *handle, const std::vector< std::tuple< apiproc *, const char * > > &funcs, bool strict) |
| Load persisted state from its backing store. | |
| bool | platf::needs_encoder_reenumeration () |
| Check if GPUs/drivers have changed since the last call to this function. | |
| int | platf::open_drm_card_fd (const std::filesystem::path &path, int flags) |
| Open a DRM card node, dropping implicit DRM master when possible. | |
| void | platf::open_url (const std::string &url) |
| Open a url in the default web browser. | |
| bool | platf::process_group_running (std::uintptr_t native_handle) |
| Check if a process group still has running children. | |
| bool | platf::request_process_group_exit (std::uintptr_t native_handle) |
| Attempt to gracefully terminate a process group. | |
| std::string | platf::resolve_render_device () |
| Resolves the render device path to use for hardware encoding. | |
| void | platf::restart () |
| Restart the Sunshine process through the platform launcher. | |
| void | platf::restart_on_exit () |
| Request a Sunshine process restart on exit. | |
| bp::child | platf::run_command (bool elevated, bool interactive, const std::string &cmd, boost::filesystem::path &working_dir, const bp::environment &env, FILE *file, std::error_code &ec, bp::group *group) |
| Run a command on the users profile. | |
| bool | platf::send (send_info_t &send_info) |
| Send the serialized response over the active socket. | |
| bool | platf::send_batch (batched_send_info_t &send_info) |
| Send multiple fixed-size UDP payload blocks using the platform backend. | |
| void | platf::set_thread_name (const std::string &name) |
| Name the current thread for use with development tools. | |
| void | platf::streaming_will_start () |
| Apply Linux platform state before streaming starts. | |
| void | platf::streaming_will_stop () |
| Restore Linux platform state after streaming stops. | |
| struct sockaddr_in | platf::to_sockaddr (boost::asio::ip::address_v4 address, uint16_t port) |
| Convert to sockaddr. | |
| struct sockaddr_in6 | platf::to_sockaddr (boost::asio::ip::address_v6 address, uint16_t port) |
| Convert to sockaddr. | |
| bool | platf::verify_wl () |
| Check whether Wayland capture is available for the current session. | |
| std::shared_ptr< display_t > | platf::wl_display (mem_type_e hwdevice_type, const std::string &display_name, const video::config_t &config) |
| Create a Wayland display capture backend. | |
| std::vector< std::string > | platf::wl_display_names () |
| Enumerate displays available through the Wayland capture backend. | |
Variables | |
| constexpr std::span< const cap_value_t > | platf::ELEVATED_PRIVILEGES_ADMIN {ADMIN_CAPS} |
| Protocol or platform constant for elevated privileges admin. | |
| constexpr std::span< const cap_value_t > | platf::ELEVATED_PRIVILEGES_FULL {FULL_CAPS} |
| Protocol or platform constant for elevated privileges full. | |
| window_system_e | window_system |
| Window system. | |
Miscellaneous definitions for Linux.
| enum platf::source::source_e : std::size_t |
| void platf::adjust_thread_priority | ( | thread_priority_e | priority | ) |
Apply the requested scheduling priority to the current thread.
| priority | Thread priority requested from the platform backend. |
| std::filesystem::path platf::appdata | ( | ) |
Performs migration if necessary, then returns the appdata directory.
This is used for the log directory, so it cannot invoke Boost logging!
| std::unique_ptr< high_precision_timer > platf::create_high_precision_timer | ( | ) |
Create platform-specific timer capable of high-precision sleep.
| std::shared_ptr< display_t > platf::display | ( | platf::mem_type_e | hwdevice_type, |
| const std::string & | display_name, | ||
| const video::config_t & | config ) |
Get the display_t instance for the given hwdevice_type. If display_name is empty, use the first monitor that's compatible you can find If you require to use this parameter in a separate thread, make a copy of it.
| display_name | The name of the monitor that SHOULD be displayed |
| config | Stream configuration |
Pick a display adapter and capture method.
| hwdevice_type | enables possible use of hardware encoder |
| std::vector< std::string > platf::display_names | ( | mem_type_e | hwdevice_type | ) |
List display names accepted by the selected capture backend.
| hwdevice_type | Hardware device type requested for capture or encode. |
| void platf::drop_elevated_privileges | ( | bool | all_caps | ) |
Drop elevated privileges (e.g. system admin/nice etc.)
| all_caps | Bool that specifies whether to drop all caps or only CAP_SYS_ADMIN |
| std::unique_ptr< deinit_t > platf::enable_socket_qos | ( | uintptr_t | native_socket, |
| boost::asio::ip::address & | address, | ||
| uint16_t | port, | ||
| qos_data_type_e | data_type, | ||
| bool | dscp_tagging ) |
Enable QoS on the given socket for traffic to the specified destination.
Enables QoS on the given socket for traffic to the specified destination.
| native_socket | The native socket handle. |
| address | The destination address for traffic sent on this socket. |
| port | The destination port for traffic sent on this socket. |
| data_type | The type of traffic sent on this socket. |
| dscp_tagging | Specifies whether to enable DSCP tagging on outgoing traffic. |
| std::string platf::find_render_node_with_display | ( | ) |
Find the DRM render node associated with the active display.
| std::string platf::from_sockaddr | ( | const sockaddr * const | ip_addr | ) |
Convert a socket address to a printable IP address.
| ip_addr | Socket address to format. |
| std::pair< std::uint16_t, std::string > platf::from_sockaddr_ex | ( | const sockaddr * const | ip_addr | ) |
Convert a socket address to a port and printable IP address.
| ip_addr | Socket address to format. |
| std::string platf::get_host_name | ( | ) |
Returns the current computer name in UTF-8.
| ifaddr_t platf::get_ifaddrs | ( | ) |
Read the local interface address list.
| std::string platf::get_mac_address | ( | const std::string_view & | address | ) |
Return the hardware MAC address associated with a network address.
| address | Network address being parsed or filtered. |
| void * dyn::handle | ( | const std::vector< const char * > & | libs | ) |
Return the native handle owned by the wrapper.
| libs | List of libraries to probe for the requested symbol. |
| bool platf::has_elevated_privileges | ( | bool | all_caps | ) |
Check is the current process is running with elevated privileges (e.g. system admin/etc.)
| all_caps | Bool that specifies whether to check all caps or only CAP_SYS_ADMIN |
|
nodiscard |
Initialize the platform-specific high precision timer.
Initialize the Linux high-precision timer file descriptor.
| int dyn::load | ( | void * | handle, |
| const std::vector< std::tuple< apiproc *, const char * > > & | funcs, | ||
| bool | strict = true ) |
Load persisted state from its backing store.
| handle | Native library or object handle used by the operation. |
| funcs | Function table populated from the loaded library. |
| strict | Whether missing functions should be treated as an error. |
| bool platf::needs_encoder_reenumeration | ( | ) |
Check if GPUs/drivers have changed since the last call to this function.
Check whether DXGI reports that adapter or driver enumeration is stale.
Report whether encoder backends should be probed again before streaming.
true if a change has occurred or if it is unknown whether a change occurred.true because Linux GPU changes are not tracked by this backend.true because macOS GPU changes are not tracked by this backend. | int platf::open_drm_card_fd | ( | const std::filesystem::path & | path, |
| int | flags ) |
Open a DRM card node, dropping implicit DRM master when possible.
Open a DRM card node and drop implicit DRM master, if any.
See misc.h for full documentation. Master check/drop failures are logged as warnings but do not fail the call.
Performs open(path, flags | O_CLOEXEC) and probes the resulting fd with DRM_IOCTL_AUTH_MAGIC. If the kernel implicitly handed us master, calls drmDropMaster and re-verifies before returning. Master check/drop failures are logged as warnings but do not fail the call: the caller still receives a usable fd.
Callers should use this helper for any /dev/dri/cardN open so we never keep implicit master and block compositors from re-acquiring it on VT switches.
| path | Path to the DRM card node (e.g. /dev/dri/card0). |
| flags | open() flags. O_CLOEXEC is always OR-ed in. |
-1 if open() itself fails. | void platf::open_url | ( | const std::string & | url | ) |
Open a url in the default web browser.
| url | The url to open. |
| bool platf::process_group_running | ( | std::uintptr_t | native_handle | ) |
Check if a process group still has running children.
| native_handle | The native handle of the process group. |
true if processes are still running. | bool platf::request_process_group_exit | ( | std::uintptr_t | native_handle | ) |
Attempt to gracefully terminate a process group.
| native_handle | The native handle of the process group. |
true if termination was successfully requested. | std::string platf::resolve_render_device | ( | ) |
Resolves the render device path to use for hardware encoding.
If config::video.adapter_name is set, returns that. Otherwise, auto-detects the GPU with a connected display via find_render_node_with_display(). Falls back to /dev/dri/renderD128 if detection fails.
| bp::child platf::run_command | ( | bool | elevated, |
| bool | interactive, | ||
| const std::string & | cmd, | ||
| boost::filesystem::path & | working_dir, | ||
| const bp::environment & | env, | ||
| FILE * | file, | ||
| std::error_code & | ec, | ||
| bp::group * | group ) |
Run a command on the users profile.
Launches a child process as the user, using the current user's environment and a specific working directory.
| elevated | Specify whether to elevate the process. |
| interactive | Specify whether this will run in a window or hidden. |
| cmd | The command to run. |
| working_dir | The working directory for the new process. |
| env | The environment variables to use for the new process. |
| file | A file object to redirect the child process's output to (may be nullptr). |
| ec | An error code, set to indicate any errors that occur during the launch process. |
| group | A pointer to a bp::group object to which the new process should belong (may be nullptr). |
bp::child object representing the new process, or an empty bp::child object if the launch fails. | bool platf::send | ( | send_info_t & | send_info | ) |
Send the serialized response over the active socket.
| send_info | Socket addresses, buffers, and sizes for the send operation. |
| bool platf::send_batch | ( | batched_send_info_t & | send_info | ) |
Send multiple fixed-size UDP payload blocks using the platform backend.
| send_info | Socket addresses, buffers, and sizes for the send operation. |
| void platf::set_thread_name | ( | const std::string & | name | ) |
Name the current thread for use with development tools.
| name | Human-readable name to assign. |
| SOCKADDR_IN platf::to_sockaddr | ( | boost::asio::ip::address_v4 | address, |
| uint16_t | port ) |
Convert to sockaddr.
| address | Network address being parsed or filtered. |
| port | TCP or UDP port number. |
| SOCKADDR_IN6 platf::to_sockaddr | ( | boost::asio::ip::address_v6 | address, |
| uint16_t | port ) |
Convert to sockaddr.
| address | Network address being parsed or filtered. |
| port | TCP or UDP port number. |
| bool platf::verify_wl | ( | ) |
Check whether Wayland capture is available for the current session.
| std::shared_ptr< display_t > platf::wl_display | ( | mem_type_e | hwdevice_type, |
| const std::string & | display_name, | ||
| const video::config_t & | config ) |
Create a Wayland display capture backend.
Create a Wayland capture backend for the requested memory type.
| hwdevice_type | Hardware device type requested for capture or encode. |
| display_name | Display name. |
| config | Configuration values to apply. |
| std::vector< std::string > platf::wl_display_names | ( | ) |
Enumerate displays available through the Wayland capture backend.
Enumerate capture display names reported by the Wayland compositor.