Unverified Commit c80e750b authored by Jörg Thalheim's avatar Jörg Thalheim Committed by GitHub
Browse files

sunshine: 0.23.1 -> 2025.118.151840 (#375153)

parents 759cb9ce bbc45551
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ import ./make-test-python.nix (
      moonlight.wait_for_console_text("Executing request.*pair")

      # respond to pairing request from sunshine
      sunshine.succeed("curl --fail --insecure -u sunshine:sunshine -d '{\"pin\": \"1234\"}' https://localhost:47990/api/pin")
      sunshine.succeed("curl --fail --insecure -u sunshine:sunshine -d '{\"pin\":\"1234\",\"name\":\"1234\"}' https://localhost:47990/api/pin")

      # wait until pairing is complete
      moonlight.wait_for_console_text("Executing request.*phrase=pairchallenge")
+0 −120
Original line number Diff line number Diff line
From f4f1800f5e67ab59312ccf710695acf06fb4ae26 Mon Sep 17 00:00:00 2001
From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Date: Mon, 1 Jul 2024 10:07:06 -0400
Subject: [PATCH] fix(upnp): support newer miniupnpc library (#2782)

Co-authored-by: Vithorio Polten <reach@vithor.io>
---
 src/upnp.cpp | 30 +++++++++++++++---------------
 src/upnp.h   | 31 ++++++++++++++++++++++++++++++-
 2 files changed, 45 insertions(+), 16 deletions(-)

diff --git a/src/upnp.cpp b/src/upnp.cpp
index f65bcb87..fcbaaeb5 100644
--- a/src/upnp.cpp
+++ b/src/upnp.cpp
@@ -19,19 +19,6 @@
 using namespace std::literals;
 
 namespace upnp {
-  constexpr auto INET6_ADDRESS_STRLEN = 46;
-
-  constexpr auto PORT_MAPPING_LIFETIME = 3600s;
-  constexpr auto REFRESH_INTERVAL = 120s;
-
-  constexpr auto IPv4 = 0;
-  constexpr auto IPv6 = 1;
-
-  using device_t = util::safe_ptr<UPNPDev, freeUPNPDevlist>;
-
-  KITTY_USING_MOVE_T(urls_t, UPNPUrls, , {
-    FreeUPNPUrls(&el);
-  });
 
   struct mapping_t {
     struct {
@@ -59,6 +46,19 @@ namespace upnp {
     return "Unknown status"sv;
   }
 
+  /**
+   * This function is a wrapper around UPNP_GetValidIGD() that returns the status code. There is a pre-processor
+   * check to determine which version of the function to call based on the version of the MiniUPnPc library.
+   */
+  int
+  UPNP_GetValidIGDStatus(device_t &device, urls_t *urls, IGDdatas *data, std::array<char, INET6_ADDRESS_STRLEN> &lan_addr) {
+#if (MINIUPNPC_API_VERSION >= 18)
+    return UPNP_GetValidIGD(device.get(), &urls->el, data, lan_addr.data(), lan_addr.size(), nullptr, 0);
+#else
+    return UPNP_GetValidIGD(device.get(), &urls->el, data, lan_addr.data(), lan_addr.size());
+#endif
+  }
+
   class deinit_t: public platf::deinit_t {
   public:
     deinit_t() {
@@ -109,7 +109,7 @@ namespace upnp {
       IGDdatas data;
       urls_t urls;
       std::array<char, INET6_ADDRESS_STRLEN> lan_addr;
-      auto status = UPNP_GetValidIGD(device.get(), &urls.el, &data, lan_addr.data(), lan_addr.size());
+      auto status = upnp::UPNP_GetValidIGDStatus(device, &urls, &data, lan_addr);
       if (status != 1 && status != 2) {
         BOOST_LOG(debug) << "No valid IPv6 IGD: "sv << status_string(status);
         return false;
@@ -331,7 +331,7 @@ namespace upnp {
         std::array<char, INET6_ADDRESS_STRLEN> lan_addr;
 
         urls_t urls;
-        auto status = UPNP_GetValidIGD(device.get(), &urls.el, &data, lan_addr.data(), lan_addr.size());
+        auto status = upnp::UPNP_GetValidIGDStatus(device, &urls, &data, lan_addr);
         if (status != 1 && status != 2) {
           BOOST_LOG(error) << status_string(status);
           mapped = false;
diff --git a/src/upnp.h b/src/upnp.h
index 73fc4f79..4b2e3296 100644
--- a/src/upnp.h
+++ b/src/upnp.h
@@ -4,9 +4,38 @@
  */
 #pragma once
 
+#include <miniupnpc/miniupnpc.h>
+
 #include "platform/common.h"
 
 namespace upnp {
+  constexpr auto INET6_ADDRESS_STRLEN = 46;
+  constexpr auto IPv4 = 0;
+  constexpr auto IPv6 = 1;
+  constexpr auto PORT_MAPPING_LIFETIME = 3600s;
+  constexpr auto REFRESH_INTERVAL = 120s;
+
+  using device_t = util::safe_ptr<UPNPDev, freeUPNPDevlist>;
+
+  KITTY_USING_MOVE_T(urls_t, UPNPUrls, , {
+    FreeUPNPUrls(&el);
+  });
+
+  /**
+   * @brief Get the valid IGD status.
+   * @param device The device.
+   * @param urls The URLs.
+   * @param data The IGD data.
+   * @param lan_addr The LAN address.
+   * @return The UPnP Status.
+   * @retval 0 No IGD found.
+   * @retval 1 A valid connected IGD has been found.
+   * @retval 2 A valid IGD has been found but it reported as not connected.
+   * @retval 3 An UPnP device has been found but was not recognized as an IGD.
+   */
+  int
+  UPNP_GetValidIGDStatus(device_t &device, urls_t *urls, IGDdatas *data, std::array<char, INET6_ADDRESS_STRLEN> &lan_addr);
+
   [[nodiscard]] std::unique_ptr<platf::deinit_t>
   start();
-}
+}  // namespace upnp
-- 
2.45.2
+0 −191
Original line number Diff line number Diff line
port of https://github.com/LizardByte/Sunshine/commit/e90b71ce62b7744bb18ffc7823b1e895786ffb0a

diff --git a/src/platform/common.h b/src/platform/common.h
index 007f7ec..498becb 100644
--- a/src/platform/common.h
+++ b/src/platform/common.h
@@ -39,13 +39,13 @@ namespace boost {
   namespace filesystem {
     class path;
   }
-  namespace process {
+  namespace process::inline v1 {
     class child;
     class group;
     template <typename Char>
     class basic_environment;
     typedef basic_environment<char> environment;
-  }  // namespace process
+  }  // namespace process::inline v1
 }  // namespace boost
 namespace video {
   struct config_t;
@@ -585,8 +585,8 @@ namespace platf {
   bool
   needs_encoder_reenumeration();
 
-  boost::process::child
-  run_command(bool elevated, bool interactive, const std::string &cmd, boost::filesystem::path &working_dir, const boost::process::environment &env, FILE *file, std::error_code &ec, boost::process::group *group);
+  boost::process::v1::child
+  run_command(bool elevated, bool interactive, const std::string &cmd, boost::filesystem::path &working_dir, const boost::process::v1::environment &env, FILE *file, std::error_code &ec, boost::process::v1::group *group);
 
   enum class thread_priority_e : int {
     low,
diff --git a/src/platform/linux/misc.cpp b/src/platform/linux/misc.cpp
index 980c080..49a884c 100644
--- a/src/platform/linux/misc.cpp
+++ b/src/platform/linux/misc.cpp
@@ -15,7 +15,7 @@
 // lib includes
 #include <arpa/inet.h>
 #include <boost/asio/ip/address.hpp>
-#include <boost/process.hpp>
+#include <boost/process/v1.hpp>
 #include <dlfcn.h>
 #include <fcntl.h>
 #include <ifaddrs.h>
@@ -269,7 +269,7 @@ namespace platf {
     auto working_dir = boost::filesystem::path(std::getenv("HOME"));
     std::string cmd = R"(xdg-open ")" + url + R"(")";
 
-    boost::process::environment _env = boost::this_process::environment();
+    boost::process::v1::environment _env = boost::this_process::environment();
     std::error_code ec;
     auto child = run_command(false, false, cmd, working_dir, _env, nullptr, ec, nullptr);
     if (ec) {
diff --git a/src/platform/macos/misc.mm b/src/platform/macos/misc.mm
index 20c2247..0415d13 100644
--- a/src/platform/macos/misc.mm
+++ b/src/platform/macos/misc.mm
@@ -23,7 +23,7 @@
 #include "src/platform/common.h"
 
 #include <boost/asio/ip/address.hpp>
-#include <boost/process.hpp>
+#include <boost/process/v1.hpp>
 
 using namespace std::literals;
 namespace fs = std::filesystem;
@@ -197,7 +197,7 @@ namespace platf {
     boost::filesystem::path working_dir;
     std::string cmd = R"(open ")" + url + R"(")";
 
-    boost::process::environment _env = boost::this_process::environment();
+    boost::process::v1::environment _env = boost::this_process::environment();
     std::error_code ec;
     auto child = run_command(false, false, cmd, working_dir, _env, nullptr, ec, nullptr);
     if (ec) {
diff --git a/src/process.cpp b/src/process.cpp
index 89dc4dc..83a73ff 100644
--- a/src/process.cpp
+++ b/src/process.cpp
@@ -40,7 +40,6 @@
 
 namespace proc {
   using namespace std::literals;
-  namespace bp = boost::process;
   namespace pt = boost::property_tree;
 
   proc_t proc;
@@ -68,7 +67,7 @@ namespace proc {
    * @param exit_timeout The timeout to wait for the process group to gracefully exit.
    */
   void
-  terminate_process_group(bp::child &proc, bp::group &group, std::chrono::seconds exit_timeout) {
+  terminate_process_group(boost::process::v1::child &proc, boost::process::v1::group &group, std::chrono::seconds exit_timeout) {
     if (group.valid() && platf::process_group_running((std::uintptr_t) group.native_handle())) {
       if (exit_timeout.count() > 0) {
         // Request processes in the group to exit gracefully
@@ -109,7 +108,7 @@ namespace proc {
   }
 
   boost::filesystem::path
-  find_working_directory(const std::string &cmd, bp::environment &env) {
+  find_working_directory(const std::string &cmd, boost::process::v1::environment &env) {
     // Parse the raw command string into parts to get the actual command portion
 #ifdef _WIN32
     auto parts = boost::program_options::split_winmain(cmd);
@@ -131,7 +130,7 @@ namespace proc {
     // If the cmd path is not an absolute path, resolve it using our PATH variable
     boost::filesystem::path cmd_path(parts.at(0));
     if (!cmd_path.is_absolute()) {
-      cmd_path = boost::process::search_path(parts.at(0));
+      cmd_path = boost::process::v1::search_path(parts.at(0));
       if (cmd_path.empty()) {
         BOOST_LOG(error) << "Unable to find executable ["sv << parts.at(0) << "]. Is it in your PATH?"sv;
         return boost::filesystem::path();
@@ -311,8 +310,8 @@ namespace proc {
     std::error_code ec;
     placebo = false;
     terminate_process_group(_process, _process_group, _app.exit_timeout);
-    _process = bp::child();
-    _process_group = bp::group();
+    _process = boost::process::v1::child();
+    _process_group = boost::process::v1::group();
 
     for (; _app_prep_it != _app_prep_begin; --_app_prep_it) {
       auto &cmd = *(_app_prep_it - 1);
@@ -413,7 +412,7 @@ namespace proc {
   }
 
   std::string
-  parse_env_val(bp::native_environment &env, const std::string_view &val_raw) {
+  parse_env_val(boost::process::v1::native_environment &env, const std::string_view &val_raw) {
     auto pos = std::begin(val_raw);
     auto dollar = std::find(pos, std::end(val_raw), '$');
 
diff --git a/src/process.h b/src/process.h
index c875499..0344c1c 100644
--- a/src/process.h
+++ b/src/process.h
@@ -11,7 +11,7 @@
 #include <optional>
 #include <unordered_map>
 
-#include <boost/process.hpp>
+#include <boost/process/v1.hpp>
 
 #include "config.h"
 #include "platform/common.h"
@@ -68,7 +68,7 @@ namespace proc {
     KITTY_DEFAULT_CONSTR_MOVE_THROW(proc_t)
 
     proc_t(
-      boost::process::environment &&env,
+      boost::process::v1::environment &&env,
       std::vector<ctx_t> &&apps):
         _app_id(0),
         _env(std::move(env)),
@@ -99,7 +99,7 @@ namespace proc {
   private:
     int _app_id;
 
-    boost::process::environment _env;
+    boost::process::v1::environment _env;
     std::vector<ctx_t> _apps;
     ctx_t _app;
     std::chrono::steady_clock::time_point _app_launch_time;
@@ -107,8 +107,8 @@ namespace proc {
     // If no command associated with _app_id, yet it's still running
     bool placebo {};
 
-    boost::process::child _process;
-    boost::process::group _process_group;
+    boost::process::v1::child _process;
+    boost::process::v1::group _process_group;
 
     file_t _pipe;
     std::vector<cmd_t>::const_iterator _app_prep_it;
diff --git a/src/system_tray.cpp b/src/system_tray.cpp
index c34c3d7..17e1c0f 100644
--- a/src/system_tray.cpp
+++ b/src/system_tray.cpp
@@ -33,7 +33,7 @@
   // lib includes
   #include "tray/tray.h"
   #include <boost/filesystem.hpp>
-  #include <boost/process/environment.hpp>
+  #include <boost/process/v1/environment.hpp>
 
   // local includes
   #include "confighttp.h"
+1291 −131

File changed.

Preview size limit exceeded, changes collapsed.

+34 −20
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@
  libappindicator,
  libnotify,
  miniupnpc,
  nlohmann_json,
  config,
  cudaSupport ? config.cudaSupport,
  cudaPackages ? { },
@@ -54,31 +55,21 @@ let
in
stdenv'.mkDerivation rec {
  pname = "sunshine";
  version = "0.23.1";
  version = "2025.118.151840";

  src = fetchFromGitHub {
    owner = "LizardByte";
    repo = "Sunshine";
    rev = "v${version}";
    hash = "sha256-D5ee5m2ZTKVqZDH07nzJuFEbZBQ4xW7m4nYnJQe0EaA=";
    tag = "v${version}";
    hash = "sha256-sTZUHc1385qOmy2w3fjItIidCxnWeEjAaOFxfLBB65c=";
    fetchSubmodules = true;
  };

  patches = [
    # fix(upnp): support newer miniupnpc library (#2782)
    # Manually cherry-picked on to 0.23.1.
    ./0001-fix-upnp-support-newer-miniupnpc-library-2782.patch

    # port of https://github.com/LizardByte/Sunshine/commit/e90b71ce62b7744bb18ffc7823b1e895786ffb0a
    # remove on update
    ./boost-186.patch
  ];

  # build webui
  ui = buildNpmPackage {
    inherit src version;
    pname = "sunshine-ui";
    npmDepsHash = "sha256-9FuMtxTwrU9UIhZXQn/tmGN0IHZBdunV0cY/EElj4bA=";
    npmDepsHash = "sha256-sWCmx1dMEyRyuYeeuqAjHZLVnckskgQO4saFM64s4Y4=";

    # use generated package-lock.json as upstream does not provide one
    postPatch = ''
@@ -145,6 +136,7 @@ stdenv'.mkDerivation rec {
      libappindicator
      libnotify
      miniupnpc
      nlohmann_json
    ]
    ++ lib.optionals cudaSupport [
      cudaPackages.cudatoolkit
@@ -161,19 +153,41 @@ stdenv'.mkDerivation rec {
    libglvnd
  ];

  cmakeFlags = [
  cmakeFlags =
    [
      "-Wno-dev"
      # upstream tries to use systemd and udev packages to find these directories in FHS; set the paths explicitly instead
      (lib.cmakeBool "UDEV_FOUND" true)
      (lib.cmakeBool "SYSTEMD_FOUND" true)
      (lib.cmakeFeature "UDEV_RULES_INSTALL_DIR" "lib/udev/rules.d")
      (lib.cmakeFeature "SYSTEMD_USER_UNIT_INSTALL_DIR" "lib/systemd/user")
      (lib.cmakeBool "BOOST_USE_STATIC" false)
      (lib.cmakeBool "BUILD_DOCS" false)
      (lib.cmakeFeature "SUNSHINE_PUBLISHER_NAME" "nixpkgs")
      (lib.cmakeFeature "SUNSHINE_PUBLISHER_WEBSITE" "https://nixos.org")
      (lib.cmakeFeature "SUNSHINE_PUBLISHER_ISSUE_URL" "https://github.com/NixOS/nixpkgs/issues")
    ]
    ++ lib.optionals (!cudaSupport) [
      (lib.cmakeBool "SUNSHINE_ENABLE_CUDA" false)
    ];

  env = {
    # needed to trigger CMake version configuration
    BUILD_VERSION = "${version}";
    BRANCH = "master";
    COMMIT = "";
  };

  postPatch = ''
    # remove upstream dependency on systemd and udev
    substituteInPlace cmake/packaging/linux.cmake \
      --replace-fail 'find_package(Systemd)' "" \
      --replace-fail 'find_package(Udev)' ""

    # don't look for npm since we build webui separately
    substituteInPlace cmake/targets/common.cmake \
      --replace-fail 'find_program(NPM npm REQUIRED)' ""

    substituteInPlace packaging/linux/sunshine.desktop \
      --subst-var-by PROJECT_NAME 'Sunshine' \
      --subst-var-by PROJECT_DESCRIPTION 'Self-hosted game stream host for Moonlight' \
Loading