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);
}
}