internal static UnameInfo GetUnameInfo()

in JetBrains.HabitatDetector/src/Impl/Unix/UnixHelper.cs [13:47]


    internal static UnameInfo GetUnameInfo()
    {
      var buf = IntPtr.Zero;
      try
      {
        // from sys/utsname.h:
        // struct utsname
        // {
        //   char sysname[NAMELEN or SYS_NMLN];
        //   char nodename[NAMELEN or SYS_NMLN];
        //   char release[NAMELEN or SYS_NMLN];
        //   char version[NAMELEN or SYS_NMLN];
        //   char machine[NAMELEN or SYS_NMLN];
        // };
        const int releaseIndex = 2;
        const int machineIndex = 4;

        buf = Marshal.AllocHGlobal(8192);
        var rc = LibC.uname(buf);
        if (rc != 0)
          throw new Exception("uname() from LibC returned " + rc);

        var sysname = Marshal.PtrToStringAnsi(buf) ?? throw new NullReferenceException();
        var platform = ConvertToPlatform(sysname);
        var nameLen = ConvertToNameLength(platform);
        var release = Marshal.PtrToStringAnsi((nint)buf + releaseIndex * nameLen) ?? throw new NullReferenceException();
        var machine = Marshal.PtrToStringAnsi((nint)buf + machineIndex * nameLen) ?? throw new NullReferenceException();
        return new UnameInfo(platform, sysname, release, ConvertToArchitecture(platform, machine));
      }
      finally
      {
        if (buf != IntPtr.Zero)
          Marshal.FreeHGlobal(buf);
      }
    }