OperatingSystem.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #pragma warning disable CS1591
  2. using System;
  3. using System.Runtime.InteropServices;
  4. using System.Threading;
  5. using MediaBrowser.Model.System;
  6. namespace MediaBrowser.Common.System
  7. {
  8. public static class OperatingSystem
  9. {
  10. // We can't use Interlocked.CompareExchange for enums
  11. private static int _id = int.MaxValue;
  12. public static OperatingSystemId Id
  13. {
  14. get
  15. {
  16. if (_id == int.MaxValue)
  17. {
  18. Interlocked.CompareExchange(ref _id, (int)GetId(), int.MaxValue);
  19. }
  20. return (OperatingSystemId)_id;
  21. }
  22. }
  23. public static string Name
  24. {
  25. get
  26. {
  27. switch (Id)
  28. {
  29. case OperatingSystemId.BSD: return "BSD";
  30. case OperatingSystemId.Linux: return "Linux";
  31. case OperatingSystemId.Darwin: return "macOS";
  32. case OperatingSystemId.Windows: return "Windows";
  33. default: throw new PlatformNotSupportedException($"Unknown OS {Id}");
  34. }
  35. }
  36. }
  37. private static OperatingSystemId GetId()
  38. {
  39. switch (Environment.OSVersion.Platform)
  40. {
  41. // On .NET Core `MacOSX` got replaced by `Unix`, this case should never be hit.
  42. case PlatformID.MacOSX:
  43. return OperatingSystemId.Darwin;
  44. case PlatformID.Win32NT:
  45. return OperatingSystemId.Windows;
  46. case PlatformID.Unix:
  47. default:
  48. {
  49. string osDescription = RuntimeInformation.OSDescription;
  50. if (osDescription.Contains("linux", StringComparison.OrdinalIgnoreCase))
  51. {
  52. return OperatingSystemId.Linux;
  53. }
  54. else if (osDescription.Contains("darwin", StringComparison.OrdinalIgnoreCase))
  55. {
  56. return OperatingSystemId.Darwin;
  57. }
  58. else if (osDescription.Contains("bsd", StringComparison.OrdinalIgnoreCase))
  59. {
  60. return OperatingSystemId.BSD;
  61. }
  62. throw new PlatformNotSupportedException($"Can't resolve OS with description: '{osDescription}'");
  63. }
  64. }
  65. }
  66. }
  67. }