Ivo@0: using System; Ivo@0: using System.Reflection; Ivo@0: using System.Runtime.InteropServices; Ivo@0: Ivo@0: namespace ConsoleApplication1 { Ivo@0: class ProgramLoader { Ivo@0: [DllImport("/usr/lib/virtualbox/VBoxXPCOMC.so")] Ivo@0: private static extern Int32 RTR3InitAndSUPLib(); Ivo@0: Ivo@0: static unsafe int Main(string[] args) { Ivo@0: if (Environment.OSVersion.Platform == PlatformID.Unix) { Ivo@0: Console.WriteLine("UNIX based OS detected, doing some magic..."); Ivo@0: int init = RTR3InitAndSUPLib(); Ivo@0: if (init != 0) throw new COMException("Failed to initialize VirtualBox driver", init); Ivo@0: Unix_setuid(); Ivo@0: Assembly.LoadFile("Interop.VirtualBox.XPCOM.dll"); Ivo@0: } Ivo@0: return Main2(args); Ivo@0: } Ivo@0: Ivo@0: static int Main2(String[] args) { Ivo@0: ProgramRun p = new ProgramRun(); Ivo@0: return p.Run(args); Ivo@0: } Ivo@0: Ivo@0: private static void Unix_setuid() { Ivo@0: uint uid = Mono.Unix.Native.Syscall.getuid(); Ivo@0: uint euid = Mono.Unix.Native.Syscall.geteuid(); Ivo@3: uint gid = Mono.Unix.Native.Syscall.getgid(); Ivo@3: uint egid = Mono.Unix.Native.Syscall.getegid(); Ivo@3: Console.WriteLine("Running as user {0} effective {1} group {2} effective {3}", uid, euid, gid, egid); Ivo@3: if (gid != egid) { Ivo@3: Console.WriteLine("Set group ID: {0}", gid); Ivo@3: Mono.Unix.Native.Syscall.setregid(gid, gid); Ivo@3: } Ivo@0: if (uid != euid) { Ivo@0: Console.WriteLine("Set user ID: {0}", uid); Ivo@0: Mono.Unix.Native.Syscall.setreuid(uid, uid); Ivo@0: } Ivo@0: } Ivo@0: } Ivo@0: }