From 33b63b35a22469b8b61c62be4479d2e5c1593fea Mon Sep 17 00:00:00 2001
From: Vojtech Bubnik <bubnikv@gmail.com>
Date: Thu, 11 Mar 2021 16:15:22 +0100
Subject: [PATCH] Added detection of Microsoft WSL/WSL2 Linux flavors. Added
 tracing of the platform detection.

---
 src/slic3r/Utils/Platform.cpp | 23 +++++++++++++++++++++--
 src/slic3r/Utils/Platform.hpp |  4 ++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/src/slic3r/Utils/Platform.cpp b/src/slic3r/Utils/Platform.cpp
index 86f4d7965..09ff2c48b 100644
--- a/src/slic3r/Utils/Platform.cpp
+++ b/src/slic3r/Utils/Platform.cpp
@@ -6,6 +6,8 @@
 
 #include <wx/stdpaths.h>
 
+#include <boost/log/trivial.hpp>
+
 namespace Slic3r {
 namespace GUI {
 
@@ -15,12 +17,15 @@ static auto s_platform_flavor = PlatformFlavor::Uninitialized;
 void detect_platform()
 {
 #if defined(_WIN32)
+    BOOST_LOG_TRIVIAL(info) << "Platform: Windows";
 	s_platform 		  = Platform::Windows;
 	s_platform_flavor = PlatformFlavor::Generic;
 #elif defined(__APPLE__)
+    BOOST_LOG_TRIVIAL(info) << "Platform: OSX";
 	s_platform 		  = Platform::OSX;
 	s_platform_flavor = PlatformFlavor::Generic;
 #elif defined(__linux__)
+    BOOST_LOG_TRIVIAL(info) << "Platform: Linux";
 	s_platform 		  = Platform::Linux;
 	s_platform_flavor = PlatformFlavor::GenericLinux;
 	// Test for Chromium.
@@ -29,16 +34,30 @@ void detect_platform()
 		if (f) {
 			char buf[4096];
 			// Read the 1st line.
-			if (::fgets(buf, 4096, f) && strstr(buf, "Chromium OS") != nullptr)
-				s_platform_flavor = PlatformFlavor::LinuxOnChromium;
+			if (::fgets(buf, 4096, f))
+				if (strstr(buf, "Chromium OS") != nullptr) {
+					s_platform_flavor = PlatformFlavor::LinuxOnChromium;
+				    BOOST_LOG_TRIVIAL(info) << "Platform flavor: LinuxOnChromium";
+				} else if (strstr(buf, "microsoft") != nullptr || strstr(buf, "Microsoft") != nullptr) {
+					if (boost::filesystem::exists("/run/WSL") && getenv("WSL_INTEROP") != nullptr) {
+						BOOST_LOG_TRIVIAL(info) << "Platform flavor: WSL2";
+						s_platform_flavor = PlatformFlavor::WSL2;
+					} else {
+						BOOST_LOG_TRIVIAL(info) << "Platform flavor: WSL";
+						s_platform_flavor = PlatformFlavor::WSL;
+					}
+				}
+			}
 			::fclose(f);
 		}
 	}
 #elif defined(__OpenBSD__)
+    BOOST_LOG_TRIVIAL(info) << "Platform: OpenBSD";
 	s_platform 		  = Platform::BSDUnix;
 	s_platform_flavor = PlatformFlavor::OpenBSD;
 #else
 	// This should not happen.
+    BOOST_LOG_TRIVIAL(info) << "Platform: Unknown";
 	static_assert(false, "Unknown platform detected");
 	s_platform 		  = Platform::Unknown;
 	s_platform_flavor = PlatformFlavor::Unknown;
diff --git a/src/slic3r/Utils/Platform.hpp b/src/slic3r/Utils/Platform.hpp
index 8298cf3f9..c0ee3541d 100644
--- a/src/slic3r/Utils/Platform.hpp
+++ b/src/slic3r/Utils/Platform.hpp
@@ -23,6 +23,10 @@ enum class PlatformFlavor
 	// For Platform::Linux
 	GenericLinux,
 	LinuxOnChromium,
+	// Microsoft's Windows on Linux (Linux kernel simulated on NTFS kernel)
+	WSL,
+	// Microsoft's Windows on Linux, version 2 (virtual machine)
+	WSL2,
 	// For Platform::BSDUnix
 	OpenBSD,
 };