using System.Runtime.InteropServices; namespace Terminal.Gui.Drivers; internal static class Platform { private static int _suspendSignal; /// Suspends the process by sending SIGTSTP to itself /// True if the suspension was successful. public static bool Suspend () { int signal = GetSuspendSignal (); if (signal == -1) { return false; } killpg (0, signal); return true; } private static int GetSuspendSignal () { if (_suspendSignal != 0) { return _suspendSignal; } nint buf = Marshal.AllocHGlobal (8192); if (uname (buf) != 0) { Marshal.FreeHGlobal (buf); _suspendSignal = -1; return _suspendSignal; } try { switch (Marshal.PtrToStringAnsi (buf)) { case "Darwin": case "DragonFly": case "FreeBSD": case "NetBSD": case "OpenBSD": _suspendSignal = 18; break; case "Linux": // TODO: should fetch the machine name and // if it is MIPS return 24 _suspendSignal = 20; break; case "Solaris": _suspendSignal = 24; break; default: _suspendSignal = -1; break; } return _suspendSignal; } finally { Marshal.FreeHGlobal (buf); } } [DllImport ("libc")] private static extern int killpg (int pgrp, int pid); [DllImport ("libc")] private static extern int uname (nint buf); }